netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] net: Move destructor from neigh->ops to neigh_params
@ 2006-01-23 21:27 Roland Dreier
  2006-01-23 21:54 ` David S. Miller
                   ` (2 more replies)
  0 siblings, 3 replies; 20+ messages in thread
From: Roland Dreier @ 2006-01-23 21:27 UTC (permalink / raw)
  To: davem; +Cc: netdev, openib-general

This is a resend of a patch written by Michael S. Tsirkin
<mst@mellanox.co.il>.  I'd like to get an ACK or NAK of it from Dave
and other networking people, so that we can either merge it upstream
or try a different approach.  There definitely is a problem with
neighbour destructors that IP-over-IB is running into.

It would be good to know what the design was behind putting the
destructor method in neigh->ops in the first place.

Dave, if you want to merge this directly, that's fine.  Or I'm fine
with merging this through the IB tree if you'd prefer (if you want me
to do that, let me know if you think it's 2.6.16 material).

Thanks,
  Roland



struct neigh_ops currently has a destructor field, which no in-kernel
drivers outside of infiniband use.  The infiniband/ulp/ipoib in-tree
driver stashes some info in the neighbour structure (the results of
the second-stage lookup from ARP results to real link-level path), and
it uses neigh->ops->destructor to get a callback so it can clean up
this extra info when a neighbour is freed.  We've run into problems
with this: since the destructor is in an ops field that is shared
between neighbours that may belong to different net devices, there's
no way to set/clear it safely.

The following patch moves this field to neigh_parms where it can be
safely set, together with its twin neigh_setup.  Two additional
patches in the patch series update ipoib to use this new interface.

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

---

diff --git a/include/net/neighbour.h b/include/net/neighbour.h
index 6fa9ae1..b0666d6 100644
--- a/include/net/neighbour.h
+++ b/include/net/neighbour.h
@@ -68,6 +68,7 @@ struct neigh_parms
 	struct net_device *dev;
 	struct neigh_parms *next;
 	int	(*neigh_setup)(struct neighbour *);
+	void	(*neigh_destructor)(struct neighbour *);
 	struct neigh_table *tbl;
 
 	void	*sysctl_table;
@@ -145,7 +146,6 @@ struct neighbour
 struct neigh_ops
 {
 	int			family;
-	void			(*destructor)(struct neighbour *);
 	void			(*solicit)(struct neighbour *, struct sk_buff*);
 	void			(*error_report)(struct neighbour *, struct sk_buff*);
 	int			(*output)(struct sk_buff*);
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index e68700f..3489e23 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -586,8 +586,8 @@ void neigh_destroy(struct neighbour *nei
 			kfree(hh);
 	}
 
-	if (neigh->ops && neigh->ops->destructor)
-		(neigh->ops->destructor)(neigh);
+	if (neigh->parms->neigh_destructor)
+		(neigh->parms->neigh_destructor)(neigh);
 
 	skb_queue_purge(&neigh->arp_queue);
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index fd3f5c8..9588124 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -247,7 +247,6 @@ static void path_free(struct net_device 
 		if (neigh->ah)
 			ipoib_put_ah(neigh->ah);
 		*to_ipoib_neigh(neigh->neighbour) = NULL;
-		neigh->neighbour->ops->destructor = NULL;
 		kfree(neigh);
 	}
 
@@ -530,7 +529,6 @@ static void neigh_add_path(struct sk_buf
 err:
 	*to_ipoib_neigh(skb->dst->neighbour) = NULL;
 	list_del(&neigh->list);
-	neigh->neighbour->ops->destructor = NULL;
 	kfree(neigh);
 
 	++priv->stats.tx_dropped;
@@ -769,21 +767,9 @@ static void ipoib_neigh_destructor(struc
 		ipoib_put_ah(ah);
 }
 
-static int ipoib_neigh_setup(struct neighbour *neigh)
-{
-	/*
-	 * Is this kosher?  I can't find anybody in the kernel that
-	 * sets neigh->destructor, so we should be able to set it here
-	 * without trouble.
-	 */
-	neigh->ops->destructor = ipoib_neigh_destructor;
-
-	return 0;
-}
-
 static int ipoib_neigh_setup_dev(struct net_device *dev, struct neigh_parms *parms)
 {
-	parms->neigh_setup = ipoib_neigh_setup;
+	parms->neigh_destructor = ipoib_neigh_destructor;
 
 	return 0;
 }

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH] net: Move destructor from neigh->ops to neigh_params
  2006-01-23 21:27 [PATCH] net: Move destructor from neigh->ops to neigh_params Roland Dreier
@ 2006-01-23 21:54 ` David S. Miller
  2006-02-02  1:28 ` [PATCH RESEND] " Roland Dreier
  2006-03-07  5:16 ` [PATCH] " Andrew Morton
  2 siblings, 0 replies; 20+ messages in thread
From: David S. Miller @ 2006-01-23 21:54 UTC (permalink / raw)
  To: rdreier; +Cc: netdev, openib-general

From: Roland Dreier <rdreier@cisco.com>
Date: Mon, 23 Jan 2006 13:27:32 -0800

> I'd like to get an ACK or NAK of it from Dave

Dave is in New Zealand at linux.conf.au, don't expect him to
be too active for at least a week...

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH RESEND] net: Move destructor from neigh->ops to neigh_params
  2006-01-23 21:27 [PATCH] net: Move destructor from neigh->ops to neigh_params Roland Dreier
  2006-01-23 21:54 ` David S. Miller
@ 2006-02-02  1:28 ` Roland Dreier
  2006-02-02  1:31   ` David S. Miller
                     ` (2 more replies)
  2006-03-07  5:16 ` [PATCH] " Andrew Morton
  2 siblings, 3 replies; 20+ messages in thread
From: Roland Dreier @ 2006-02-02  1:28 UTC (permalink / raw)
  To: davem; +Cc: netdev, openib-general

Sorry to distract everyone from the VJ channel discussion, but on the
other hand it looks like Dave is back... I'm resending this because
I'd really like to get this problem fixed but I want to make sure
we're doing it the right way.  So either an ACK or a NAK with guidance
would be great...


This is a resend of a patch written by Michael S. Tsirkin
<mst@mellanox.co.il>.  I'd like to get an ACK or NAK of it from Dave
and other networking people, so that we can either merge it upstream
or try a different approach.  There definitely is a problem with
neighbour destructors that IP-over-IB is running into.

It would be good to know what the design was behind putting the
destructor method in neigh->ops in the first place.

Dave, if you want to merge this directly, that's fine.  Or I'm fine
with merging this through the IB tree if you'd prefer (if you want me
to do that, let me know if you think it's 2.6.16 material).

Thanks,
  Roland



struct neigh_ops currently has a destructor field, which no in-kernel
drivers outside of infiniband use.  The infiniband/ulp/ipoib in-tree
driver stashes some info in the neighbour structure (the results of
the second-stage lookup from ARP results to real link-level path), and
it uses neigh->ops->destructor to get a callback so it can clean up
this extra info when a neighbour is freed.  We've run into problems
with this: since the destructor is in an ops field that is shared
between neighbours that may belong to different net devices, there's
no way to set/clear it safely.

The following patch moves this field to neigh_parms where it can be
safely set, together with its twin neigh_setup.  Two additional
patches in the patch series update ipoib to use this new interface.

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

---

diff --git a/include/net/neighbour.h b/include/net/neighbour.h
index 6fa9ae1..b0666d6 100644
--- a/include/net/neighbour.h
+++ b/include/net/neighbour.h
@@ -68,6 +68,7 @@ struct neigh_parms
 	struct net_device *dev;
 	struct neigh_parms *next;
 	int	(*neigh_setup)(struct neighbour *);
+	void	(*neigh_destructor)(struct neighbour *);
 	struct neigh_table *tbl;
 
 	void	*sysctl_table;
@@ -145,7 +146,6 @@ struct neighbour
 struct neigh_ops
 {
 	int			family;
-	void			(*destructor)(struct neighbour *);
 	void			(*solicit)(struct neighbour *, struct sk_buff*);
 	void			(*error_report)(struct neighbour *, struct sk_buff*);
 	int			(*output)(struct sk_buff*);
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index e68700f..3489e23 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -586,8 +586,8 @@ void neigh_destroy(struct neighbour *nei
 			kfree(hh);
 	}
 
-	if (neigh->ops && neigh->ops->destructor)
-		(neigh->ops->destructor)(neigh);
+	if (neigh->parms->neigh_destructor)
+		(neigh->parms->neigh_destructor)(neigh);
 
 	skb_queue_purge(&neigh->arp_queue);
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index fd3f5c8..9588124 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -247,7 +247,6 @@ static void path_free(struct net_device 
 		if (neigh->ah)
 			ipoib_put_ah(neigh->ah);
 		*to_ipoib_neigh(neigh->neighbour) = NULL;
-		neigh->neighbour->ops->destructor = NULL;
 		kfree(neigh);
 	}
 
@@ -530,7 +529,6 @@ static void neigh_add_path(struct sk_buf
 err:
 	*to_ipoib_neigh(skb->dst->neighbour) = NULL;
 	list_del(&neigh->list);
-	neigh->neighbour->ops->destructor = NULL;
 	kfree(neigh);
 
 	++priv->stats.tx_dropped;
@@ -769,21 +767,9 @@ static void ipoib_neigh_destructor(struc
 		ipoib_put_ah(ah);
 }
 
-static int ipoib_neigh_setup(struct neighbour *neigh)
-{
-	/*
-	 * Is this kosher?  I can't find anybody in the kernel that
-	 * sets neigh->destructor, so we should be able to set it here
-	 * without trouble.
-	 */
-	neigh->ops->destructor = ipoib_neigh_destructor;
-
-	return 0;
-}
-
 static int ipoib_neigh_setup_dev(struct net_device *dev, struct neigh_parms *parms)
 {
-	parms->neigh_setup = ipoib_neigh_setup;
+	parms->neigh_destructor = ipoib_neigh_destructor;
 
 	return 0;
 }

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH RESEND] net: Move destructor from neigh->ops to neigh_params
  2006-02-02  1:28 ` [PATCH RESEND] " Roland Dreier
@ 2006-02-02  1:31   ` David S. Miller
  2006-02-02  1:33     ` Roland Dreier
  2006-02-02  1:34   ` YOSHIFUJI Hideaki / 吉藤英明
  2006-03-04  1:58   ` David S. Miller
  2 siblings, 1 reply; 20+ messages in thread
From: David S. Miller @ 2006-02-02  1:31 UTC (permalink / raw)
  To: rdreier; +Cc: netdev, openib-general

From: Roland Dreier <rdreier@cisco.com>
Date: Wed, 01 Feb 2006 17:28:10 -0800

> Sorry to distract everyone from the VJ channel discussion, but on the
> other hand it looks like Dave is back... I'm resending this because
> I'd really like to get this problem fixed but I want to make sure
> we're doing it the right way.  So either an ACK or a NAK with guidance
> would be great...

It's sitting in my backlog, and will be a net-2.6.17 issue not
a net-2.6.16 one as we're in bug fix mode there.

Sorry if you need this in 2.6.16, but that's not really practical.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH RESEND] net: Move destructor from neigh->ops to neigh_params
  2006-02-02  1:31   ` David S. Miller
@ 2006-02-02  1:33     ` Roland Dreier
  0 siblings, 0 replies; 20+ messages in thread
From: Roland Dreier @ 2006-02-02  1:33 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, openib-general

    David> It's sitting in my backlog, and will be a net-2.6.17 issue
    David> not a net-2.6.16 one as we're in bug fix mode there.

    David> Sorry if you need this in 2.6.16, but that's not really
    David> practical.

No, that's fine... I was just resending in case you were using RED to
manage your backlog.  This is a real issue but I don't think it's
hitting a lot of people.

 - R.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH RESEND] net: Move destructor from neigh->ops to neigh_params
  2006-02-02  1:28 ` [PATCH RESEND] " Roland Dreier
  2006-02-02  1:31   ` David S. Miller
@ 2006-02-02  1:34   ` YOSHIFUJI Hideaki / 吉藤英明
  2006-02-21  3:42     ` Roland Dreier
  2006-03-04  1:58   ` David S. Miller
  2 siblings, 1 reply; 20+ messages in thread
From: YOSHIFUJI Hideaki / 吉藤英明 @ 2006-02-02  1:34 UTC (permalink / raw)
  To: rdreier; +Cc: yoshfuji, netdev, davem, openib-general

In article <adabqxq1rdh.fsf@cisco.com> (at Wed, 01 Feb 2006 17:28:10 -0800), Roland Dreier <rdreier@cisco.com> says:

> Sorry to distract everyone from the VJ channel discussion, but on the
> other hand it looks like Dave is back... I'm resending this because
> I'd really like to get this problem fixed but I want to make sure
> we're doing it the right way.  So either an ACK or a NAK with guidance
> would be great...

Sorry for silence.
Since we have "setup," it'd be natural to have destruct;
I seems sane to me.

--yoshfuji

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: Re: [PATCH RESEND] net: Move destructor from neigh->ops to neigh_params
  2006-02-02  1:34   ` YOSHIFUJI Hideaki / 吉藤英明
@ 2006-02-21  3:42     ` Roland Dreier
  2006-02-21  4:01       ` David S. Miller
  0 siblings, 1 reply; 20+ messages in thread
From: Roland Dreier @ 2006-02-21  3:42 UTC (permalink / raw)
  To: davem
  Cc: YOSHIFUJI Hideaki / 吉藤英明, netdev,
	openib-general

Hi Dave, have you had a chance to look at this?  I can resend again if
you've lost the original mail.  Also, let me know if you want me to
merge this through my tree when 2.6.17 opens up.

The only feedback I've seen is that Yoshfuji-san has said that this
looks sane.

Thanks,
  Roland

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: Re: [PATCH RESEND] net: Move destructor from neigh->ops to neigh_params
  2006-02-21  3:42     ` Roland Dreier
@ 2006-02-21  4:01       ` David S. Miller
  2006-02-21  4:48         ` Roland Dreier
  0 siblings, 1 reply; 20+ messages in thread
From: David S. Miller @ 2006-02-21  4:01 UTC (permalink / raw)
  To: rdreier; +Cc: yoshfuji, netdev, openib-general

From: Roland Dreier <rdreier@cisco.com>
Date: Mon, 20 Feb 2006 19:42:41 -0800

> Hi Dave, have you had a chance to look at this?

Not yet, it's very low on the priority list at the moment,
but I do still have it in my inbox so don't worry.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: Re: [PATCH RESEND] net: Move destructor from neigh->ops to neigh_params
  2006-02-21  4:01       ` David S. Miller
@ 2006-02-21  4:48         ` Roland Dreier
  2006-02-21  4:55           ` David S. Miller
  0 siblings, 1 reply; 20+ messages in thread
From: Roland Dreier @ 2006-02-21  4:48 UTC (permalink / raw)
  To: David S. Miller; +Cc: yoshfuji, netdev, openib-general

    David> Not yet, it's very low on the priority list at the moment,
    David> but I do still have it in my inbox so don't worry.

Do you think you'll get a chance to look at it for 2.6.17?  If not we
can work around things in the IPoIB driver in a slightly uglier way
for 2.6.17.

Thanks,
  Roland

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: Re: [PATCH RESEND] net: Move destructor from neigh->ops to neigh_params
  2006-02-21  4:48         ` Roland Dreier
@ 2006-02-21  4:55           ` David S. Miller
  0 siblings, 0 replies; 20+ messages in thread
From: David S. Miller @ 2006-02-21  4:55 UTC (permalink / raw)
  To: rdreier; +Cc: yoshfuji, netdev, openib-general

From: Roland Dreier <rdreier@cisco.com>
Date: Mon, 20 Feb 2006 20:48:30 -0800

> Do you think you'll get a chance to look at it for 2.6.17?

Yes I will.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH RESEND] net: Move destructor from neigh->ops to neigh_params
  2006-02-02  1:28 ` [PATCH RESEND] " Roland Dreier
  2006-02-02  1:31   ` David S. Miller
  2006-02-02  1:34   ` YOSHIFUJI Hideaki / 吉藤英明
@ 2006-03-04  1:58   ` David S. Miller
  2 siblings, 0 replies; 20+ messages in thread
From: David S. Miller @ 2006-03-04  1:58 UTC (permalink / raw)
  To: rdreier; +Cc: netdev, openib-general

From: Roland Dreier <rdreier@cisco.com>
Date: Wed, 01 Feb 2006 17:28:10 -0800

> Dave, if you want to merge this directly, that's fine.  Or I'm fine
> with merging this through the IB tree if you'd prefer (if you want me
> to do that, let me know if you think it's 2.6.16 material).

Applied to net-2.6.17, thanks for being so incredibly patient :)

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] net: Move destructor from neigh->ops to neigh_params
  2006-01-23 21:27 [PATCH] net: Move destructor from neigh->ops to neigh_params Roland Dreier
  2006-01-23 21:54 ` David S. Miller
  2006-02-02  1:28 ` [PATCH RESEND] " Roland Dreier
@ 2006-03-07  5:16 ` Andrew Morton
  2006-03-07  5:40   ` Shirley Ma
                     ` (4 more replies)
  2 siblings, 5 replies; 20+ messages in thread
From: Andrew Morton @ 2006-03-07  5:16 UTC (permalink / raw)
  To: Roland Dreier; +Cc: netdev, davem, openib-general

Roland Dreier <rdreier@cisco.com> wrote:
>
> struct neigh_ops currently has a destructor field, which no in-kernel
>  drivers outside of infiniband use.

net/atm/clip.c begs to disagree.

I'm also wondering why a combination of the net and infiniband trees does this:

drivers/infiniband/ulp/ipoib/ipoib_multicast.c: In function `ipoib_mcast_free':
drivers/infiniband/ulp/ipoib/ipoib_multicast.c:118: error: structure has no member named `destructor'

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: Re: [PATCH] net: Move destructor from neigh->ops to neigh_params
  2006-03-07  5:16 ` [PATCH] " Andrew Morton
@ 2006-03-07  5:40   ` Shirley Ma
  2006-03-07  5:44   ` Roland Dreier
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 20+ messages in thread
From: Shirley Ma @ 2006-03-07  5:40 UTC (permalink / raw)
  To: Andrew Morton
  Cc: netdev, openib-general-bounces, davem, openib-general,
	Roland Dreier


[-- Attachment #1.1: Type: text/plain, Size: 518 bytes --]

>I'm also wondering why a combination of the net and infiniband trees does 
this:

>drivers/infiniband/ulp/ipoib/ipoib_multicast.c: In function 
`ipoib_mcast_free':
>drivers/infiniband/ulp/ipoib/ipoib_multicast.c:118: error: structure has 
no member named `destructor'

I guess this patch needs to be combined with another ipoib-neigh patch, 
which hasn't been checked into infiniband/ipoib yet.

Thanks
Shirley Ma
IBM Linux Technology Center
15300 SW Koll Parkway
Beaverton, OR 97006-6063
Phone(Fax): (503) 578-7638


[-- Attachment #1.2: Type: text/html, Size: 689 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] net: Move destructor from neigh->ops to neigh_params
  2006-03-07  5:16 ` [PATCH] " Andrew Morton
  2006-03-07  5:40   ` Shirley Ma
@ 2006-03-07  5:44   ` Roland Dreier
  2006-03-07  6:11     ` David S. Miller
  2006-03-07  5:50   ` Roland Dreier
                     ` (2 subsequent siblings)
  4 siblings, 1 reply; 20+ messages in thread
From: Roland Dreier @ 2006-03-07  5:44 UTC (permalink / raw)
  To: Andrew Morton; +Cc: netdev, davem, openib-general

    Roland> struct neigh_ops currently has a destructor field, which
    Roland> no in-kernel drivers outside of infiniband use.

    Andrew> net/atm/clip.c begs to disagree.

err... my fault for trusting the patch changelog and not
double-checking.  I think the fix is as simple as, although, given my
lack of ATM gear, this is untested:

diff --git a/net/atm/clip.c b/net/atm/clip.c
index 73370de..9d72817 100644
--- a/net/atm/clip.c
+++ b/net/atm/clip.c
@@ -289,7 +289,6 @@ static void clip_neigh_error(struct neig
 
 static struct neigh_ops clip_neigh_ops = {
 	.family =		AF_INET,
-	.destructor =		clip_neigh_destroy,
 	.solicit =		clip_neigh_solicit,
 	.error_report =		clip_neigh_error,
 	.output =		dev_queue_xmit,
@@ -346,6 +345,7 @@ static struct neigh_table clip_tbl = {
 
 	/* parameters are copied from ARP ... */
 	.parms = {
+		.destructor		= clip_neigh_destroy,
 		.tbl 			= &clip_tbl,
 		.base_reachable_time 	= 30 * HZ,
 		.retrans_time 		= 1 * HZ,

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH] net: Move destructor from neigh->ops to neigh_params
  2006-03-07  5:16 ` [PATCH] " Andrew Morton
  2006-03-07  5:40   ` Shirley Ma
  2006-03-07  5:44   ` Roland Dreier
@ 2006-03-07  5:50   ` Roland Dreier
  2006-03-07 19:21   ` [PATCH] IPoIB: Fix build now that destructor is in neigh_params Roland Dreier
  2006-03-07 19:22   ` [PATCH] [NET]: Move destructor from neigh->ops to neigh_params Roland Dreier
  4 siblings, 0 replies; 20+ messages in thread
From: Roland Dreier @ 2006-03-07  5:50 UTC (permalink / raw)
  To: Andrew Morton; +Cc: netdev, davem, openib-general

    Andrew> I'm also wondering why a combination of the net and
    Andrew> infiniband trees does this:

    Andrew> drivers/infiniband/ulp/ipoib/ipoib_multicast.c: In
    Andrew> function `ipoib_mcast_free':
    Andrew> drivers/infiniband/ulp/ipoib/ipoib_multicast.c:118: error:
    Andrew> structure has no member named `destructor'

A cock-up on my part.  I think I fixed this when testing the patch,
and promptly forgot about doing it.  Then when I reposted the patch to
netdev, I decided to be very careful about things, so I went back to
pristine sources from Michael's message, which of course is missing
the following chunk:

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index fde442a..93c462e 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -115,7 +115,6 @@ static void ipoib_mcast_free(struct ipoi
 		if (neigh->ah)
 			ipoib_put_ah(neigh->ah);
 		*to_ipoib_neigh(neigh->neighbour) = NULL;
-		neigh->neighbour->ops->destructor = NULL;
 		kfree(neigh);
 	}
 

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH] net: Move destructor from neigh->ops to neigh_params
  2006-03-07  5:44   ` Roland Dreier
@ 2006-03-07  6:11     ` David S. Miller
  0 siblings, 0 replies; 20+ messages in thread
From: David S. Miller @ 2006-03-07  6:11 UTC (permalink / raw)
  To: rdreier; +Cc: akpm, netdev, openib-general

From: Roland Dreier <rdreier@cisco.com>
Date: Mon, 06 Mar 2006 21:44:50 -0800

>     Roland> struct neigh_ops currently has a destructor field, which
>     Roland> no in-kernel drivers outside of infiniband use.
> 
>     Andrew> net/atm/clip.c begs to disagree.
> 
> err... my fault for trusting the patch changelog and not
> double-checking.  I think the fix is as simple as, although, given my
> lack of ATM gear, this is untested:

Looks good to me, applied.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH] IPoIB: Fix build now that destructor is in neigh_params
  2006-03-07  5:16 ` [PATCH] " Andrew Morton
                     ` (2 preceding siblings ...)
  2006-03-07  5:50   ` Roland Dreier
@ 2006-03-07 19:21   ` Roland Dreier
  2006-03-07 22:53     ` David S. Miller
  2006-03-07 19:22   ` [PATCH] [NET]: Move destructor from neigh->ops to neigh_params Roland Dreier
  4 siblings, 1 reply; 20+ messages in thread
From: Roland Dreier @ 2006-03-07 19:21 UTC (permalink / raw)
  To: Andrew Morton; +Cc: netdev, davem, openib-general

Dave, here's an incremental patch that fixes the IPoIB build (which is
broken in net-2.6.17 because of my screw-up, which left out the chunk
below).  I'll also send a full patch that can replace the "Move
destructor from neigh->ops to neigh_params" patch if you'd rather
replace it in your tree.

Thanks, and sorry about the screw-up.

---

Get rid of the last place in IPoIB where we clear
neigh->neighbour->ops->destructor.  This is broken now that the
destructor member has moved to neigh_params.

Signed-off-by: Roland Dreier <rolandd@cisco.com>

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index a2408d7..19fd173 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -115,7 +115,6 @@ static void ipoib_mcast_free(struct ipoi
 		if (neigh->ah)
 			ipoib_put_ah(neigh->ah);
 		*to_ipoib_neigh(neigh->neighbour) = NULL;
-		neigh->neighbour->ops->destructor = NULL;
 		kfree(neigh);
 	}
 

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH] [NET]: Move destructor from neigh->ops to neigh_params
  2006-03-07  5:16 ` [PATCH] " Andrew Morton
                     ` (3 preceding siblings ...)
  2006-03-07 19:21   ` [PATCH] IPoIB: Fix build now that destructor is in neigh_params Roland Dreier
@ 2006-03-07 19:22   ` Roland Dreier
  4 siblings, 0 replies; 20+ messages in thread
From: Roland Dreier @ 2006-03-07 19:22 UTC (permalink / raw)
  To: Andrew Morton; +Cc: netdev, davem, openib-general

Here's the fixed version of the original patch.

---

From: Michael S. Tsirkin <mst@mellanox.co.il>

struct neigh_ops currently has a destructor field, which no in-kernel
drivers outside of infiniband use.  The infiniband/ulp/ipoib in-tree
driver stashes some info in the neighbour structure (the results of
the second-stage lookup from ARP results to real link-level path), and
it uses neigh->ops->destructor to get a callback so it can clean up
this extra info when a neighbour is freed.  We've run into problems
with this: since the destructor is in an ops field that is shared
between neighbours that may belong to different net devices, there's
no way to set/clear it safely.

The following patch moves this field to neigh_parms where it can be
safely set, together with its twin neigh_setup.  Two additional
patches in the patch series update ipoib to use this new interface.

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index c3b5f79..9d9cecd 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -247,7 +247,6 @@ static void path_free(struct net_device 
 		if (neigh->ah)
 			ipoib_put_ah(neigh->ah);
 		*to_ipoib_neigh(neigh->neighbour) = NULL;
-		neigh->neighbour->ops->destructor = NULL;
 		kfree(neigh);
 	}
 
@@ -530,7 +529,6 @@ static void neigh_add_path(struct sk_buf
 err:
 	*to_ipoib_neigh(skb->dst->neighbour) = NULL;
 	list_del(&neigh->list);
-	neigh->neighbour->ops->destructor = NULL;
 	kfree(neigh);
 
 	++priv->stats.tx_dropped;
@@ -769,21 +767,9 @@ static void ipoib_neigh_destructor(struc
 		ipoib_put_ah(ah);
 }
 
-static int ipoib_neigh_setup(struct neighbour *neigh)
-{
-	/*
-	 * Is this kosher?  I can't find anybody in the kernel that
-	 * sets neigh->destructor, so we should be able to set it here
-	 * without trouble.
-	 */
-	neigh->ops->destructor = ipoib_neigh_destructor;
-
-	return 0;
-}
-
 static int ipoib_neigh_setup_dev(struct net_device *dev, struct neigh_parms *parms)
 {
-	parms->neigh_setup = ipoib_neigh_setup;
+	parms->neigh_destructor = ipoib_neigh_destructor;
 
 	return 0;
 }
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index a2408d7..19fd173 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -115,7 +115,6 @@ static void ipoib_mcast_free(struct ipoi
 		if (neigh->ah)
 			ipoib_put_ah(neigh->ah);
 		*to_ipoib_neigh(neigh->neighbour) = NULL;
-		neigh->neighbour->ops->destructor = NULL;
 		kfree(neigh);
 	}
 
diff --git a/include/net/neighbour.h b/include/net/neighbour.h
index 6fa9ae1..b0666d6 100644
--- a/include/net/neighbour.h
+++ b/include/net/neighbour.h
@@ -68,6 +68,7 @@ struct neigh_parms
 	struct net_device *dev;
 	struct neigh_parms *next;
 	int	(*neigh_setup)(struct neighbour *);
+	void	(*neigh_destructor)(struct neighbour *);
 	struct neigh_table *tbl;
 
 	void	*sysctl_table;
@@ -145,7 +146,6 @@ struct neighbour
 struct neigh_ops
 {
 	int			family;
-	void			(*destructor)(struct neighbour *);
 	void			(*solicit)(struct neighbour *, struct sk_buff*);
 	void			(*error_report)(struct neighbour *, struct sk_buff*);
 	int			(*output)(struct sk_buff*);
diff --git a/net/atm/clip.c b/net/atm/clip.c
index 73370de..9d72817 100644
--- a/net/atm/clip.c
+++ b/net/atm/clip.c
@@ -289,7 +289,6 @@ static void clip_neigh_error(struct neig
 
 static struct neigh_ops clip_neigh_ops = {
 	.family =		AF_INET,
-	.destructor =		clip_neigh_destroy,
 	.solicit =		clip_neigh_solicit,
 	.error_report =		clip_neigh_error,
 	.output =		dev_queue_xmit,
@@ -346,6 +345,7 @@ static struct neigh_table clip_tbl = {
 
 	/* parameters are copied from ARP ... */
 	.parms = {
+		.destructor		= clip_neigh_destroy,
 		.tbl 			= &clip_tbl,
 		.base_reachable_time 	= 30 * HZ,
 		.retrans_time 		= 1 * HZ,
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index e68700f..3489e23 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -586,8 +586,8 @@ void neigh_destroy(struct neighbour *nei
 			kfree(hh);
 	}
 
-	if (neigh->ops && neigh->ops->destructor)
-		(neigh->ops->destructor)(neigh);
+	if (neigh->parms->neigh_destructor)
+		(neigh->parms->neigh_destructor)(neigh);
 
 	skb_queue_purge(&neigh->arp_queue);
 

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH] IPoIB: Fix build now that destructor is in neigh_params
  2006-03-07 19:21   ` [PATCH] IPoIB: Fix build now that destructor is in neigh_params Roland Dreier
@ 2006-03-07 22:53     ` David S. Miller
  2006-03-07 22:56       ` Roland Dreier
  0 siblings, 1 reply; 20+ messages in thread
From: David S. Miller @ 2006-03-07 22:53 UTC (permalink / raw)
  To: rdreier; +Cc: akpm, netdev, openib-general

From: Roland Dreier <rdreier@cisco.com>
Date: Tue, 07 Mar 2006 11:21:08 -0800

> Dave, here's an incremental patch that fixes the IPoIB build (which is
> broken in net-2.6.17 because of my screw-up, which left out the chunk
> below).  I'll also send a full patch that can replace the "Move
> destructor from neigh->ops to neigh_params" patch if you'd rather
> replace it in your tree.
> 
> Thanks, and sorry about the screw-up.

Why not just put this into your -ipoib patch set in -mm?
The change was for IPOIB's sake anyways...

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] IPoIB: Fix build now that destructor is in neigh_params
  2006-03-07 22:53     ` David S. Miller
@ 2006-03-07 22:56       ` Roland Dreier
  0 siblings, 0 replies; 20+ messages in thread
