Patchwork [net-next,3/3] net: core: fix wrong linkage for ptype_base and ptype_all symbols

login
register
mail settings
Submitter Jean Sacren
Date Aug. 6, 2013, 7:32 a.m.
Message ID <1375774371-831-3-git-send-email-sakiwit@gmail.com>
Download mbox | patch
Permalink /patch/264886/
State Changes Requested
Delegated to: David Miller
Headers show

Comments

Jean Sacren - Aug. 6, 2013, 7:32 a.m.
In commit 900ff8c6 ("net: move procfs code to net/core/net-procfs.c"),
it changed the correct linkage of ptype_base and ptype_all symbols to
the wrong one in net/core/dev.c, yet failed to change to the correct
linkage of those two in net/core/net-procfs.c.

Fix the wrong linkage by setting static specifier to both sets of the
symbols so that they could have coherent internal linkage by themselves
to avoid interference with each other.

Signed-off-by: Jean Sacren <sakiwit@gmail.com>
---
 net/core/dev.c        | 4 ++--
 net/core/net-procfs.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Daniel Borkmann - Aug. 6, 2013, 8:13 a.m.
On 08/06/2013 09:32 AM, Jean Sacren wrote:
> In commit 900ff8c6 ("net: move procfs code to net/core/net-procfs.c"),
> it changed the correct linkage of ptype_base and ptype_all symbols to
> the wrong one in net/core/dev.c, yet failed to change to the correct
> linkage of those two in net/core/net-procfs.c.
>
> Fix the wrong linkage by setting static specifier to both sets of the
> symbols so that they could have coherent internal linkage by themselves
> to avoid interference with each other.

Ho? I do not think this is correct, what makes you think so?

The net-procfs.c usage of ptype_* is there to show current pf_packet users
via seq_files in procfs. Your patch will just break this.

> Signed-off-by: Jean Sacren <sakiwit@gmail.com>
> ---
>   net/core/dev.c        | 4 ++--
>   net/core/net-procfs.c | 4 ++--
>   2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/net/core/dev.c b/net/core/dev.c
> index dfd9f5d..d85e5e1 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -142,8 +142,8 @@
>
>   static DEFINE_SPINLOCK(ptype_lock);
>   static DEFINE_SPINLOCK(offload_lock);
> -struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
> -struct list_head ptype_all __read_mostly;	/* Taps */
> +static struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
> +static struct list_head ptype_all __read_mostly;	/* Taps */
>   static struct list_head offload_base __read_mostly;
>
>   /*
> diff --git a/net/core/net-procfs.c b/net/core/net-procfs.c
> index 2bf8329..e57cd63 100644
> --- a/net/core/net-procfs.c
> +++ b/net/core/net-procfs.c
> @@ -9,8 +9,8 @@
>   #define get_offset(x) ((x) & ((1 << BUCKET_SPACE) - 1))
>   #define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o))
>
> -extern struct list_head ptype_all __read_mostly;
> -extern struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
> +static struct list_head ptype_all __read_mostly;
> +static struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
>
>   static inline struct net_device *dev_from_same_bucket(struct seq_file *seq, loff_t *pos)
>   {
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jean Sacren - Aug. 6, 2013, 8:45 p.m.
From: Daniel Borkmann <dborkman@redhat.com>
Date: Tue, 06 Aug 2013 10:13:15 +0200
>
> On 08/06/2013 09:32 AM, Jean Sacren wrote:
> > In commit 900ff8c6 ("net: move procfs code to net/core/net-procfs.c"),
> > it changed the correct linkage of ptype_base and ptype_all symbols to
> > the wrong one in net/core/dev.c, yet failed to change to the correct
> > linkage of those two in net/core/net-procfs.c.
> >
> > Fix the wrong linkage by setting static specifier to both sets of the
> > symbols so that they could have coherent internal linkage by themselves
> > to avoid interference with each other.
> 
> Ho? I do not think this is correct, what makes you think so?

Thank you for the awesome comment.

I'm sorry to tell you but the patch is correct. Both symbols of
ptype_{base,all} were wrongly declared as extern in net-procfs.c in the
first place.

> The net-procfs.c usage of ptype_* is there to show current pf_packet users
> via seq_files in procfs. Your patch will just break this.

I validated it before I submitted the patch that all the symbols of
ptype_{base,all} are used exclusively in net/core/net-procfs.c and
net/core/dev.c but not outside of those two places. Therefore, your
assumption for breakage is groundless.

As a kernel networking guru as you are, you shall have the lab and all
sorts of test cases to validate patches. I'd love to run this type of
testing by myself, but I don't have such resources. If you could test
this patch in any of your setup and prove that I'm wrong, I'd extremely
appreciate it. Thank you in advance.

I'm looking forward to being taught more.
Eric Dumazet - Aug. 6, 2013, 9:06 p.m.
On Tue, 2013-08-06 at 14:45 -0600, Jean Sacren wrote:

> I'm sorry to tell you but the patch is correct. Both symbols of
> ptype_{base,all} were wrongly declared as extern in net-procfs.c in the
> first place.

You are mistaken.

> > The net-procfs.c usage of ptype_* is there to show current pf_packet users
> > via seq_files in procfs. Your patch will just break this.
> 
> I validated it before I submitted the patch that all the symbols of
> ptype_{base,all} are used exclusively in net/core/net-procfs.c and
> net/core/dev.c but not outside of those two places. Therefore, your
> assumption for breakage is groundless.
> 
> As a kernel networking guru as you are, you shall have the lab and all
> sorts of test cases to validate patches. I'd love to run this type of
> testing by myself, but I don't have such resources. If you could test
> this patch in any of your setup and prove that I'm wrong, I'd extremely
> appreciate it. Thank you in advance.
> 
> I'm looking forward to being taught more.
> 


Well, the patch is wrong, for sure, and you cannot ask us to test your
patches.

Do not send patches that you cannot test yourself, please.

Try this before/after your patch

cat /proc/net/ptype



--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jean Sacren - Aug. 7, 2013, 4 a.m.
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Tue, 06 Aug 2013 14:06:41 -0700
>
> On Tue, 2013-08-06 at 14:45 -0600, Jean Sacren wrote:
> 
> > I'm sorry to tell you but the patch is correct. Both symbols of
> > ptype_{base,all} were wrongly declared as extern in net-procfs.c in the
> > first place.
> 
> You are mistaken.

Sorry for the big mistake.

Patch

diff --git a/net/core/dev.c b/net/core/dev.c
index dfd9f5d..d85e5e1 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -142,8 +142,8 @@ 
 
 static DEFINE_SPINLOCK(ptype_lock);
 static DEFINE_SPINLOCK(offload_lock);
-struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
-struct list_head ptype_all __read_mostly;	/* Taps */
+static struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
+static struct list_head ptype_all __read_mostly;	/* Taps */
 static struct list_head offload_base __read_mostly;
 
 /*
diff --git a/net/core/net-procfs.c b/net/core/net-procfs.c
index 2bf8329..e57cd63 100644
--- a/net/core/net-procfs.c
+++ b/net/core/net-procfs.c
@@ -9,8 +9,8 @@ 
 #define get_offset(x) ((x) & ((1 << BUCKET_SPACE) - 1))
 #define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o))
 
-extern struct list_head ptype_all __read_mostly;
-extern struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
+static struct list_head ptype_all __read_mostly;
+static struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
 
 static inline struct net_device *dev_from_same_bucket(struct seq_file *seq, loff_t *pos)
 {