* Fw: [Bug 62171] New: Kernel In local_bh_enable in case of Vlan Tagged ICMP Packets
From: Stephen Hemminger @ 2013-09-26 21:38 UTC (permalink / raw)
To: netdev; +Cc: gautam06acharya
I suspect this bug is against a kernel which is outside the window of versions
that upstream developers care about, but forwarding it anyway.
The 2.6.27.18 kernel is from Feb 2009!
Begin forwarded message:
Date: Thu, 26 Sep 2013 06:22:51 -0700
From: "bugzilla-daemon@bugzilla.kernel.org" <bugzilla-daemon@bugzilla.kernel.org>
To: "stephen@networkplumber.org" <stephen@networkplumber.org>
Subject: [Bug 62171] New: Kernel In local_bh_enable in case of Vlan Tagged ICMP Packets
https://bugzilla.kernel.org/show_bug.cgi?id=62171
Bug ID: 62171
Summary: Kernel In local_bh_enable in case of Vlan Tagged ICMP
Packets
Product: Networking
Version: 2.5
Kernel Version: Linux 2.6.27.18
Hardware: Mips64
OS: Linux
Tree: Mainline
Status: NEW
Severity: high
Priority: P1
Component: Other
Assignee: shemminger@linux-foundation.org
Reporter: gautam06acharya@gmail.com
Regression: No
Hi,
Kernel In based on Linux Version 2.6.27.18, Cavium octeon Board is used. In SMP
mode but one one cpu is loaded with Linux Kernel.
Its getting crashed in WARN_ON_ONCE in _local_bh_enable_ip called from
local_bh_enable.
Please Find Below Stack Trace Regarding this Crash:
[<ffffffff81154108>] warn_on_slowpath+0x58/0x90
[<ffffffff8115bd20>] local_bh_enable+0x88/0xf8
[<ffffffff81344a44>] dev_queue_xmit+0x144/0x688
[<ffffffff81301f04>] bond_dev_queue_xmit+0x44/0x178
[<ffffffff81302408>] bond_xmit_activebackup+0xb0/0xe8
[<ffffffff81344ea4>] dev_queue_xmit+0x5a4/0x688
[<ffffffff813d59b4>] vlan_dev_hwaccel_hard_start_xmit+0x8c/0xa0
[<ffffffff81344ea4>] dev_queue_xmit+0x5a4/0x688
[<ffffffff81377cbc>] ip_push_pending_frames+0x37c/0x4c0
[<ffffffff813a0768>] icmp_reply+0x170/0x290
[<ffffffff813a0a58>] icmp_echo+0x58/0x68
[<ffffffff813a11b4>] icmp_rcv+0x334/0x390
[<ffffffff813721a4>] ip_local_deliver_finish+0x13c/0x2d8
[<ffffffff813718c4>] ip_rcv_finish+0x134/0x510
[<ffffffff81343af4>] netif_receive_skb+0x41c/0x5d8
[<ffffffff81343d58>] process_backlog+0xa8/0x160
[<ffffffff8134186c>] net_rx_action+0x194/0x2e8
[<ffffffff8115b71c>] __do_softirq+0x114/0x288
[<ffffffff8115b910>] do_softirq+0x80/0x98
[<ffffffff8115bb8c>] irq_exit+0x64/0x78
[<ffffffff81100e40>] plat_irq_dispatch+0xd0/0x1d0
[<ffffffff81120c80>] ret_from_irq+0x0/0x4
[<ffffffff81120ea0>] r4k_wait+0x20/0x40
[<ffffffff81123414>] cpu_idle+0x34/0x60
--
You are receiving this mail because:
You are the assignee for the bug.
^ permalink raw reply
* Re: [RFC net] bridge: clean the nf_bridge status when forwarding the skb
From: Stephen Hemminger @ 2013-09-26 21:32 UTC (permalink / raw)
To: Antonio Quartulli
Cc: netdev@vger.kernel.org, bridge@lists.linux-foundation.org,
David S. Miller
In-Reply-To: <20130926211648.GB1228@open-mesh.com>
On Thu, 26 Sep 2013 23:16:48 +0200
Antonio Quartulli <antonio@open-mesh.com> wrote:
> On Thu, Sep 26, 2013 at 02:10:21PM -0700, Stephen Hemminger wrote:
> > On Thu, 26 Sep 2013 22:19:50 +0200
> > Antonio Quartulli <antonio@meshcoding.com> wrote:
> >
> > > From: Antonio Quartulli <antonio@open-mesh.com>
> > >
> > > Even if enslaving a bridge interface into another bridge is
> > > forbidden, it is still possible to create a chain of
> > > virtual interfaces including two distinct bridges.
> > >
> > > In this case, the skb entering the second bridge could have
> > > the nf_bridge field already set due to a previous operation
> > > and consequently lead to a wrong processing of the packet
> > > itself.
> > >
> > > To prevent this behaviour release and set to NULL the
> > > nf_bridge field of the skb when exiting the bridge interface.
> > >
> > > Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
> > > ---
> > >
> > > I am not sure if this is a wanted behaviour or a real BUG. I found this
> > > "misbehaviour" while testing batman-adv with the following configuration:
> > >
> > > - br0 (bridge interface) having bat0 and eth0 as slaves
> > > - bat0 (which is a virtual interface provided by the batman-adv module and that
> > > works similarly to a bridge - to some extends) having br1 as slave
> > > - br1 (second bridge interface) having eth1 as slave
> > >
> > > Then follow these events:
> > > - a broadcast packet arrives on eth0
> > > - the skb enters br0 and skb->nf_bridge gets initialised and used
> > > - the skb enters bat0 and the packet *gets encapsulated in the batman-adv packet
> > > which adds a batman-adv header and another Ethernet header*
> > > - the skb enters br1 and gets ruined because nf_bridge_maybe_copy_header() (in
> > > br_dev_queue_push_xmit()) will try to restore an header that does not make
> > > sense anymore.
> > >
> > > With this patch the nf_bridge gets de-initialised before exiting br0 and
> > > therefore it is processed properly inside br1: nf_bridge_maybe_copy_header()
> > > does not take place at all because nf_bridge is never initialised (the packet is
> > > non-IP since it is a batman-adv packet)
> > >
> > > To the developers of the bridge module I would like to ask:
> > > 1) is skb->nf_bridge allowed to be non NULL when entering br_dev_xmit() ? If so,
> > > when is this supposed to happen?
> > >
> > > 2) do you think this patch is logically correct but the nf_bridge release should
> > > be done in batman-adv since it is the one re-encapsulating the packet?
> > >
> > >
> > > I hope I have made the problem clear.
> > >
> > > Best regards,
> > >
> > >
> > > net/bridge/br_forward.c | 5 +++++
> > > 1 file changed, 5 insertions(+)
> > >
> > > diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c
> > > index 4b81b14..65864bc 100644
> > > --- a/net/bridge/br_forward.c
> > > +++ b/net/bridge/br_forward.c
> > > @@ -49,6 +49,11 @@ int br_dev_queue_push_xmit(struct sk_buff *skb)
> > > } else {
> > > skb_push(skb, ETH_HLEN);
> > > br_drop_fake_rtable(skb);
> > > +
> > > + /* clean the NF bridge data */
> > > + nf_bridge_put(skb->nf_bridge);
> > > + skb->nf_bridge = NULL;
> > > +
> > > dev_queue_xmit(skb);
> > > }
> > >
>
> Regarding CONFIG_BRIDGE_NETFILTER you are right, thanks.
>
> >
> > I think the header will also be garbage if bridge on bridge with netfilter is used.
> > See nf_bridge_save_header.
>
> What header are you referring to? nf_bridge_save_header() saves the header in
> skb->nf_bridge->data, which is freed during nf_bridge_put() (assuming
> ->use reached 0).
>
>
If bridge is stacked the original ether header will get overwritten by the second
call to save_header.
^ permalink raw reply
* Re: [RFC net] bridge: clean the nf_bridge status when forwarding the skb
From: Antonio Quartulli @ 2013-09-26 21:16 UTC (permalink / raw)
To: Stephen Hemminger
Cc: netdev@vger.kernel.org, bridge@lists.linux-foundation.org,
David S. Miller
In-Reply-To: <20130926141021.3cde0f0f@nehalam.linuxnetplumber.net>
[-- Attachment #1: Type: text/plain, Size: 3479 bytes --]
On Thu, Sep 26, 2013 at 02:10:21PM -0700, Stephen Hemminger wrote:
> On Thu, 26 Sep 2013 22:19:50 +0200
> Antonio Quartulli <antonio@meshcoding.com> wrote:
>
> > From: Antonio Quartulli <antonio@open-mesh.com>
> >
> > Even if enslaving a bridge interface into another bridge is
> > forbidden, it is still possible to create a chain of
> > virtual interfaces including two distinct bridges.
> >
> > In this case, the skb entering the second bridge could have
> > the nf_bridge field already set due to a previous operation
> > and consequently lead to a wrong processing of the packet
> > itself.
> >
> > To prevent this behaviour release and set to NULL the
> > nf_bridge field of the skb when exiting the bridge interface.
> >
> > Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
> > ---
> >
> > I am not sure if this is a wanted behaviour or a real BUG. I found this
> > "misbehaviour" while testing batman-adv with the following configuration:
> >
> > - br0 (bridge interface) having bat0 and eth0 as slaves
> > - bat0 (which is a virtual interface provided by the batman-adv module and that
> > works similarly to a bridge - to some extends) having br1 as slave
> > - br1 (second bridge interface) having eth1 as slave
> >
> > Then follow these events:
> > - a broadcast packet arrives on eth0
> > - the skb enters br0 and skb->nf_bridge gets initialised and used
> > - the skb enters bat0 and the packet *gets encapsulated in the batman-adv packet
> > which adds a batman-adv header and another Ethernet header*
> > - the skb enters br1 and gets ruined because nf_bridge_maybe_copy_header() (in
> > br_dev_queue_push_xmit()) will try to restore an header that does not make
> > sense anymore.
> >
> > With this patch the nf_bridge gets de-initialised before exiting br0 and
> > therefore it is processed properly inside br1: nf_bridge_maybe_copy_header()
> > does not take place at all because nf_bridge is never initialised (the packet is
> > non-IP since it is a batman-adv packet)
> >
> > To the developers of the bridge module I would like to ask:
> > 1) is skb->nf_bridge allowed to be non NULL when entering br_dev_xmit() ? If so,
> > when is this supposed to happen?
> >
> > 2) do you think this patch is logically correct but the nf_bridge release should
> > be done in batman-adv since it is the one re-encapsulating the packet?
> >
> >
> > I hope I have made the problem clear.
> >
> > Best regards,
> >
> >
> > net/bridge/br_forward.c | 5 +++++
> > 1 file changed, 5 insertions(+)
> >
> > diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c
> > index 4b81b14..65864bc 100644
> > --- a/net/bridge/br_forward.c
> > +++ b/net/bridge/br_forward.c
> > @@ -49,6 +49,11 @@ int br_dev_queue_push_xmit(struct sk_buff *skb)
> > } else {
> > skb_push(skb, ETH_HLEN);
> > br_drop_fake_rtable(skb);
> > +
> > + /* clean the NF bridge data */
> > + nf_bridge_put(skb->nf_bridge);
> > + skb->nf_bridge = NULL;
> > +
> > dev_queue_xmit(skb);
> > }
> >
Regarding CONFIG_BRIDGE_NETFILTER you are right, thanks.
>
> I think the header will also be garbage if bridge on bridge with netfilter is used.
> See nf_bridge_save_header.
What header are you referring to? nf_bridge_save_header() saves the header in
skb->nf_bridge->data, which is freed during nf_bridge_put() (assuming
->use reached 0).
--
Antonio Quartulli
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply
* Re: [RFC net] bridge: clean the nf_bridge status when forwarding the skb
From: Stephen Hemminger @ 2013-09-26 21:10 UTC (permalink / raw)
To: Antonio Quartulli; +Cc: netdev, bridge, David S. Miller, Antonio Quartulli
In-Reply-To: <1380226790-513-1-git-send-email-antonio@meshcoding.com>
On Thu, 26 Sep 2013 22:19:50 +0200
Antonio Quartulli <antonio@meshcoding.com> wrote:
> From: Antonio Quartulli <antonio@open-mesh.com>
>
> Even if enslaving a bridge interface into another bridge is
> forbidden, it is still possible to create a chain of
> virtual interfaces including two distinct bridges.
>
> In this case, the skb entering the second bridge could have
> the nf_bridge field already set due to a previous operation
> and consequently lead to a wrong processing of the packet
> itself.
>
> To prevent this behaviour release and set to NULL the
> nf_bridge field of the skb when exiting the bridge interface.
>
> Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
> ---
>
> I am not sure if this is a wanted behaviour or a real BUG. I found this
> "misbehaviour" while testing batman-adv with the following configuration:
>
> - br0 (bridge interface) having bat0 and eth0 as slaves
> - bat0 (which is a virtual interface provided by the batman-adv module and that
> works similarly to a bridge - to some extends) having br1 as slave
> - br1 (second bridge interface) having eth1 as slave
>
> Then follow these events:
> - a broadcast packet arrives on eth0
> - the skb enters br0 and skb->nf_bridge gets initialised and used
> - the skb enters bat0 and the packet *gets encapsulated in the batman-adv packet
> which adds a batman-adv header and another Ethernet header*
> - the skb enters br1 and gets ruined because nf_bridge_maybe_copy_header() (in
> br_dev_queue_push_xmit()) will try to restore an header that does not make
> sense anymore.
>
> With this patch the nf_bridge gets de-initialised before exiting br0 and
> therefore it is processed properly inside br1: nf_bridge_maybe_copy_header()
> does not take place at all because nf_bridge is never initialised (the packet is
> non-IP since it is a batman-adv packet)
>
> To the developers of the bridge module I would like to ask:
> 1) is skb->nf_bridge allowed to be non NULL when entering br_dev_xmit() ? If so,
> when is this supposed to happen?
>
> 2) do you think this patch is logically correct but the nf_bridge release should
> be done in batman-adv since it is the one re-encapsulating the packet?
>
>
> I hope I have made the problem clear.
>
> Best regards,
>
>
> net/bridge/br_forward.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c
> index 4b81b14..65864bc 100644
> --- a/net/bridge/br_forward.c
> +++ b/net/bridge/br_forward.c
> @@ -49,6 +49,11 @@ int br_dev_queue_push_xmit(struct sk_buff *skb)
> } else {
> skb_push(skb, ETH_HLEN);
> br_drop_fake_rtable(skb);
> +
> + /* clean the NF bridge data */
> + nf_bridge_put(skb->nf_bridge);
> + skb->nf_bridge = NULL;
> +
> dev_queue_xmit(skb);
> }
>
I think the header will also be garbage if bridge on bridge with netfilter is used.
See nf_bridge_save_header.
^ permalink raw reply
* Re: [RFC net] bridge: clean the nf_bridge status when forwarding the skb
From: Stephen Hemminger @ 2013-09-26 21:08 UTC (permalink / raw)
To: Antonio Quartulli; +Cc: David S. Miller, bridge, netdev, Antonio Quartulli
In-Reply-To: <1380226790-513-1-git-send-email-antonio@meshcoding.com>
On Thu, 26 Sep 2013 22:19:50 +0200
Antonio Quartulli <antonio@meshcoding.com> wrote:
> From: Antonio Quartulli <antonio@open-mesh.com>
>
> Even if enslaving a bridge interface into another bridge is
> forbidden, it is still possible to create a chain of
> virtual interfaces including two distinct bridges.
>
> In this case, the skb entering the second bridge could have
> the nf_bridge field already set due to a previous operation
> and consequently lead to a wrong processing of the packet
> itself.
>
> To prevent this behaviour release and set to NULL the
> nf_bridge field of the skb when exiting the bridge interface.
>
> Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
> ---
>
> I am not sure if this is a wanted behaviour or a real BUG. I found this
> "misbehaviour" while testing batman-adv with the following configuration:
>
> - br0 (bridge interface) having bat0 and eth0 as slaves
> - bat0 (which is a virtual interface provided by the batman-adv module and that
> works similarly to a bridge - to some extends) having br1 as slave
> - br1 (second bridge interface) having eth1 as slave
>
> Then follow these events:
> - a broadcast packet arrives on eth0
> - the skb enters br0 and skb->nf_bridge gets initialised and used
> - the skb enters bat0 and the packet *gets encapsulated in the batman-adv packet
> which adds a batman-adv header and another Ethernet header*
> - the skb enters br1 and gets ruined because nf_bridge_maybe_copy_header() (in
> br_dev_queue_push_xmit()) will try to restore an header that does not make
> sense anymore.
>
> With this patch the nf_bridge gets de-initialised before exiting br0 and
> therefore it is processed properly inside br1: nf_bridge_maybe_copy_header()
> does not take place at all because nf_bridge is never initialised (the packet is
> non-IP since it is a batman-adv packet)
>
> To the developers of the bridge module I would like to ask:
> 1) is skb->nf_bridge allowed to be non NULL when entering br_dev_xmit() ? If so,
> when is this supposed to happen?
>
> 2) do you think this patch is logically correct but the nf_bridge release should
> be done in batman-adv since it is the one re-encapsulating the packet?
>
>
> I hope I have made the problem clear.
>
> Best regards,
>
>
> net/bridge/br_forward.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c
> index 4b81b14..65864bc 100644
> --- a/net/bridge/br_forward.c
> +++ b/net/bridge/br_forward.c
> @@ -49,6 +49,11 @@ int br_dev_queue_push_xmit(struct sk_buff *skb)
> } else {
> skb_push(skb, ETH_HLEN);
> br_drop_fake_rtable(skb);
> +
> + /* clean the NF bridge data */
> + nf_bridge_put(skb->nf_bridge);
> + skb->nf_bridge = NULL;
> +
> dev_queue_xmit(skb);
> }
>
You need to bracket this with CONFIG_BRIDGE_NETFILTER
since nf_bridge is only in skbuff if that option is enabled.
^ permalink raw reply
* [RFC net] bridge: clean the nf_bridge status when forwarding the skb
From: Antonio Quartulli @ 2013-09-26 20:19 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: David S. Miller, bridge, netdev, Antonio Quartulli
From: Antonio Quartulli <antonio@open-mesh.com>
Even if enslaving a bridge interface into another bridge is
forbidden, it is still possible to create a chain of
virtual interfaces including two distinct bridges.
In this case, the skb entering the second bridge could have
the nf_bridge field already set due to a previous operation
and consequently lead to a wrong processing of the packet
itself.
To prevent this behaviour release and set to NULL the
nf_bridge field of the skb when exiting the bridge interface.
Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
---
I am not sure if this is a wanted behaviour or a real BUG. I found this
"misbehaviour" while testing batman-adv with the following configuration:
- br0 (bridge interface) having bat0 and eth0 as slaves
- bat0 (which is a virtual interface provided by the batman-adv module and that
works similarly to a bridge - to some extends) having br1 as slave
- br1 (second bridge interface) having eth1 as slave
Then follow these events:
- a broadcast packet arrives on eth0
- the skb enters br0 and skb->nf_bridge gets initialised and used
- the skb enters bat0 and the packet *gets encapsulated in the batman-adv packet
which adds a batman-adv header and another Ethernet header*
- the skb enters br1 and gets ruined because nf_bridge_maybe_copy_header() (in
br_dev_queue_push_xmit()) will try to restore an header that does not make
sense anymore.
With this patch the nf_bridge gets de-initialised before exiting br0 and
therefore it is processed properly inside br1: nf_bridge_maybe_copy_header()
does not take place at all because nf_bridge is never initialised (the packet is
non-IP since it is a batman-adv packet)
To the developers of the bridge module I would like to ask:
1) is skb->nf_bridge allowed to be non NULL when entering br_dev_xmit() ? If so,
when is this supposed to happen?
2) do you think this patch is logically correct but the nf_bridge release should
be done in batman-adv since it is the one re-encapsulating the packet?
I hope I have made the problem clear.
Best regards,
net/bridge/br_forward.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c
index 4b81b14..65864bc 100644
--- a/net/bridge/br_forward.c
+++ b/net/bridge/br_forward.c
@@ -49,6 +49,11 @@ int br_dev_queue_push_xmit(struct sk_buff *skb)
} else {
skb_push(skb, ETH_HLEN);
br_drop_fake_rtable(skb);
+
+ /* clean the NF bridge data */
+ nf_bridge_put(skb->nf_bridge);
+ skb->nf_bridge = NULL;
+
dev_queue_xmit(skb);
}
--
1.8.1.5
^ permalink raw reply related
* Re: [PATCH 00/51] DMA mask changes
From: Rafał Miłecki @ 2013-09-26 20:23 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: alsa-devel, b43-dev, devel@driverdev.osuosl.org, devicetree,
dri-devel, e1000-devel, linux-arm-kernel@lists.infradead.org,
linux-crypto, linux-doc, linux-fbdev, linux-ide, linux-media,
linux-mmc, linux-nvme, linux-omap, linux ppc dev,
linux-samsung-soc, Linux SCSI List, linux-tegra, linux-usb,
linux-wireless@vger.kernel.org, Network Development,
Solarflare linux maintainers <linux-ne
In-Reply-To: <20130919212235.GD12758@n2100.arm.linux.org.uk>
2013/9/19 Russell King - ARM Linux <linux@arm.linux.org.uk>:
> This email is only being sent to the mailing lists in question, not to
> anyone personally. The list of individuals is far to great to do that.
> I'm hoping no mailing lists reject the patches based on the number of
> recipients.
Huh, I think it was enough to send only 3 patches to the b43-dev@. Like:
[PATCH 01/51] DMA-API: provide a helper to set both DMA and coherent DMA masks
[PATCH 14/51] DMA-API: net: b43: (...)
[PATCH 15/51] DMA-API: net: b43legacy: (...)
;)
I believe Joe has some nice script for doing it that way. When fixing
some coding style / formatting, he sends only related patches to the
given ML.
--
Rafał
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: per-PID network stats files in /proc
From: Matthew Hall @ 2013-09-26 20:12 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: netdev
In-Reply-To: <20130924212238.GA6673@mhcomputing.net>
On Tue, Sep 24, 2013 at 02:22:39PM -0700, Matthew Hall wrote:
> On Tue, Sep 24, 2013 at 02:04:35PM -0700, Stephen Hemminger wrote:
> > You could do what you want by putting each process in own network
> > namespace, but that might be more work than you want to bother with.
>
> Putting my one process or group of processes into one namespace, separate from
> the one the rest of the system uses, could be perfectly OK actually.
>
> So I'm going to look into this and see if it's possible. At least it would
> give me a better route than where I am right now.
>
> Thanks!
> Matthew.
Hi Stephen,
I took a look at this possibility and it seems very powerful but not so easy
to use. Is there a way to make a netns that's like a "child node" of another
netns, and inherits all the settings of the default one, unless I configured
separate settings for this "child netns"? Otherwise the netns has to duplicate
everything already configured on the host system even if it's unchanged from
the standard settings.
Thanks,
Matthew.
^ permalink raw reply
* Re: [PATCH] via-rhine: fix VLAN priority field (PCP, IEEE 802.1p)
From: David Miller @ 2013-09-26 20:09 UTC (permalink / raw)
To: rl; +Cc: netdev, peter.bostrom
In-Reply-To: <20130921122411.GA25499@core.hellgate.ch>
From: Roger Luethi <rl@hellgate.ch>
Date: Sat, 21 Sep 2013 14:24:11 +0200
> From: Roger Luethi <rl@hellgate.ch>
>
> Outgoing packets sent by via-rhine have their VLAN PCP field off by one
> (when hardware acceleration is enabled). The TX descriptor expects only VID
> and PCP (without a CFI/DEI bit).
>
> Peter Boström noticed and reported the bug.
>
> Signed-off-by: Roger Luethi <rl@hellgate.ch>
Applied, thanks.
^ permalink raw reply
* Re: [PATCH v5 net-next 00/27] bonding: use neighbours instead of own lists
From: David Miller @ 2013-09-26 20:02 UTC (permalink / raw)
To: vfalico; +Cc: netdev, jiri, fubar, andy, dm, kaber, edumazet, alexander.h.duyck
In-Reply-To: <1380093632-1842-1-git-send-email-vfalico@redhat.com>
From: Veaceslav Falico <vfalico@redhat.com>
Date: Wed, 25 Sep 2013 09:20:05 +0200
> This patchset introduces all the needed infrastructure, on top of current
> adjacent lists, to be able to remove bond's slave_list/slave->list. The
> overhead in memory/CPU is minimal, and after the patchset bonding can rely
> on its slave-related functions, given the proper locking. I've done some
> netperf benchmarks on a vm, and the delta was about 0.1gbps for 35gbps as a
> whole, so no speed fluctuations.
>
> It also automatically creates lower/upper and master symlinks in dev's
> sysfs directory.
>
> CC: Jay Vosburgh <fubar@us.ibm.com>
> CC: Andy Gospodarek <andy@greyhouse.net>
> CC: Dimitris Michailidis <dm@chelsio.com>
> CC: "David S. Miller" <davem@davemloft.net>
> CC: Patrick McHardy <kaber@trash.net>
> CC: Eric Dumazet <edumazet@google.com>
> CC: Jiri Pirko <jiri@resnulli.us>
> CC: Alexander Duyck <alexander.h.duyck@intel.com>
> Signed-off-by: Veaceslav Falico <vfalico@redhat.com>
Ok, looks good to me, series applied, thanks!
^ permalink raw reply
* Re: [PATCH] ipvs: improved SH fallback strategy
From: Julian Anastasov @ 2013-09-26 20:05 UTC (permalink / raw)
To: Alexander Frolkin
Cc: Simon Horman, Sergei Shtylyov, lvs-devel, Wensong Zhang, netdev,
linux-kernel
In-Reply-To: <20130926100540.GB27583@eldamar.org.uk>
Hello,
On Thu, 26 Sep 2013, Alexander Frolkin wrote:
> Improve the SH fallback realserver selection strategy.
>
> With sh and sh-fallback, if a realserver is down, this attempts to
> distribute the traffic that would have gone to that server evenly
> among the remaining servers.
>
> Signed-off-by: Alexander Frolkin <avf@eldamar.org.uk>
Looks correct to me, just fix the below indentations.
Also, please use version number for your patches, eg.
[PATCHv2] ipvs: ...
> diff --git a/net/netfilter/ipvs/ip_vs_sh.c b/net/netfilter/ipvs/ip_vs_sh.c
> index 3588fae..533ea53 100644
> --- a/net/netfilter/ipvs/ip_vs_sh.c
> +++ b/net/netfilter/ipvs/ip_vs_sh.c
> + IP_VS_DBG_BUF(6, "SH: selected unavailable server "
> + "%s:%d, reselecting",
> + IP_VS_DBG_ADDR(svc->af, &dest->addr),
> + ntohs(dest->port));
Indentation:
IP_VS_DBG_BUF(6, "SH: selected unavailable server %s:%d, reselecting",
IP_VS_DBG_ADDR(svc->af, &dest->addr), ntohs(dest->port));
> + IP_VS_DBG_BUF(6, "SH: selected unavailable "
> + "server %s:%d (offset %d), reselecting",
> + IP_VS_DBG_ADDR(svc->af, &dest->addr),
> + ntohs(dest->port),
> + roffset);
Indentation:
IP_VS_DBG_BUF(6, "SH: selected unavailable "
"server %s:%d (offset %d), reselecting",
IP_VS_DBG_ADDR(svc->af, &dest->addr),
ntohs(dest->port), roffset);
Regards
--
Julian Anastasov <ja@ssi.bg>
^ permalink raw reply
* Re: [PATCH 1/4] [RFC] net: Explicitly initialize u64_stats_sync structures for lockdep
From: Eric Dumazet @ 2013-09-26 19:46 UTC (permalink / raw)
To: John Stultz
Cc: LKML, Thomas Petazzoni, Mirko Lindner, Stephen Hemminger,
Roger Luethi, Patrick McHardy, Rusty Russell, Michael S. Tsirkin,
Alexey Kuznetsov, James Morris, Hideaki YOSHIFUJI, Wensong Zhang,
Simon Horman, Julian Anastasov, Jesse Gross, Mathieu Desnoyers,
Steven Rostedt, Peter Zijlstra, Ingo Molnar, Thomas Gleixner,
David S. Miller, netdev, netfilter-devel
In-Reply-To: <52448D58.9060503@linaro.org>
On Thu, 2013-09-26 at 12:39 -0700, John Stultz wrote:
> > No objection, though I worry that will obscure the lockdep key name,
> > causing all the u64_stat_sync locks to appear the same.
> >
> > I'll give it a quick shot to see if the compiler inlines it well enough
> > to preserve the name.
> Yea, unfortunately this causes the reports to all look like:
>
>
> So I suspect using the macro is the best approach here. Is that ok?
Oh well, right :)
^ permalink raw reply
* Re: [PATCH 1/4] [RFC] net: Explicitly initialize u64_stats_sync structures for lockdep
From: John Stultz @ 2013-09-26 19:39 UTC (permalink / raw)
To: Eric Dumazet
Cc: LKML, Thomas Petazzoni, Mirko Lindner, Stephen Hemminger,
Roger Luethi, Patrick McHardy, Rusty Russell, Michael S. Tsirkin,
Alexey Kuznetsov, James Morris, Hideaki YOSHIFUJI, Wensong Zhang,
Simon Horman, Julian Anastasov, Jesse Gross, Mathieu Desnoyers,
Steven Rostedt, Peter Zijlstra, Ingo Molnar, Thomas Gleixner,
David S. Miller, netdev, netfilter-devel
In-Reply-To: <52448C46.2050107@linaro.org>
On 09/26/2013 12:34 PM, John Stultz wrote:
> On 09/26/2013 12:26 PM, Eric Dumazet wrote:
>> On Thu, 2013-09-26 at 11:34 -0700, John Stultz wrote:
>>> In order to enable lockdep on seqcount/seqlock structures, we
>>> must explicitly initialize any locks.
>>>
>>> diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h
>>> index 8da8c4e..c450e11 100644
>>> --- a/include/linux/u64_stats_sync.h
>>> +++ b/include/linux/u64_stats_sync.h
>>> @@ -67,6 +67,13 @@ struct u64_stats_sync {
>>> #endif
>>> };
>>>
>>> +
>>> +#if BITS_PER_LONG == 32 && defined(CONFIG_SMP)
>>> +#define u64_stats_init(syncp) seqcount_init(syncp.seq)
>>> +#else
>>> +#define u64_stats_init(syncp)
>>> +#endif
>>> +
>> I would prefer a function.
>>
>> static inline void u64_stats_init(struct u64_stats_sync *syncp)
>> {
>> #if BITS_PER_LONG == 32 && defined(CONFIG_SMP)
>> seqcount_init(&syncp->seq);
>> #endif
>> }
> No objection, though I worry that will obscure the lockdep key name,
> causing all the u64_stat_sync locks to appear the same.
>
> I'll give it a quick shot to see if the compiler inlines it well enough
> to preserve the name.
Yea, unfortunately this causes the reports to all look like:
[ 10.370105] Possible unsafe locking scenario:
[ 10.370105]
[ 10.370105] CPU0
[ 10.370105] ----
[ 10.370105] lock(&syncp->seq#5);
[ 10.370105] <Interrupt>
[ 10.370105] lock(&syncp->seq#5);
[ 10.370105]
[ 10.370105] *** DEADLOCK ***
Rather then:
[ 12.150105] Possible unsafe locking scenario:
[ 12.150105]
[ 12.150105] CPU0
[ 12.150105] ----
[ 12.150105] lock(&af_inet6_stats->syncp.seq);
[ 12.150105] <Interrupt>
[ 12.150105] lock(&af_inet6_stats->syncp.seq);
[ 12.150105]
[ 12.150105] *** DEADLOCK ***
So I suspect using the macro is the best approach here. Is that ok?
thanks
-john
^ permalink raw reply
* Re: [PATCH 1/4] [RFC] net: Explicitly initialize u64_stats_sync structures for lockdep
From: John Stultz @ 2013-09-26 19:34 UTC (permalink / raw)
To: Eric Dumazet
Cc: LKML, Thomas Petazzoni, Mirko Lindner, Stephen Hemminger,
Roger Luethi, Patrick McHardy, Rusty Russell, Michael S. Tsirkin,
Alexey Kuznetsov, James Morris, Hideaki YOSHIFUJI, Wensong Zhang,
Simon Horman, Julian Anastasov, Jesse Gross, Mathieu Desnoyers,
Steven Rostedt, Peter Zijlstra, Ingo Molnar, Thomas Gleixner,
David S. Miller, netdev, netfilter-devel
In-Reply-To: <1380223585.3165.205.camel@edumazet-glaptop>
On 09/26/2013 12:26 PM, Eric Dumazet wrote:
> On Thu, 2013-09-26 at 11:34 -0700, John Stultz wrote:
>> In order to enable lockdep on seqcount/seqlock structures, we
>> must explicitly initialize any locks.
>>
>> diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h
>> index 8da8c4e..c450e11 100644
>> --- a/include/linux/u64_stats_sync.h
>> +++ b/include/linux/u64_stats_sync.h
>> @@ -67,6 +67,13 @@ struct u64_stats_sync {
>> #endif
>> };
>>
>> +
>> +#if BITS_PER_LONG == 32 && defined(CONFIG_SMP)
>> +#define u64_stats_init(syncp) seqcount_init(syncp.seq)
>> +#else
>> +#define u64_stats_init(syncp)
>> +#endif
>> +
> I would prefer a function.
>
> static inline void u64_stats_init(struct u64_stats_sync *syncp)
> {
> #if BITS_PER_LONG == 32 && defined(CONFIG_SMP)
> seqcount_init(&syncp->seq);
> #endif
> }
No objection, though I worry that will obscure the lockdep key name,
causing all the u64_stat_sync locks to appear the same.
I'll give it a quick shot to see if the compiler inlines it well enough
to preserve the name.
thanks
-john
^ permalink raw reply
* Re: [PATCH 00/11 - GIT PULL] drivers: net: Last block of Remove extern from function prototypes
From: David Miller @ 2013-09-26 19:31 UTC (permalink / raw)
To: joe
Cc: netdev, linux-kernel, wimax, ath10k, linux-wireless, ath9k-devel,
brcm80211-dev-list
In-Reply-To: <1380218576.17366.76.camel@joe-AO722>
From: Joe Perches <joe@perches.com>
Date: Thu, 26 Sep 2013 11:02:56 -0700
> Want those in one more pull request or
> maybe individually?
Try to keep the chunks less than a dozen or so patches at a ti me.
Thanks.
^ permalink raw reply
* Re: [PATCH 1/4] [RFC] net: Explicitly initialize u64_stats_sync structures for lockdep
From: Eric Dumazet @ 2013-09-26 19:26 UTC (permalink / raw)
To: John Stultz
Cc: LKML, Thomas Petazzoni, Mirko Lindner, Stephen Hemminger,
Roger Luethi, Patrick McHardy, Rusty Russell, Michael S. Tsirkin,
Alexey Kuznetsov, James Morris, Hideaki YOSHIFUJI, Wensong Zhang,
Simon Horman, Julian Anastasov, Jesse Gross, Mathieu Desnoyers,
Steven Rostedt, Peter Zijlstra, Ingo Molnar, Thomas Gleixner,
David S. Miller, netdev, netfilter-devel
In-Reply-To: <1380220464-28840-2-git-send-email-john.stultz@linaro.org>
On Thu, 2013-09-26 at 11:34 -0700, John Stultz wrote:
> In order to enable lockdep on seqcount/seqlock structures, we
> must explicitly initialize any locks.
>
> diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h
> index 8da8c4e..c450e11 100644
> --- a/include/linux/u64_stats_sync.h
> +++ b/include/linux/u64_stats_sync.h
> @@ -67,6 +67,13 @@ struct u64_stats_sync {
> #endif
> };
>
> +
> +#if BITS_PER_LONG == 32 && defined(CONFIG_SMP)
> +#define u64_stats_init(syncp) seqcount_init(syncp.seq)
> +#else
> +#define u64_stats_init(syncp)
> +#endif
> +
I would prefer a function.
static inline void u64_stats_init(struct u64_stats_sync *syncp)
{
#if BITS_PER_LONG == 32 && defined(CONFIG_SMP)
seqcount_init(&syncp->seq);
#endif
}
^ permalink raw reply
* [PATCH 09/21] microblaze: clean-up prom.h implicit includes
From: Rob Herring @ 2013-09-26 18:50 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA
Cc: Grant Likely, Rob Herring, Michal Simek,
microblaze-uclinux-rVRm/Wmeqae7NGdpmJTKYQ,
netdev-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <1380221456-11192-1-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
From: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
While powerpc is a mess of implicit includes by prom.h, microblaze just
copied this and is easily fixed. Add the necessary explicit includes and
remove unnecessary includes and other parts from prom.h
Signed-off-by: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
Cc: Michal Simek <monstr-pSz03upnqPeHXe+LvDLADg@public.gmane.org>
Cc: microblaze-uclinux-rVRm/Wmeqae7NGdpmJTKYQ@public.gmane.org
Cc: netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
---
arch/microblaze/include/asm/prom.h | 28 +---------------------------
arch/microblaze/kernel/prom.c | 1 +
arch/microblaze/kernel/setup.c | 1 +
arch/microblaze/kernel/timer.c | 1 +
arch/microblaze/pci/pci-common.c | 1 +
drivers/net/ethernet/xilinx/ll_temac_main.c | 1 +
6 files changed, 6 insertions(+), 27 deletions(-)
diff --git a/arch/microblaze/include/asm/prom.h b/arch/microblaze/include/asm/prom.h
index 9977816..f05bedc 100644
--- a/arch/microblaze/include/asm/prom.h
+++ b/arch/microblaze/include/asm/prom.h
@@ -11,17 +11,10 @@
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
-
-#include <linux/of.h> /* linux/of.h gets to determine #include ordering */
-
#ifndef _ASM_MICROBLAZE_PROM_H
#define _ASM_MICROBLAZE_PROM_H
-#ifdef __KERNEL__
-#ifndef __ASSEMBLY__
-#include <linux/types.h>
-#include <asm/irq.h>
-#include <linux/atomic.h>
+#include <linux/of.h>
#define HAVE_ARCH_DEVTREE_FIXUPS
@@ -42,23 +35,4 @@ extern unsigned long pci_address_to_pio(phys_addr_t address);
#define pci_address_to_pio pci_address_to_pio
#endif /* CONFIG_PCI */
-/* Parse the ibm,dma-window property of an OF node into the busno, phys and
- * size parameters.
- */
-void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
- unsigned long *busno, unsigned long *phys, unsigned long *size);
-
-extern void kdump_move_device_tree(void);
-
-#endif /* __ASSEMBLY__ */
-#endif /* __KERNEL__ */
-
-/* These includes are put at the bottom because they may contain things
- * that are overridden by this file. Ideally they shouldn't be included
- * by this file, but there are a bunch of .c files that currently depend
- * on it. Eventually they will be cleaned up. */
-#include <linux/of_fdt.h>
-#include <linux/of_irq.h>
-#include <linux/platform_device.h>
-
#endif /* _ASM_MICROBLAZE_PROM_H */
diff --git a/arch/microblaze/kernel/prom.c b/arch/microblaze/kernel/prom.c
index 0c4453f..8118f03 100644
--- a/arch/microblaze/kernel/prom.c
+++ b/arch/microblaze/kernel/prom.c
@@ -30,6 +30,7 @@
#include <linux/debugfs.h>
#include <linux/irq.h>
#include <linux/memblock.h>
+#include <linux/of_fdt.h>
#include <asm/prom.h>
#include <asm/page.h>
diff --git a/arch/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c
index 0775e03..15b4ab1 100644
--- a/arch/microblaze/kernel/setup.c
+++ b/arch/microblaze/kernel/setup.c
@@ -16,6 +16,7 @@
#include <linux/initrd.h>
#include <linux/console.h>
#include <linux/debugfs.h>
+#include <linux/of_fdt.h>
#include <asm/setup.h>
#include <asm/sections.h>
diff --git a/arch/microblaze/kernel/timer.c b/arch/microblaze/kernel/timer.c
index e4b3f33..827df4d 100644
--- a/arch/microblaze/kernel/timer.c
+++ b/arch/microblaze/kernel/timer.c
@@ -15,6 +15,7 @@
#include <linux/clk.h>
#include <linux/clockchips.h>
#include <linux/of_address.h>
+#include <linux/of_irq.h>
#include <asm/cpuinfo.h>
#include <linux/cnt32_to_63.h>
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 1b93bf0..7c8a352 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -29,6 +29,7 @@
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/of_address.h>
+#include <linux/of_irq.h>
#include <linux/of_pci.h>
#include <linux/export.h>
diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c
index b88121f..22478d5 100644
--- a/drivers/net/ethernet/xilinx/ll_temac_main.c
+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
@@ -36,6 +36,7 @@
#include <linux/netdevice.h>
#include <linux/of.h>
#include <linux/of_device.h>
+#include <linux/of_irq.h>
#include <linux/of_mdio.h>
#include <linux/of_platform.h>
#include <linux/of_address.h>
--
1.8.1.2
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
* [PATCH 01/21] drivers: remove unnecessary prom.h includes
From: Rob Herring @ 2013-09-26 18:50 UTC (permalink / raw)
To: linux-kernel, devicetree
Cc: Grant Likely, Rob Herring, Wolfgang Grandegger, Marc Kleine-Budde,
linux-can, netdev
In-Reply-To: <1380221456-11192-1-git-send-email-robherring2@gmail.com>
From: Rob Herring <rob.herring@calxeda.com>
Remove unnecessary prom.h includes in preparation to remove implicit
includes of prom.h.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Cc: Wolfgang Grandegger <wg@grandegger.com>
Cc: Marc Kleine-Budde <mkl@pengutronix.de>
Cc: linux-can@vger.kernel.org
Cc: netdev@vger.kernel.org
---
drivers/net/can/grcan.c | 3 ---
drivers/net/can/sja1000/sja1000_of_platform.c | 1 -
2 files changed, 4 deletions(-)
diff --git a/drivers/net/can/grcan.c b/drivers/net/can/grcan.c
index 6aa737a..ab506d6 100644
--- a/drivers/net/can/grcan.c
+++ b/drivers/net/can/grcan.c
@@ -34,10 +34,7 @@
#include <linux/io.h>
#include <linux/can/dev.h>
#include <linux/spinlock.h>
-
#include <linux/of_platform.h>
-#include <asm/prom.h>
-
#include <linux/of_irq.h>
#include <linux/dma-mapping.h>
diff --git a/drivers/net/can/sja1000/sja1000_of_platform.c b/drivers/net/can/sja1000/sja1000_of_platform.c
index 31ad339..047accd 100644
--- a/drivers/net/can/sja1000/sja1000_of_platform.c
+++ b/drivers/net/can/sja1000/sja1000_of_platform.c
@@ -44,7 +44,6 @@
#include <linux/of_platform.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
-#include <asm/prom.h>
#include "sja1000.h"
--
1.8.1.2
^ permalink raw reply related
* [PATCH 1/4] [RFC] net: Explicitly initialize u64_stats_sync structures for lockdep
From: John Stultz @ 2013-09-26 18:34 UTC (permalink / raw)
To: LKML
Cc: John Stultz, Thomas Petazzoni, Mirko Lindner, Stephen Hemminger,
Roger Luethi, Patrick McHardy, Rusty Russell, Michael S. Tsirkin,
Alexey Kuznetsov, James Morris, Hideaki YOSHIFUJI, Wensong Zhang,
Simon Horman, Julian Anastasov, Jesse Gross, Mathieu Desnoyers,
Steven Rostedt, Peter Zijlstra, Ingo Molnar, Thomas Gleixner,
David S. Miller, netdev, netfilter-devel
In-Reply-To: <1380220464-28840-1-git-send-email-john.stultz@linaro.org>
In order to enable lockdep on seqcount/seqlock structures, we
must explicitly initialize any locks.
The u64_stats_sync structure, uses a seqcount, and thus we need
to introduce a u64_stats_init() function and use it to initialize
the structure.
This unfortunately adds a lot of fairly trivial initialization code
to a number of drivers. But the benefit of ensuring correctness makes
this worth while.
Because these changes are required for lockdep to be enabled, and the
changes are quite trivial, I've not yet split this patch out into 30-some
separate patches, as I figured it would be better to get the various
maintainers thoughts on how to best merge this change along with
the seqcount lockdep enablement code.
Feedback would be appreciated!
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Mirko Lindner <mlindner@marvell.com>
Cc: Stephen Hemminger <stephen@networkplumber.org>
Cc: Roger Luethi <rl@hellgate.ch>
Cc: Patrick McHardy <kaber@trash.net>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: James Morris <jmorris@namei.org>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: Wensong Zhang <wensong@linux-vs.org>
Cc: Simon Horman <horms@verge.net.au>
Cc: Julian Anastasov <ja@ssi.bg>
Cc: Jesse Gross <jesse@nicira.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Cc: netfilter-devel@vger.kernel.org
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
drivers/net/dummy.c | 6 ++++++
drivers/net/ethernet/emulex/benet/be_main.c | 4 ++++
drivers/net/ethernet/intel/igb/igb_main.c | 5 +++++
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 4 ++++
drivers/net/ethernet/marvell/mvneta.c | 3 +++
drivers/net/ethernet/marvell/sky2.c | 3 +++
drivers/net/ethernet/neterion/vxge/vxge-main.c | 4 ++++
drivers/net/ethernet/nvidia/forcedeth.c | 2 ++
drivers/net/ethernet/realtek/8139too.c | 3 +++
drivers/net/ethernet/tile/tilepro.c | 2 ++
drivers/net/ethernet/via/via-rhine.c | 3 +++
drivers/net/ifb.c | 5 +++++
drivers/net/loopback.c | 6 ++++++
drivers/net/macvlan.c | 7 +++++++
drivers/net/nlmon.c | 8 ++++++++
drivers/net/team/team.c | 6 ++++++
drivers/net/team/team_mode_loadbalance.c | 9 ++++++++-
drivers/net/veth.c | 8 ++++++++
drivers/net/virtio_net.c | 8 ++++++++
drivers/net/vxlan.c | 8 ++++++++
drivers/net/xen-netfront.c | 6 ++++++
include/linux/u64_stats_sync.h | 7 +++++++
net/8021q/vlan_dev.c | 9 ++++++++-
net/bridge/br_device.c | 7 +++++++
net/ipv4/af_inet.c | 14 ++++++++++++++
net/ipv4/ip_tunnel.c | 8 +++++++-
net/ipv6/addrconf.c | 14 ++++++++++++++
net/ipv6/af_inet6.c | 14 ++++++++++++++
net/ipv6/ip6_gre.c | 15 +++++++++++++++
net/ipv6/ip6_tunnel.c | 7 +++++++
net/ipv6/sit.c | 15 +++++++++++++++
net/netfilter/ipvs/ip_vs_ctl.c | 25 ++++++++++++++++++++++---
net/openvswitch/datapath.c | 6 ++++++
net/openvswitch/vport.c | 8 ++++++++
34 files changed, 253 insertions(+), 6 deletions(-)
diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c
index b710c6b..bd8f84b 100644
--- a/drivers/net/dummy.c
+++ b/drivers/net/dummy.c
@@ -88,10 +88,16 @@ static netdev_tx_t dummy_xmit(struct sk_buff *skb, struct net_device *dev)
static int dummy_dev_init(struct net_device *dev)
{
+ int i;
dev->dstats = alloc_percpu(struct pcpu_dstats);
if (!dev->dstats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct pcpu_dstats *dstats;
+ dstats = per_cpu_ptr(dev->dstats, i);
+ u64_stats_init(&dstats->syncp);
+ }
return 0;
}
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 100b528..d2dcf2e 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -2033,6 +2033,9 @@ static int be_tx_qs_create(struct be_adapter *adapter)
if (status)
return status;
+ u64_stats_init(&txo->stats.sync);
+ u64_stats_init(&txo->stats.sync_compl);
+
/* If num_evt_qs is less than num_tx_qs, then more than
* one txq share an eq
*/
@@ -2094,6 +2097,7 @@ static int be_rx_cqs_create(struct be_adapter *adapter)
if (rc)
return rc;
+ u64_stats_init(&rxo->stats.sync);
eq = &adapter->eq_obj[i % adapter->num_evt_qs].q;
rc = be_cmd_cq_create(adapter, cq, eq, false, 3);
if (rc)
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 8cf44f2..b6edb93 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -1223,6 +1223,9 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,
ring->count = adapter->tx_ring_count;
ring->queue_index = txr_idx;
+ u64_stats_init(&ring->tx_syncp);
+ u64_stats_init(&ring->tx_syncp2);
+
/* assign ring to adapter */
adapter->tx_ring[txr_idx] = ring;
@@ -1256,6 +1259,8 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,
ring->count = adapter->rx_ring_count;
ring->queue_index = rxr_idx;
+ u64_stats_init(&ring->rx_syncp);
+
/* assign ring to adapter */
adapter->rx_ring[rxr_idx] = ring;
}
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 0ade0cd..c175036 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -4867,6 +4867,8 @@ int ixgbe_setup_tx_resources(struct ixgbe_ring *tx_ring)
if (!tx_ring->tx_buffer_info)
goto err;
+ u64_stats_init(&tx_ring->syncp);
+
/* round up to nearest 4K */
tx_ring->size = tx_ring->count * sizeof(union ixgbe_adv_tx_desc);
tx_ring->size = ALIGN(tx_ring->size, 4096);
@@ -4949,6 +4951,8 @@ int ixgbe_setup_rx_resources(struct ixgbe_ring *rx_ring)
if (!rx_ring->rx_buffer_info)
goto err;
+ u64_stats_init(&rx_ring->syncp);
+
/* Round up to nearest 4K */
rx_ring->size = rx_ring->count * sizeof(union ixgbe_adv_rx_desc);
rx_ring->size = ALIGN(rx_ring->size, 4096);
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index e35bac7..cb4635c 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -2792,6 +2792,9 @@ static int mvneta_probe(struct platform_device *pdev)
pp = netdev_priv(dev);
+ u64_stats_init(&pp->tx_stats.syncp);
+ u64_stats_init(&pp->rx_stats.syncp);
+
pp->weight = MVNETA_RX_POLL_WEIGHT;
pp->phy_node = phy_node;
pp->phy_interface = phy_mode;
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c
index e09a8c6..339d841 100644
--- a/drivers/net/ethernet/marvell/sky2.c
+++ b/drivers/net/ethernet/marvell/sky2.c
@@ -4763,6 +4763,9 @@ static struct net_device *sky2_init_netdev(struct sky2_hw *hw, unsigned port,
sky2->hw = hw;
sky2->msg_enable = netif_msg_init(debug, default_msg);
+ u64_stats_init(&sky2->tx_stats.syncp);
+ u64_stats_init(&sky2->rx_stats.syncp);
+
/* Auto speed and flow control */
sky2->flags = SKY2_FLAG_AUTO_SPEED | SKY2_FLAG_AUTO_PAUSE;
if (hw->chip_id != CHIP_ID_YUKON_XL)
diff --git a/drivers/net/ethernet/neterion/vxge/vxge-main.c b/drivers/net/ethernet/neterion/vxge/vxge-main.c
index 5a20eaf..44626ec 100644
--- a/drivers/net/ethernet/neterion/vxge/vxge-main.c
+++ b/drivers/net/ethernet/neterion/vxge/vxge-main.c
@@ -2072,6 +2072,10 @@ static int vxge_open_vpaths(struct vxgedev *vdev)
vdev->config.tx_steering_type;
vpath->fifo.ndev = vdev->ndev;
vpath->fifo.pdev = vdev->pdev;
+
+ u64_stats_init(&vpath->fifo.stats.syncp);
+ u64_stats_init(&vpath->ring.stats.syncp);
+
if (vdev->config.tx_steering_type)
vpath->fifo.txq =
netdev_get_tx_queue(vdev->ndev, i);
diff --git a/drivers/net/ethernet/nvidia/forcedeth.c b/drivers/net/ethernet/nvidia/forcedeth.c
index 098b96d..2d045be 100644
--- a/drivers/net/ethernet/nvidia/forcedeth.c
+++ b/drivers/net/ethernet/nvidia/forcedeth.c
@@ -5619,6 +5619,8 @@ static int nv_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
spin_lock_init(&np->lock);
spin_lock_init(&np->hwstats_lock);
SET_NETDEV_DEV(dev, &pci_dev->dev);
+ u64_stats_init(&np->swstats_rx_syncp);
+ u64_stats_init(&np->swstats_tx_syncp);
init_timer(&np->oom_kick);
np->oom_kick.data = (unsigned long) dev;
diff --git a/drivers/net/ethernet/realtek/8139too.c b/drivers/net/ethernet/realtek/8139too.c
index 3ccedeb..c40e9848 100644
--- a/drivers/net/ethernet/realtek/8139too.c
+++ b/drivers/net/ethernet/realtek/8139too.c
@@ -791,6 +791,9 @@ static struct net_device *rtl8139_init_board(struct pci_dev *pdev)
pci_set_master (pdev);
+ u64_stats_init(&tp->rx_stats.syncp);
+ u64_stats_init(&tp->tx_stats.syncp);
+
retry:
/* PIO bar register comes first. */
bar = !use_io;
diff --git a/drivers/net/ethernet/tile/tilepro.c b/drivers/net/ethernet/tile/tilepro.c
index 106be47..edb2e12 100644
--- a/drivers/net/ethernet/tile/tilepro.c
+++ b/drivers/net/ethernet/tile/tilepro.c
@@ -1008,6 +1008,8 @@ static void tile_net_register(void *dev_ptr)
info->egress_timer.data = (long)info;
info->egress_timer.function = tile_net_handle_egress_timer;
+ u64_stats_init(&info->stats.syncp);
+
priv->cpu[my_cpu] = info;
/*
diff --git a/drivers/net/ethernet/via/via-rhine.c b/drivers/net/ethernet/via/via-rhine.c
index c8f088a..13cade2 100644
--- a/drivers/net/ethernet/via/via-rhine.c
+++ b/drivers/net/ethernet/via/via-rhine.c
@@ -987,6 +987,9 @@ static int rhine_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
rp->base = ioaddr;
+ u64_stats_init(&rp->tx_stats.syncp);
+ u64_stats_init(&rp->rx_stats.syncp);
+
/* Get chip registers into a sane state */
rhine_power_init(dev);
rhine_hw_init(dev, pioaddr);
diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c
index a3bed28..c14d39b 100644
--- a/drivers/net/ifb.c
+++ b/drivers/net/ifb.c
@@ -265,6 +265,7 @@ MODULE_PARM_DESC(numifbs, "Number of ifb devices");
static int __init ifb_init_one(int index)
{
struct net_device *dev_ifb;
+ struct ifb_private *dp;
int err;
dev_ifb = alloc_netdev(sizeof(struct ifb_private),
@@ -273,6 +274,10 @@ static int __init ifb_init_one(int index)
if (!dev_ifb)
return -ENOMEM;
+ dp = netdev_priv(dev_ifb);
+ u64_stats_init(&dp->rsync);
+ u64_stats_init(&dp->tsync);
+
dev_ifb->rtnl_link_ops = &ifb_link_ops;
err = register_netdevice(dev_ifb);
if (err < 0)
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c
index a17d85a..ac24c27 100644
--- a/drivers/net/loopback.c
+++ b/drivers/net/loopback.c
@@ -137,10 +137,16 @@ static const struct ethtool_ops loopback_ethtool_ops = {
static int loopback_dev_init(struct net_device *dev)
{
+ int i;
dev->lstats = alloc_percpu(struct pcpu_lstats);
if (!dev->lstats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct pcpu_lstats *lb_stats;
+ lb_stats = per_cpu_ptr(dev->lstats, i);
+ u64_stats_init(&lb_stats->syncp);
+ }
return 0;
}
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index 9bf46bd..0924e51b 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -501,6 +501,7 @@ static int macvlan_init(struct net_device *dev)
{
struct macvlan_dev *vlan = netdev_priv(dev);
const struct net_device *lowerdev = vlan->lowerdev;
+ int i;
dev->state = (dev->state & ~MACVLAN_STATE_MASK) |
(lowerdev->state & MACVLAN_STATE_MASK);
@@ -516,6 +517,12 @@ static int macvlan_init(struct net_device *dev)
if (!vlan->pcpu_stats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct macvlan_pcpu_stats *mvlstats;
+ mvlstats = per_cpu_ptr(vlan->pcpu_stats, i);
+ u64_stats_init(&mvlstats->syncp);
+ }
+
return 0;
}
diff --git a/drivers/net/nlmon.c b/drivers/net/nlmon.c
index b57ce5f..d2bb12b 100644
--- a/drivers/net/nlmon.c
+++ b/drivers/net/nlmon.c
@@ -47,8 +47,16 @@ static int nlmon_change_mtu(struct net_device *dev, int new_mtu)
static int nlmon_dev_init(struct net_device *dev)
{
+ int i;
+
dev->lstats = alloc_percpu(struct pcpu_lstats);
+ for_each_possible_cpu(i) {
+ struct pcpu_lstats *nlmstats;
+ nlmstats = per_cpu_ptr(dev->lstats, i);
+ u64_stats_init(&nlmstats->syncp);
+ }
+
return dev->lstats == NULL ? -ENOMEM : 0;
}
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
index 50e43e6..6574eb8 100644
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@ -1540,6 +1540,12 @@ static int team_init(struct net_device *dev)
if (!team->pcpu_stats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct team_pcpu_stats *team_stats;
+ team_stats = per_cpu_ptr(team->pcpu_stats, i);
+ u64_stats_init(&team_stats->syncp);
+ }
+
for (i = 0; i < TEAM_PORT_HASHENTRIES; i++)
INIT_HLIST_HEAD(&team->en_port_hlist[i]);
INIT_LIST_HEAD(&team->port_list);
diff --git a/drivers/net/team/team_mode_loadbalance.c b/drivers/net/team/team_mode_loadbalance.c
index 829a9cd..d671fc3 100644
--- a/drivers/net/team/team_mode_loadbalance.c
+++ b/drivers/net/team/team_mode_loadbalance.c
@@ -570,7 +570,7 @@ static int lb_init(struct team *team)
{
struct lb_priv *lb_priv = get_lb_priv(team);
lb_select_tx_port_func_t *func;
- int err;
+ int i, err;
/* set default tx port selector */
func = lb_select_tx_port_get_func("hash");
@@ -588,6 +588,13 @@ static int lb_init(struct team *team)
goto err_alloc_pcpu_stats;
}
+ for_each_possible_cpu(i) {
+ struct lb_pcpu_stats *team_lb_stats;
+ team_lb_stats = per_cpu_ptr(lb_priv->pcpu_stats, i);
+ u64_stats_init(&team_lb_stats->syncp);
+ }
+
+
INIT_DELAYED_WORK(&lb_priv->ex->stats.refresh_dw, lb_stats_refresh);
err = team_options_register(team, lb_options, ARRAY_SIZE(lb_options));
diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index eee1f19..46e83e3 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -230,10 +230,18 @@ static int veth_change_mtu(struct net_device *dev, int new_mtu)
static int veth_dev_init(struct net_device *dev)
{
+ int i;
+
dev->vstats = alloc_percpu(struct pcpu_vstats);
if (!dev->vstats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct pcpu_vstats *veth_stats;
+ veth_stats = per_cpu_ptr(dev->vstats, i);
+ u64_stats_init(&veth_stats->syncp);
+ }
+
return 0;
}
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index defec2b..bd12772 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1559,6 +1559,14 @@ static int virtnet_probe(struct virtio_device *vdev)
if (vi->stats == NULL)
goto free;
+ for_each_possible_cpu(i) {
+ struct virtnet_stats *virtnet_stats;
+ virtnet_stats = per_cpu_ptr(vi->stats, i);
+ u64_stats_init(&virtnet_stats->tx_syncp);
+ u64_stats_init(&virtnet_stats->rx_syncp);
+ }
+
+
vi->vq_index = alloc_percpu(int);
if (vi->vq_index == NULL)
goto free_stats;
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index d1292fe..2e4cdc8 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -1886,11 +1886,19 @@ static int vxlan_init(struct net_device *dev)
struct vxlan_dev *vxlan = netdev_priv(dev);
struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id);
struct vxlan_sock *vs;
+ int i;
dev->tstats = alloc_percpu(struct pcpu_tstats);
if (!dev->tstats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct pcpu_tstats *vxlan_stats;
+ vxlan_stats = per_cpu_ptr(dev->tstats, i);
+ u64_stats_init(&vxlan_stats->syncp);
+ }
+
+
spin_lock(&vn->sock_lock);
vs = vxlan_find_sock(dev_net(dev), vxlan->dst_port);
if (vs) {
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index 36808bf..54223ac 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -1338,6 +1338,12 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
if (np->stats == NULL)
goto exit;
+ for_each_possible_cpu(i) {
+ struct netfront_stats *xen_nf_stats;
+ xen_nf_stats = per_cpu_ptr(np->stats, i);
+ u64_stats_init(&xen_nf_stats->syncp);
+ }
+
/* Initialise tx_skbs as a free chain containing every entry. */
np->tx_skb_freelist = 0;
for (i = 0; i < NET_TX_RING_SIZE; i++) {
diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h
index 8da8c4e..c450e11 100644
--- a/include/linux/u64_stats_sync.h
+++ b/include/linux/u64_stats_sync.h
@@ -67,6 +67,13 @@ struct u64_stats_sync {
#endif
};
+
+#if BITS_PER_LONG == 32 && defined(CONFIG_SMP)
+#define u64_stats_init(syncp) seqcount_init(syncp.seq)
+#else
+#define u64_stats_init(syncp)
+#endif
+
static inline void u64_stats_update_begin(struct u64_stats_sync *syncp)
{
#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
index 09bf1c3..4deff3e 100644
--- a/net/8021q/vlan_dev.c
+++ b/net/8021q/vlan_dev.c
@@ -558,7 +558,7 @@ static const struct net_device_ops vlan_netdev_ops;
static int vlan_dev_init(struct net_device *dev)
{
struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
- int subclass = 0;
+ int subclass = 0, i;
netif_carrier_off(dev);
@@ -612,6 +612,13 @@ static int vlan_dev_init(struct net_device *dev)
if (!vlan_dev_priv(dev)->vlan_pcpu_stats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct vlan_pcpu_stats *vlan_stat;
+ vlan_stat = per_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats, i);
+ u64_stats_init(&vlan_stat->syncp);
+ }
+
+
return 0;
}
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index ca04163..7893d64 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -88,11 +88,18 @@ out:
static int br_dev_init(struct net_device *dev)
{
struct net_bridge *br = netdev_priv(dev);
+ int i;
br->stats = alloc_percpu(struct br_cpu_netstats);
if (!br->stats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct br_cpu_netstats *br_dev_stats;
+ br_dev_stats = per_cpu_ptr(br->stats, i);
+ u64_stats_init(&br_dev_stats->syncp);
+ }
+
return 0;
}
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 7a1874b..f40ce62 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -1520,6 +1520,7 @@ int snmp_mib_init(void __percpu *ptr[2], size_t mibsize, size_t align)
ptr[0] = __alloc_percpu(mibsize, align);
if (!ptr[0])
return -ENOMEM;
+
#if SNMP_ARRAY_SZ == 2
ptr[1] = __alloc_percpu(mibsize, align);
if (!ptr[1]) {
@@ -1563,6 +1564,8 @@ static const struct net_protocol icmp_protocol = {
static __net_init int ipv4_mib_init_net(struct net *net)
{
+ int i;
+
if (snmp_mib_init((void __percpu **)net->mib.tcp_statistics,
sizeof(struct tcp_mib),
__alignof__(struct tcp_mib)) < 0)
@@ -1571,6 +1574,17 @@ static __net_init int ipv4_mib_init_net(struct net *net)
sizeof(struct ipstats_mib),
__alignof__(struct ipstats_mib)) < 0)
goto err_ip_mib;
+
+ for_each_possible_cpu(i) {
+ struct ipstats_mib *af_inet_stats;
+ af_inet_stats = per_cpu_ptr(net->mib.ip_statistics[0], i);
+ u64_stats_init(&af_inet_stats->syncp);
+#if SNMP_ARRAY_SZ == 2
+ af_inet_stats = per_cpu_ptr(net->mib.ip_statistics[1], i);
+ u64_stats_init(&af_inet_stats->syncp);
+#endif
+ }
+
if (snmp_mib_init((void __percpu **)net->mib.net_statistics,
sizeof(struct linux_mib),
__alignof__(struct linux_mib)) < 0)
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
index ac9fabe..2b9c945 100644
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -976,13 +976,19 @@ int ip_tunnel_init(struct net_device *dev)
{
struct ip_tunnel *tunnel = netdev_priv(dev);
struct iphdr *iph = &tunnel->parms.iph;
- int err;
+ int i, err;
dev->destructor = ip_tunnel_dev_free;
dev->tstats = alloc_percpu(struct pcpu_tstats);
if (!dev->tstats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct pcpu_tstats *ipt_stats;
+ ipt_stats = per_cpu_ptr(dev->tstats, i);
+ u64_stats_init(&ipt_stats->syncp);
+ }
+
err = gro_cells_init(&tunnel->gro_cells, dev);
if (err) {
free_percpu(dev->tstats);
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index d6ff126..390953c 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -281,10 +281,24 @@ static void addrconf_mod_dad_timer(struct inet6_ifaddr *ifp,
static int snmp6_alloc_dev(struct inet6_dev *idev)
{
+ int i;
+
if (snmp_mib_init((void __percpu **)idev->stats.ipv6,
sizeof(struct ipstats_mib),
__alignof__(struct ipstats_mib)) < 0)
goto err_ip;
+
+ for_each_possible_cpu(i) {
+ struct ipstats_mib *addrconf_stats;
+ addrconf_stats = per_cpu_ptr(idev->stats.ipv6[0], i);
+ u64_stats_init(&addrconf_stats->syncp);
+#if SNMP_ARRAY_SZ == 2
+ addrconf_stats = per_cpu_ptr(idev->stats.ipv6[1], i);
+ u64_stats_init(&addrconf_stats->syncp);
+#endif
+ }
+
+
idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device),
GFP_KERNEL);
if (!idev->stats.icmpv6dev)
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index 7c96100..a8f8559 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -719,6 +719,8 @@ static void ipv6_packet_cleanup(void)
static int __net_init ipv6_init_mibs(struct net *net)
{
+ int i;
+
if (snmp_mib_init((void __percpu **)net->mib.udp_stats_in6,
sizeof(struct udp_mib),
__alignof__(struct udp_mib)) < 0)
@@ -731,6 +733,18 @@ static int __net_init ipv6_init_mibs(struct net *net)
sizeof(struct ipstats_mib),
__alignof__(struct ipstats_mib)) < 0)
goto err_ip_mib;
+
+ for_each_possible_cpu(i) {
+ struct ipstats_mib *af_inet6_stats;
+ af_inet6_stats = per_cpu_ptr(net->mib.ipv6_statistics[0], i);
+ u64_stats_init(&af_inet6_stats->syncp);
+#if SNMP_ARRAY_SZ == 2
+ af_inet6_stats = per_cpu_ptr(net->mib.ipv6_statistics[1], i);
+ u64_stats_init(&af_inet6_stats->syncp);
+#endif
+ }
+
+
if (snmp_mib_init((void __percpu **)net->mib.icmpv6_statistics,
sizeof(struct icmpv6_mib),
__alignof__(struct icmpv6_mib)) < 0)
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
index 6b26e9f..b355cb0 100644
--- a/net/ipv6/ip6_gre.c
+++ b/net/ipv6/ip6_gre.c
@@ -1254,6 +1254,7 @@ static void ip6gre_tunnel_setup(struct net_device *dev)
static int ip6gre_tunnel_init(struct net_device *dev)
{
struct ip6_tnl *tunnel;
+ int i;
tunnel = netdev_priv(dev);
@@ -1271,6 +1272,13 @@ static int ip6gre_tunnel_init(struct net_device *dev)
if (!dev->tstats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct pcpu_tstats *ip6gre_tunnel_stats;
+ ip6gre_tunnel_stats = per_cpu_ptr(dev->tstats, i);
+ u64_stats_init(&ip6gre_tunnel_stats->syncp);
+ }
+
+
return 0;
}
@@ -1451,6 +1459,7 @@ static void ip6gre_netlink_parms(struct nlattr *data[],
static int ip6gre_tap_init(struct net_device *dev)
{
struct ip6_tnl *tunnel;
+ int i;
tunnel = netdev_priv(dev);
@@ -1464,6 +1473,12 @@ static int ip6gre_tap_init(struct net_device *dev)
if (!dev->tstats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct pcpu_tstats *ip6gre_tap_stats;
+ ip6gre_tap_stats = per_cpu_ptr(dev->tstats, i);
+ u64_stats_init(&ip6gre_tap_stats->syncp);
+ }
+
return 0;
}
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index 2d8f482..b0e3aa1 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -1486,12 +1486,19 @@ static inline int
ip6_tnl_dev_init_gen(struct net_device *dev)
{
struct ip6_tnl *t = netdev_priv(dev);
+ int i;
t->dev = dev;
t->net = dev_net(dev);
dev->tstats = alloc_percpu(struct pcpu_tstats);
if (!dev->tstats)
return -ENOMEM;
+
+ for_each_possible_cpu(i) {
+ struct pcpu_tstats *ip6_tnl_stats;
+ ip6_tnl_stats = per_cpu_ptr(dev->tstats, i);
+ u64_stats_init(&ip6_tnl_stats->syncp);
+ }
return 0;
}
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index 7ee5cb9..24889fc 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -1256,6 +1256,7 @@ static void ipip6_tunnel_setup(struct net_device *dev)
static int ipip6_tunnel_init(struct net_device *dev)
{
struct ip_tunnel *tunnel = netdev_priv(dev);
+ int i;
tunnel->dev = dev;
tunnel->net = dev_net(dev);
@@ -1268,6 +1269,12 @@ static int ipip6_tunnel_init(struct net_device *dev)
if (!dev->tstats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct pcpu_tstats *ipip6_tunnel_stats;
+ ipip6_tunnel_stats = per_cpu_ptr(dev->tstats, i);
+ u64_stats_init(&ipip6_tunnel_stats->syncp);
+ }
+
return 0;
}
@@ -1277,6 +1284,7 @@ static int __net_init ipip6_fb_tunnel_init(struct net_device *dev)
struct iphdr *iph = &tunnel->parms.iph;
struct net *net = dev_net(dev);
struct sit_net *sitn = net_generic(net, sit_net_id);
+ int i;
tunnel->dev = dev;
tunnel->net = dev_net(dev);
@@ -1290,6 +1298,13 @@ static int __net_init ipip6_fb_tunnel_init(struct net_device *dev)
dev->tstats = alloc_percpu(struct pcpu_tstats);
if (!dev->tstats)
return -ENOMEM;
+
+ for_each_possible_cpu(i) {
+ struct pcpu_tstats *ipip6_fb_stats;
+ ipip6_fb_stats = per_cpu_ptr(dev->tstats, i);
+ u64_stats_init(&ipip6_fb_stats->syncp);
+ }
+
dev_hold(dev);
rcu_assign_pointer(sitn->tunnels_wc[0], tunnel);
return 0;
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index c8148e4..5c54c23 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -836,7 +836,7 @@ ip_vs_new_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest,
struct ip_vs_dest **dest_p)
{
struct ip_vs_dest *dest;
- unsigned int atype;
+ unsigned int atype, i;
EnterFunction(2);
@@ -863,6 +863,12 @@ ip_vs_new_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest,
if (!dest->stats.cpustats)
goto err_alloc;
+ for_each_possible_cpu(i) {
+ struct ip_vs_cpu_stats *ip_vs_dest_stats;
+ ip_vs_dest_stats = per_cpu_ptr(dest->stats.cpustats, i);
+ u64_stats_init(&ip_vs_dest_stats->syncp);
+ }
+
dest->af = svc->af;
dest->protocol = svc->protocol;
dest->vaddr = svc->addr;
@@ -1136,7 +1142,7 @@ static int
ip_vs_add_service(struct net *net, struct ip_vs_service_user_kern *u,
struct ip_vs_service **svc_p)
{
- int ret = 0;
+ int ret = 0, i;
struct ip_vs_scheduler *sched = NULL;
struct ip_vs_pe *pe = NULL;
struct ip_vs_service *svc = NULL;
@@ -1186,6 +1192,13 @@ ip_vs_add_service(struct net *net, struct ip_vs_service_user_kern *u,
goto out_err;
}
+ for_each_possible_cpu(i) {
+ struct ip_vs_cpu_stats *ip_vs_stats;
+ ip_vs_stats = per_cpu_ptr(svc->stats.cpustats, i);
+ u64_stats_init(&ip_vs_stats->syncp);
+ }
+
+
/* I'm the first user of the service */
atomic_set(&svc->refcnt, 0);
@@ -3796,7 +3809,7 @@ static struct notifier_block ip_vs_dst_notifier = {
int __net_init ip_vs_control_net_init(struct net *net)
{
- int idx;
+ int i, idx;
struct netns_ipvs *ipvs = net_ipvs(net);
/* Initialize rs_table */
@@ -3815,6 +3828,12 @@ int __net_init ip_vs_control_net_init(struct net *net)
if (!ipvs->tot_stats.cpustats)
return -ENOMEM;
+ for_each_possible_cpu(i) {
+ struct ip_vs_cpu_stats *ipvs_tot_stats;
+ ipvs_tot_stats = per_cpu_ptr(ipvs->tot_stats.cpustats, i);
+ u64_stats_init(&ipvs_tot_stats->syncp);
+ }
+
spin_lock_init(&ipvs->tot_stats.lock);
proc_create("ip_vs", 0, net->proc_net, &ip_vs_info_fops);
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
index 2aa13bd..b92553c 100644
--- a/net/openvswitch/datapath.c
+++ b/net/openvswitch/datapath.c
@@ -1698,6 +1698,12 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
goto err_destroy_table;
}
+ for_each_possible_cpu(i) {
+ struct dp_stats_percpu *dpath_stats;
+ dpath_stats = per_cpu_ptr(dp->stats_percpu, i);
+ u64_stats_init(&dpath_stats->sync);
+ }
+
dp->ports = kmalloc(DP_VPORT_HASH_BUCKETS * sizeof(struct hlist_head),
GFP_KERNEL);
if (!dp->ports) {
diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c
index 6f65dbe..d830a95f 100644
--- a/net/openvswitch/vport.c
+++ b/net/openvswitch/vport.c
@@ -118,6 +118,7 @@ struct vport *ovs_vport_alloc(int priv_size, const struct vport_ops *ops,
{
struct vport *vport;
size_t alloc_size;
+ int i;
alloc_size = sizeof(struct vport);
if (priv_size) {
@@ -141,6 +142,13 @@ struct vport *ovs_vport_alloc(int priv_size, const struct vport_ops *ops,
return ERR_PTR(-ENOMEM);
}
+ for_each_possible_cpu(i) {
+ struct pcpu_tstats *vport_stats;
+ vport_stats = per_cpu_ptr(vport->percpu_stats, i);
+ u64_stats_init(&vport_stats->syncp);
+ }
+
+
spin_lock_init(&vport->stats_lock);
return vport;
--
1.8.1.2
^ permalink raw reply related
* [PATCH 0/4][RFC] Lockdep enablement for seqcount/seqlocks
From: John Stultz @ 2013-09-26 18:34 UTC (permalink / raw)
To: LKML
Cc: John Stultz, Thomas Petazzoni, Mirko Lindner, Stephen Hemminger,
Roger Luethi, Patrick McHardy, Rusty Russell, Michael S. Tsirkin,
Alexey Kuznetsov, James Morris, Hideaki YOSHIFUJI, Wensong Zhang,
Simon Horman, Julian Anastasov, Jesse Gross, Mathieu Desnoyers,
Steven Rostedt, Peter Zijlstra, Ingo Molnar, Thomas Gleixner,
David S. Miller, netdev, netfilter-devel
I wanted to send this out again for feedback.
This patch series enables lockdep for seqcount/seqlock structures,
as well as provides the required cleanups to explicitly initialize
the seqcount structures on u64_stat_sync users.
In addition the last two patches in this provide naive fixes to
some of the issues the new lockdep infrastructure caught.
I'd greatly appreciate any thoughts or feedback on the series!
thanks
-john
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Mirko Lindner <mlindner@marvell.com>
Cc: Stephen Hemminger <stephen@networkplumber.org>
Cc: Roger Luethi <rl@hellgate.ch>
Cc: Patrick McHardy <kaber@trash.net>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: James Morris <jmorris@namei.org>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: Wensong Zhang <wensong@linux-vs.org>
Cc: Simon Horman <horms@verge.net.au>
Cc: Julian Anastasov <ja@ssi.bg>
Cc: Jesse Gross <jesse@nicira.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Cc: netfilter-devel@vger.kernel.org
John Stultz (4):
[RFC] net: Explicitly initialize u64_stats_sync structures for lockdep
[RFC] seqcount: Add lockdep functionality to seqcount/seqlock
structures
[RFC] cpuset: Fix potential deadlock w/ set_mems_allowed
[RFC] ipv6: Fix for possible ipv6 seqlock deadlock
arch/x86/vdso/vclock_gettime.c | 8 +--
drivers/net/dummy.c | 6 ++
drivers/net/ethernet/emulex/benet/be_main.c | 4 ++
drivers/net/ethernet/intel/igb/igb_main.c | 5 ++
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 4 ++
drivers/net/ethernet/marvell/mvneta.c | 3 +
drivers/net/ethernet/marvell/sky2.c | 3 +
drivers/net/ethernet/neterion/vxge/vxge-main.c | 4 ++
drivers/net/ethernet/nvidia/forcedeth.c | 2 +
drivers/net/ethernet/realtek/8139too.c | 3 +
drivers/net/ethernet/tile/tilepro.c | 2 +
drivers/net/ethernet/via/via-rhine.c | 3 +
drivers/net/ifb.c | 5 ++
drivers/net/loopback.c | 6 ++
drivers/net/macvlan.c | 7 +++
drivers/net/nlmon.c | 8 +++
drivers/net/team/team.c | 6 ++
drivers/net/team/team_mode_loadbalance.c | 9 ++-
drivers/net/veth.c | 8 +++
drivers/net/virtio_net.c | 8 +++
drivers/net/vxlan.c | 8 +++
drivers/net/xen-netfront.c | 6 ++
fs/dcache.c | 4 +-
fs/fs_struct.c | 2 +-
include/linux/cpuset.h | 4 ++
include/linux/init_task.h | 8 +--
include/linux/lockdep.h | 8 ++-
include/linux/seqlock.h | 79 ++++++++++++++++++++++++--
include/linux/u64_stats_sync.h | 7 +++
mm/filemap_xip.c | 2 +-
net/8021q/vlan_dev.c | 9 ++-
net/bridge/br_device.c | 7 +++
net/ipv4/af_inet.c | 14 +++++
net/ipv4/ip_tunnel.c | 8 ++-
net/ipv6/addrconf.c | 14 +++++
net/ipv6/af_inet6.c | 14 +++++
net/ipv6/ip6_gre.c | 15 +++++
net/ipv6/ip6_output.c | 7 ++-
net/ipv6/ip6_tunnel.c | 7 +++
net/ipv6/sit.c | 15 +++++
net/netfilter/ipvs/ip_vs_ctl.c | 25 +++++++-
net/openvswitch/datapath.c | 6 ++
net/openvswitch/vport.c | 8 +++
43 files changed, 354 insertions(+), 27 deletions(-)
--
1.8.1.2
^ permalink raw reply
* [PATCH] iproute2: xfrm state add abort issue
From: Sohny Thomas @ 2013-09-26 18:32 UTC (permalink / raw)
To: stephen, netdev
In-Reply-To: <524411AE.7000404@linux.vnet.ibm.com>
ip xfrm state add causes a SIGABRT due to a strncpy_chk .
This happens since strncpy doesn't account for the '\0' .
I have fixed this using sizeof instead of strlen .
There is a redhat bug which documents this issue
https://bugzilla.redhat.com/show_bug.cgi?id=982761
Signed-off-by: Sohny Thomas <sohthoma@in.ibm.com>
--------------
diff --git a/ip/xfrm_state.c b/ip/xfrm_state.c
index 389942c..7dd8799 100644
--- a/ip/xfrm_state.c
+++ b/ip/xfrm_state.c
@@ -117,7 +117,7 @@ static int xfrm_algo_parse(struct xfrm_algo *alg,
enum xfrm_attr_type_t type,
char *name, char *key, char *buf, int max)
{
int len;
- int slen = strlen(key);
+ int slen = sizeof(key);
#if 0
/* XXX: verifying both name and key is required! */
^ permalink raw reply related
* Re: [PATCH] ARM: shmobile: Lager: add Micrel KSZ8041 PHY fixup
From: Sergei Shtylyov @ 2013-09-26 18:28 UTC (permalink / raw)
To: Magnus Damm
Cc: Simon Horman [Horms], SH-Linux, Russell King - ARM Linux,
linux-arm-kernel@lists.infradead.org, Laurent Pinchart, netdev
In-Reply-To: <CANqRtoTiHQ3EVDZ8POCkyN2ga95rF=u5ERfYsdZbX+toqAWmaQ@mail.gmail.com>
Hello.
On 09/26/2013 10:50 AM, Magnus Damm wrote:
>> Currently on the Lager board NFS timeouts/delays are seen when booting. That
>> turned out to happen because the SoC's ETH_LINK signal turns on and off after
>> each packet. It is connected to Micrel KSZ8041 PHY's LED0 signal. Ether LEDs
>> on the Lager board are named LINK and ACTIVE which corresponds to non-default
>> 01 setting of the PHY control register 1 bits 14-15. The 'sh_eth' driver resets
>> the PHY when opening the network device, so we have to set the mentioned bits
>> back to 01 from the default 00 value which causes bouncing of ETH_LINK. That
>> can be achieved using the PHY platform fixup mechanism if we also modify the
>> driver to use it..
>> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
> Hi Sergei,
> Thanks for your efforts on this. Nice to see that Ethernet for Lager
> board support is improving.
> Can you please share with us with link speeds you tested? I suspect
100 Mbit/s, full duplex.
> that this patch is only needed for some case, like for instance 100
> MBit Full Duplex.
Hm, why? :-O
> Fixing the PHY settings makes sense even though only
> a single mode needs it, but knowing which link speeds that are known
> to work would help a lot.
This patch should not depend on the link speed and duplex settings.
> Cheers,
> / magnus
WBR, Sergei
^ permalink raw reply
* Re: BUG: MARK in OUTPUT + ip_tunnel causes kernel panic
From: Kristian Evensen @ 2013-09-26 18:27 UTC (permalink / raw)
To: Steffen Klassert; +Cc: Konstantin Kuzov, Network Development
In-Reply-To: <20130925085947.GY7660@secunet.com>
On Wed, Sep 25, 2013 at 10:59 AM, Steffen Klassert
<steffen.klassert@secunet.com> wrote:
> Can you please try the patch below?
> I've posted the same patch already to netdev in the morning.
Thank you very much for this patch. I am currently travelling, but
will give it a try when I am back in the office next week.
-Kristian
^ permalink raw reply
* [PATCH 7/7] rtlwifi: rtl8188ee: Convert driver to use new rtl_phy_scan_operation_backup() routine
From: Larry Finger @ 2013-09-26 18:25 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Larry Finger, netdev
In-Reply-To: <1380219933-16784-1-git-send-email-Larry.Finger@lwfinger.net>
Now that rtl_phy_scan_operation_backup() exists, convert rtl8188ee to use it.
Routine rtl88e_phy_scan_operation_backup() is no longer used and is removed.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---
drivers/net/wireless/rtlwifi/rtl8188ee/phy.c | 28 ----------------------------
drivers/net/wireless/rtlwifi/rtl8188ee/phy.h | 1 -
drivers/net/wireless/rtlwifi/rtl8188ee/sw.c | 3 ++-
3 files changed, 2 insertions(+), 30 deletions(-)
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c b/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c
index e655c04..d67f9c7 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c
@@ -1136,34 +1136,6 @@ void rtl88e_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
&bw40_pwr[0], channel);
}
-void rtl88e_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
-{
- struct rtl_priv *rtlpriv = rtl_priv(hw);
- struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
- enum io_type iotype;
-
- if (!is_hal_stop(rtlhal)) {
- switch (operation) {
- case SCAN_OPT_BACKUP:
- iotype = IO_CMD_PAUSE_DM_BY_SCAN;
- rtlpriv->cfg->ops->set_hw_reg(hw,
- HW_VAR_IO_CMD,
- (u8 *)&iotype);
- break;
- case SCAN_OPT_RESTORE:
- iotype = IO_CMD_RESUME_DM_BY_SCAN;
- rtlpriv->cfg->ops->set_hw_reg(hw,
- HW_VAR_IO_CMD,
- (u8 *)&iotype);
- break;
- default:
- RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
- "Unknown Scan Backup operation.\n");
- break;
- }
- }
-}
-
void rtl88e_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
{
struct rtl_priv *rtlpriv = rtl_priv(hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/phy.h b/drivers/net/wireless/rtlwifi/rtl8188ee/phy.h
index 71ddf4f..8e1f1be 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/phy.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/phy.h
@@ -213,7 +213,6 @@ bool rtl88e_phy_rf_config(struct ieee80211_hw *hw);
void rtl88e_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw);
void rtl88e_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel);
void rtl88e_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel);
-void rtl88e_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation);
void rtl88e_phy_set_bw_mode_callback(struct ieee80211_hw *hw);
void rtl88e_phy_set_bw_mode(struct ieee80211_hw *hw,
enum nl80211_channel_type ch_type);
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/sw.c b/drivers/net/wireless/rtlwifi/rtl8188ee/sw.c
index c254693..347af1e 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/sw.c
@@ -30,6 +30,7 @@
#include "../wifi.h"
#include "../core.h"
#include "../pci.h"
+#include "../base.h"
#include "reg.h"
#include "def.h"
#include "phy.h"
@@ -244,7 +245,7 @@ static struct rtl_hal_ops rtl8188ee_hal_ops = {
.set_bw_mode = rtl88e_phy_set_bw_mode,
.switch_channel = rtl88e_phy_sw_chnl,
.dm_watchdog = rtl88e_dm_watchdog,
- .scan_operation_backup = rtl88e_phy_scan_operation_backup,
+ .scan_operation_backup = rtl_phy_scan_operation_backup,
.set_rf_power_state = rtl88e_phy_set_rf_power_state,
.led_control = rtl88ee_led_control,
.set_desc = rtl88ee_set_desc,
--
1.8.1.4
^ permalink raw reply related
* [PATCH 6/7] rtlwifi: rtl8723ae: Convert driver to use new rtl_phy_scan_operation_backup() routine
From: Larry Finger @ 2013-09-26 18:25 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Larry Finger, netdev
In-Reply-To: <1380219933-16784-1-git-send-email-Larry.Finger@lwfinger.net>
Now that rtl_phy_scan_operation_backup() exists, convert rtl8723ae to use it.
Routine rtl8723ae_phy_scan_operation_backup() is no longer used and is removed.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---
drivers/net/wireless/rtlwifi/rtl8723ae/phy.c | 29 ----------------------------
drivers/net/wireless/rtlwifi/rtl8723ae/phy.h | 1 -
drivers/net/wireless/rtlwifi/rtl8723ae/sw.c | 3 ++-
3 files changed, 2 insertions(+), 31 deletions(-)
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/phy.c b/drivers/net/wireless/rtlwifi/rtl8723ae/phy.c
index eafbb18..5d318a8 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/phy.c
@@ -934,35 +934,6 @@ static long _phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
return pwrout_dbm;
}
-void rtl8723ae_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
-{
- struct rtl_priv *rtlpriv = rtl_priv(hw);
- struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
- enum io_type iotype;
-
- if (!is_hal_stop(rtlhal)) {
- switch (operation) {
- case SCAN_OPT_BACKUP:
- iotype = IO_CMD_PAUSE_DM_BY_SCAN;
- rtlpriv->cfg->ops->set_hw_reg(hw,
- HW_VAR_IO_CMD,
- (u8 *)&iotype);
-
- break;
- case SCAN_OPT_RESTORE:
- iotype = IO_CMD_RESUME_DM_BY_SCAN;
- rtlpriv->cfg->ops->set_hw_reg(hw,
- HW_VAR_IO_CMD,
- (u8 *)&iotype);
- break;
- default:
- RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
- "Unknown Scan Backup operation.\n");
- break;
- }
- }
-}
-
void rtl8723ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
{
struct rtl_priv *rtlpriv = rtl_priv(hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/phy.h b/drivers/net/wireless/rtlwifi/rtl8723ae/phy.h
index bbb950d..c3adc72 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/phy.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/phy.h
@@ -203,7 +203,6 @@ void rtl8723ae_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel);
void rtl8723ae_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel);
bool rtl8723ae_phy_update_txpower_dbm(struct ieee80211_hw *hw,
long power_indbm);
-void rtl8723ae_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation);
void rtl8723ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw);
void rtl8723ae_phy_set_bw_mode(struct ieee80211_hw *hw,
enum nl80211_channel_type ch_type);
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/sw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/sw.c
index d9ee2ef..62b204f 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/sw.c
@@ -33,6 +33,7 @@
#include "../core.h"
#include "../pci.h"
+#include "../base.h"
#include "reg.h"
#include "def.h"
#include "phy.h"
@@ -220,7 +221,7 @@ static struct rtl_hal_ops rtl8723ae_hal_ops = {
.set_bw_mode = rtl8723ae_phy_set_bw_mode,
.switch_channel = rtl8723ae_phy_sw_chnl,
.dm_watchdog = rtl8723ae_dm_watchdog,
- .scan_operation_backup = rtl8723ae_phy_scan_operation_backup,
+ .scan_operation_backup = rtl_phy_scan_operation_backup,
.set_rf_power_state = rtl8723ae_phy_set_rf_power_state,
.led_control = rtl8723ae_led_control,
.set_desc = rtl8723ae_set_desc,
--
1.8.1.4
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox