All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ido Schimmel <idosch@idosch.org>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, dsahern@gmail.com, jiri@mellanox.com,
	alexpe@mellanox.com, mlxsw@mellanox.com,
	Ido Schimmel <idosch@mellanox.com>
Subject: [PATCH net-next 11/17] mlxsw: spectrum_router: Pass multiple routes to work item
Date: Sat, 15 Jun 2019 17:07:45 +0300	[thread overview]
Message-ID: <20190615140751.17661-12-idosch@idosch.org> (raw)
In-Reply-To: <20190615140751.17661-1-idosch@idosch.org>

From: Ido Schimmel <idosch@mellanox.com>

Prepare the driver to process IPv6 multipath notifications by passing an
array of 'struct fib6_info' instead of just one route.

A reference is taken on each sibling route in order to prevent them from
being freed until they are processed by the workqueue.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
---
 .../ethernet/mellanox/mlxsw/spectrum_router.c | 73 +++++++++++++++++--
 1 file changed, 66 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 0fdd516b027a..1f96621eb219 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -5826,10 +5826,15 @@ static void mlxsw_sp_router_fib_abort(struct mlxsw_sp *mlxsw_sp)
 		dev_warn(mlxsw_sp->bus_info->dev, "Failed to set abort trap.\n");
 }
 