From: Roland Dreier @ 2006-03-07 22:56 UTC (permalink / raw)
  To: David S. Miller; +Cc: akpm, netdev, openib-general

    David> Why not just put this into your -ipoib patch set in -mm?
    David> The change was for IPOIB's sake anyways...

OK, good idea.  I'll put this in my for-2.6.17 and for-mm queues.

 - R.

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2006-03-07 22:56 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-01-23 21:27 [PATCH] net: Move destructor from neigh->ops to neigh_params Roland Dreier
2006-01-23 21:54 ` David S. Miller
2006-02-02  1:28 ` [PATCH RESEND] " Roland Dreier
2006-02-02  1:31   ` David S. Miller
2006-02-02  1:33     ` Roland Dreier
2006-02-02  1:34   ` YOSHIFUJI Hideaki / 吉藤英明
2006-02-21  3:42     ` Roland Dreier
2006-02-21  4:01       ` David S. Miller
2006-02-21  4:48         ` Roland Dreier
2006-02-21  4:55           ` David S. Miller
2006-03-04  1:58   ` David S. Miller
2006-03-07  5:16 ` [PATCH] " Andrew Morton
2006-03-07  5:40   ` Shirley Ma
2006-03-07  5:44   ` Roland Dreier
2006-03-07  6:11     ` David S. Miller
2006-03-07  5:50   ` Roland Dreier
2006-03-07 19:21   ` [PATCH] IPoIB: Fix build now that destructor is in neigh_params Roland Dreier
2006-03-07 22:53     ` David S. Miller
2006-03-07 22:56       ` Roland Dreier
2006-03-07 19:22   ` [PATCH] [NET]: Move destructor from neigh->ops to neigh_params Roland Dreier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).