+struct mlxsw_sp_fib6_event_work {
+	struct fib6_info **rt_arr;
+	unsigned int nrt6;
+};
+
 struct mlxsw_sp_fib_event_work {
 	struct work_struct work;
 	union {
-		struct fib6_entry_notifier_info fen6_info;
+		struct mlxsw_sp_fib6_event_work fib6_work;
 		struct fib_entry_notifier_info fen_info;
 		struct fib_rule_notifier_info fr_info;
 		struct fib_nh_notifier_info fnh_info;
@@ -5840,6 +5845,55 @@ struct mlxsw_sp_fib_event_work {
 	unsigned long event;
 };
 
+static int
+mlxsw_sp_router_fib6_work_init(struct mlxsw_sp_fib6_event_work *fib6_work,
+			       struct fib6_entry_notifier_info *fen6_info)
+{
+	struct fib6_info *rt = fen6_info->rt;
+	struct fib6_info **rt_arr;
+	struct fib6_info *iter;
+	unsigned int nrt6 = 1;
+	int i = 0;
+
+	if (fen6_info->multipath_rt)
+		nrt6 = fen6_info->nsiblings + 1;
+
+	rt_arr = kcalloc(nrt6, sizeof(struct fib6_info *), GFP_ATOMIC);
+	if (!rt_arr)
+		return -ENOMEM;
+
+	fib6_work->rt_arr = rt_arr;
+	fib6_work->nrt6 = nrt6;
+
+	rt_arr[0] = rt;
+	fib6_info_hold(rt);
+
+	if (!fen6_info->multipath_rt)
+		return 0;
+
+	list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings) {
+		if (i == fen6_info->nsiblings)
+			break;
+
+		rt_arr[i + 1] = iter;
+		fib6_info_hold(iter);
+		i++;
+	}
+	WARN_ON_ONCE(i != fen6_info->nsiblings);
+
+	return 0;
+}
+
+static void
+mlxsw_sp_router_fib6_work_fini(struct mlxsw_sp_fib6_event_work *fib6_work)
+{
+	int i;
+
+	for (i = 0; i < fib6_work->nrt6; i++)
+		mlxsw_sp_rt6_release(fib6_work->rt_arr[i]);
+	kfree(fib6_work->rt_arr);
+}
+
 static void mlxsw_sp_router_fib4_event_work(struct work_struct *work)
 {
 	struct mlxsw_sp_fib_event_work *fib_work =
@@ -5901,14 +5955,16 @@ static void mlxsw_sp_router_fib6_event_work(struct work_struct *work)
 	case FIB_EVENT_ENTRY_ADD:
 		replace = fib_work->event == FIB_EVENT_ENTRY_REPLACE;
 		err = mlxsw_sp_router_fib6_add(mlxsw_sp,
-					       fib_work->fen6_info.rt, replace);
+					       fib_work->fib6_work.rt_arr[0],
+					       replace);
 		if (err)
 			mlxsw_sp_router_fib_abort(mlxsw_sp);
-		mlxsw_sp_rt6_release(fib_work->fen6_info.rt);
+		mlxsw_sp_router_fib6_work_fini(&fib_work->fib6_work);
 		break;
 	case FIB_EVENT_ENTRY_DEL:
-		mlxsw_sp_router_fib6_del(mlxsw_sp, fib_work->fen6_info.rt);
-		mlxsw_sp_rt6_release(fib_work->fen6_info.rt);
+		mlxsw_sp_router_fib6_del(mlxsw_sp,
+					 fib_work->fib6_work.rt_arr[0]);
+		mlxsw_sp_router_fib6_work_fini(&fib_work->fib6_work);
 		break;
 	case FIB_EVENT_RULE_ADD:
 		/* if we get here, a rule was added that we do not support.
@@ -6001,6 +6057,7 @@ static int mlxsw_sp_router_fib6_event(struct mlxsw_sp_fib_event_work *fib_work,
 				      struct fib_notifier_info *info)
 {
 	struct fib6_entry_notifier_info *fen6_info;
+	int err;
 
 	switch (fib_work->event) {
 	case FIB_EVENT_ENTRY_REPLACE: /* fall through */
@@ -6008,8 +6065,10 @@ static int mlxsw_sp_router_fib6_event(struct mlxsw_sp_fib_event_work *fib_work,
 	case FIB_EVENT_ENTRY_DEL:
 		fen6_info = container_of(info, struct fib6_entry_notifier_info,
 					 info);
-		fib_work->fen6_info = *fen6_info;
-		fib6_info_hold(fib_work->fen6_info.rt);
+		err = mlxsw_sp_router_fib6_work_init(&fib_work->fib6_work,
+						     fen6_info);
+		if (err)
+			return err;
 		break;
 	}
 
-- 
2.20.1


  parent reply	other threads:[~2019-06-15 14:09 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-15 14:07 [PATCH net-next 00/17] mlxsw: Improve IPv6 route insertion rate Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 01/17] netlink: Document all fields of 'struct nl_info' Ido Schimmel
2019-06-17  1:16   ` David Ahern
2019-06-15 14:07 ` [PATCH net-next 02/17] netlink: Add field to skip in-kernel notifications Ido Schimmel
2019-06-17  1:17   ` David Ahern
2019-06-17  6:37     ` Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 03/17] ipv6: Extend notifier info for multipath routes Ido Schimmel
2019-06-17  1:22   ` David Ahern
2019-06-17  6:46     ` Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 04/17] mlxsw: spectrum_router: Ignore IPv6 multipath notifications Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 05/17] netdevsim: " Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 06/17] ipv6: Add IPv6 multipath notifications for add / replace Ido Schimmel
2019-06-17 13:01   ` David Ahern
2019-06-15 14:07 ` [PATCH net-next 07/17] ipv6: Add IPv6 multipath notification for route delete Ido Schimmel
2019-06-17 13:03   ` David Ahern
2019-06-15 14:07 ` [PATCH net-next 08/17] netdevsim: Adjust accounting for IPv6 multipath notifications Ido Schimmel
2019-06-17  1:27   ` David Ahern
2019-06-17  6:49     ` Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 09/17] mlxsw: spectrum_router: Remove processing of IPv6 append notifications Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 10/17] mlxsw: spectrum_router: Prepare function to return errors Ido Schimmel
2019-06-15 14:07 ` Ido Schimmel [this message]
2019-06-15 14:07 ` [PATCH net-next 12/17] mlxsw: spectrum_router: Adjust IPv6 replace logic to new notifications Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 13/17] mlxsw: spectrum_router: Pass array of routes to route handling functions Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 14/17] mlxsw: spectrum_router: Add / delete multiple IPv6 nexthops Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 15/17] mlxsw: spectrum_router: Create IPv6 multipath routes in one go Ido Schimmel
2019-06-15 14:07 ` [PATCH net-next 16/17] ipv6: Stop sending in-kernel notifications for each nexthop Ido Schimmel
2019-06-17 13:06   ` David Ahern
2019-06-15 14:07 ` [PATCH net-next 17/17] selftests: mlxsw: Add a test for FIB offload indication Ido Schimmel
2019-06-16 21:04 ` [PATCH net-next 00/17] mlxsw: Improve IPv6 route insertion rate David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190615140751.17661-12-idosch@idosch.org \
    --to=idosch@idosch.org \
    --cc=alexpe@mellanox.com \
    --cc=davem@davemloft.net \
    --cc=dsahern@gmail.com \
    --cc=idosch@mellanox.com \
    --cc=jiri@mellanox.com \
    --cc=mlxsw@mellanox.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.