* Re: [PATCH net-next] tcp: SYN packets are now simply consumed
From: David Miller @ 2016-04-25 19:50 UTC (permalink / raw)
To: eric.dumazet; +Cc: netdev
In-Reply-To: <1461301981.7627.24.camel@edumazet-glaptop3.roam.corp.google.com>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Thu, 21 Apr 2016 22:13:01 -0700
> From: Eric Dumazet <edumazet@google.com>
>
> We now have proper per-listener but also per network namespace counters
> for SYN packets that might be dropped.
>
> We replace the kfree_skb() by consume_skb() to be drop monitor [1]
> friendly, and remove an obsolete comment.
> FastOpen SYN packets can carry payload in them just fine.
>
> [1] perf record -a -g -e skb:kfree_skb sleep 1; perf report
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next] net: better drop monitoring in ip{6}_recv_error()
From: David Miller @ 2016-04-25 19:50 UTC (permalink / raw)
To: eric.dumazet; +Cc: netdev
In-Reply-To: <1461302852.7627.29.camel@edumazet-glaptop3.roam.corp.google.com>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Thu, 21 Apr 2016 22:27:32 -0700
> From: Eric Dumazet <edumazet@google.com>
>
> We should call consume_skb(skb) when skb is properly consumed,
> or kfree_skb(skb) when skb must be dropped in error case.
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next v2 0/4] qed*: driver updates
From: David Miller @ 2016-04-25 19:59 UTC (permalink / raw)
To: Yuval.Mintz; +Cc: netdev
In-Reply-To: <1461303664-15961-1-git-send-email-Yuval.Mintz@qlogic.com>
From: Yuval Mintz <Yuval.Mintz@qlogic.com>
Date: Fri, 22 Apr 2016 08:41:00 +0300
> This patch series contains some ethtool-related enhancements.
Series applied.
^ permalink raw reply
* Re: [PATCH net-next] route: move lwtunnel state to a single place
From: David Miller @ 2016-04-25 20:20 UTC (permalink / raw)
To: jbenc; +Cc: netdev, lrichard
In-Reply-To: <c59d9a13e4171a887d6dd2acdce216c51a006993.1461321556.git.jbenc@redhat.com>
From: Jiri Benc <jbenc@redhat.com>
Date: Fri, 22 Apr 2016 12:40:02 +0200
> Commit 751a587ac9f9 ("route: fix breakage after moving lwtunnel state")
> moved lwtstate to the end of dst_entry for 32bit archs. This makes it share
> the cacheline with __refcnt which had an unkown effect on performance. For
> this reason, the pointer was kept in place for 64bit archs.
>
> However, later performance measurements showed this is of no concern. It
> turns out that every performance sensitive path that accesses lwtstate
> accesses also struct rtable or struct rt6_info which share the same cache
> line.
>
> Thus, to get rid of a few #ifdefs, move the field to the end of the struct
> also for 64bit.
>
> Signed-off-by: Jiri Benc <jbenc@redhat.com>
Fair enough, applied, thanks Jiri.
^ permalink raw reply
* Re: [PATCH] cxgbi: fix uninitialized flowi6
From: David Miller @ 2016-04-25 20:21 UTC (permalink / raw)
To: jbenc; +Cc: linux-scsi, netdev, jejb, martin.petersen, anish
In-Reply-To: <89cb4d2647db3bc922c7067d421e983a271483ca.1461322282.git.jbenc@redhat.com>
From: Jiri Benc <jbenc@redhat.com>
Date: Fri, 22 Apr 2016 13:09:13 +0200
> ip6_route_output looks into different fields in the passed flowi6 structure,
> yet cxgbi passes garbage in nearly all those fields. Zero the structure out
> first.
>
> Fixes: fc8d0590d9142 ("libcxgbi: Add ipv6 api to driver")
> Signed-off-by: Jiri Benc <jbenc@redhat.com>
Applied.
^ permalink raw reply
* Re: [PATCH net-next] macsec: Convert to using IFF_NO_QUEUE
From: David Miller @ 2016-04-25 20:22 UTC (permalink / raw)
To: phil; +Cc: netdev, sd
In-Reply-To: <1461326562-6595-1-git-send-email-phil@nwl.cc>
From: Phil Sutter <phil@nwl.cc>
Date: Fri, 22 Apr 2016 14:02:42 +0200
> Signed-off-by: Phil Sutter <phil@nwl.cc>
Applied.
^ permalink raw reply
* Re: [PATCH] net: ipv6: Delete host routes on an ifdown
From: David Miller @ 2016-04-25 20:42 UTC (permalink / raw)
To: dsa; +Cc: netdev, mmanning
In-Reply-To: <571E72AA.4030100@cumulusnetworks.com>
From: David Ahern <dsa@cumulusnetworks.com>
Date: Mon, 25 Apr 2016 13:40:26 -0600
> It's unfortunate you want to take that action. Last week I came across
> a prior attempt by Stephen to do this same thing -- keep IPv6
> addresses. That prior attempt was reverted by commit
> 73a8bd74e261. Cumulus, Brocade, and others clearly want this
> capability.
But nobody has implemented it correctly, it doesn't matter who wants
the feature. That's why it keeps getting reverted.
Also, this testing you are talking about should have happened long
before you submitted that first patch that introduced all of these
regressions. My observations tell me that the bulk of the testing
happened afterwards and that's why all the regressions are popping up
now.
^ permalink raw reply
* Re: [PATCH 0/2] codel: make it reuseable beyond qdiscs
From: David Miller @ 2016-04-25 20:45 UTC (permalink / raw)
To: michal.kazior; +Cc: netdev, johannes
In-Reply-To: <1461327359-21646-1-git-send-email-michal.kazior@tieto.com>
From: Michal Kazior <michal.kazior@tieto.com>
Date: Fri, 22 Apr 2016 14:15:57 +0200
> There's an ongoing effort in fixing wireless
> bufferbloat. As part of that fq_codel is being
> ported into mac80211. To prevent code duplication
> codel.h needs to be slightly modified before it
> can be used in mac80211 (or other drivers FWIW).
>
> For more background please see:
>
> https://www.spinics.net/lists/linux-wireless/msg149976.html
Series applied, but I reserve the right the revert this if the
indirect functions calling this introduces causes performance
regressions.
Thanks.
^ permalink raw reply
* Re: [PATCH] fq: add fair queuing framework
From: David Miller @ 2016-04-25 20:46 UTC (permalink / raw)
To: michal.kazior; +Cc: netdev, johannes
In-Reply-To: <1461327613-22902-1-git-send-email-michal.kazior@tieto.com>
From: Michal Kazior <michal.kazior@tieto.com>
Date: Fri, 22 Apr 2016 14:20:13 +0200
> This works on the same implementation principle as
> codel*.h, i.e. there's a generic header with
> structures and macros and a implementation header
> carrying function definitions to include in given,
> e.g. driver or module.
>
> The fairness logic comes from
> net/sched/sch_fq_codel.c but is generalized so it
> is more flexible and easier to re-use.
>
> Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Applied, but same caveats as for codel.
^ permalink raw reply
* Re: [RFC PATCH net] ipv6/ila: fix nlsize calculation for lwtunnel
From: David Miller @ 2016-04-25 20:47 UTC (permalink / raw)
To: nicolas.dichtel; +Cc: netdev, tom
In-Reply-To: <1461340682-31568-1-git-send-email-nicolas.dichtel@6wind.com>
From: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Date: Fri, 22 Apr 2016 17:58:02 +0200
> The handler 'ila_fill_encap_info' adds one attribute: ILA_ATTR_LOCATOR.
>
> Fixes: 65d7ab8de582 ("net: Identifier Locator Addressing module")
> CC: Tom Herbert <tom@herbertland.com>
> Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
> ---
>
> Tom, when I read the comment, I feel I'm misssing something, but what?
Tom please take a look at this, thanks.
^ permalink raw reply
* Re: [PATCH] devlink: export header
From: David Miller @ 2016-04-25 20:49 UTC (permalink / raw)
To: stephen; +Cc: jiri, netdev
In-Reply-To: <20160422095517.545fe658@xeon-e3>
From: Stephen Hemminger <stephen@networkplumber.org>
Date: Fri, 22 Apr 2016 09:55:17 -0700
> Export devlink.h when doing make headers install.
> I am going to investigate just doing all headers in the directory,
> but lets add missing piece for now.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
This is already exported in the 'net' tree.
^ permalink raw reply
* Re: [PATCH net-next] tc_act: export all user headers
From: David Miller @ 2016-04-25 20:49 UTC (permalink / raw)
To: stephen; +Cc: hadi, netdev
In-Reply-To: <20160422100638.4f4280bf@xeon-e3>
From: Stephen Hemminger <stephen@networkplumber.org>
Date: Fri, 22 Apr 2016 10:06:38 -0700
> The file tc_ife.h was missing from the export list.
> Rather than continue to cherry-pick, just export all headers in the directory.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Applied.
^ permalink raw reply
* [PATCH net-next 1/2] tcp: remove an unnecessary check in tcp_tx_timestamp
From: Soheil Hassas Yeganeh @ 2016-04-25 20:51 UTC (permalink / raw)
To: davem, netdev
Cc: kafai, willemb, edumazet, ycheng, ncardwell,
Soheil Hassas Yeganeh
From: Soheil Hassas Yeganeh <soheil@google.com>
tcp_tx_timestamp() receives tsflags as a parameter. tsflags
is initialized to sk->sk_tsflags and is overridden by control
messages. As a result the "sk->sk_tsflags || tsflags" is the
same expression as "tsflags"
Remove the redundant check for sk->sk_tsflags in tcp_tx_timestamp.
Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
---
net/ipv4/tcp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 4d73858..3c542dc 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -430,7 +430,7 @@ EXPORT_SYMBOL(tcp_init_sock);
static void tcp_tx_timestamp(struct sock *sk, u16 tsflags, struct sk_buff *skb)
{
- if (sk->sk_tsflags || tsflags) {
+ if (tsflags) {
struct skb_shared_info *shinfo = skb_shinfo(skb);
struct tcp_skb_cb *tcb = TCP_SKB_CB(skb);
--
2.8.0.rc3.226.g39d4020
^ permalink raw reply related
* [PATCH net-next 2/2] tcp: remove a redundant check for SKBTX_ACK_TSTAMP
From: Soheil Hassas Yeganeh @ 2016-04-25 20:51 UTC (permalink / raw)
To: davem, netdev
Cc: kafai, willemb, edumazet, ycheng, ncardwell,
Soheil Hassas Yeganeh
In-Reply-To: <1461617473-11349-1-git-send-email-soheil.kdev@gmail.com>
From: Soheil Hassas Yeganeh <soheil@google.com>
txstamp_ack in tcp_skb_cb is set iff the SKBTX_ACK_TSTAMP
flag is set for an skb. Thus, it is not required to check
shinfo->tx_flags if the txstamp_ack bit is checked.
Remove the check on shinfo->tx_flags & SKBTX_ACK_TSTAMP, since
it has already been checked using the txstamp_ack bit.
Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
---
net/ipv4/tcp_input.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 967520d..2f3fd92 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -3087,8 +3087,7 @@ static void tcp_ack_tstamp(struct sock *sk, struct sk_buff *skb,
return;
shinfo = skb_shinfo(skb);
- if ((shinfo->tx_flags & SKBTX_ACK_TSTAMP) &&
- !before(shinfo->tskey, prior_snd_una) &&
+ if (!before(shinfo->tskey, prior_snd_una) &&
before(shinfo->tskey, tcp_sk(sk)->snd_una))
__skb_tstamp_tx(skb, NULL, sk, SCM_TSTAMP_ACK);
}
--
2.8.0.rc3.226.g39d4020
^ permalink raw reply related
* Re: [PATCH net-next] tc_act: export all user headers
From: David Miller @ 2016-04-25 20:52 UTC (permalink / raw)
To: stephen; +Cc: hadi, netdev
In-Reply-To: <20160425.164939.2072274531689250224.davem@davemloft.net>
From: David Miller <davem@davemloft.net>
Date: Mon, 25 Apr 2016 16:49:39 -0400 (EDT)
> From: Stephen Hemminger <stephen@networkplumber.org>
> Date: Fri, 22 Apr 2016 10:06:38 -0700
>
>> The file tc_ife.h was missing from the export list.
>> Rather than continue to cherry-pick, just export all headers in the directory.
>>
>> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>
> Applied.
Please compile test, pretty please??!?!?
./usr/include/linux/tc_act/*.h: No such file or directory
It looks like you can't expect shell expansions like that to work in
Kbuild files.
^ permalink raw reply
* Re: [PATCH v2 net-next 0/2] pskb_extract() helper function.
From: David Miller @ 2016-04-25 20:54 UTC (permalink / raw)
To: sowmini.varadhan
Cc: netdev, rds-devel, santosh.shilimkar, eric.dumazet,
marcelo.leitner
In-Reply-To: <cover.1461368732.git.sowmini.varadhan@oracle.com>
From: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Date: Fri, 22 Apr 2016 18:36:34 -0700
> This patchset follows up on the discussion in
> https://www.mail-archive.com/netdev@vger.kernel.org/msg105090.html
>
> For RDS-TCP, we have to deal with the full gamut of
> nonlinear sk_buffs, including all the frag_list variants.
> Also, the parent skb has to remain unchanged, while the clone
> is queued for Rx on the PF_RDS socket.
>
> Patch 1 of this patchset adds a pskb_extract() function that
> does all this without the redundant memcpy's in pskb_expand_head()
> and __pskb_pull_tail().
>
> v2: Marcelo Leitner review comments
Series applied, thanks.
^ permalink raw reply
* Re: [PATCH 1/6] bus: Add shared MDIO bus framework
From: Andrew Lunn @ 2016-04-25 20:56 UTC (permalink / raw)
To: Pramod Kumar
Cc: Rob Herring, Catalin Marinas, Will Deacon, Masahiro Yamada,
Chen-Yu Tsai, Mark Rutland, devicetree-u79uwXL29TY76Z2rM5mHXA,
Pawel Moll, Arnd Bergmann, Suzuki K Poulose,
netdev-u79uwXL29TY76Z2rM5mHXA, Punit Agrawal,
linux-kernel-u79uwXL29TY76Z2rM5mHXA, BCM Kernel Feedback,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Anup Patel
In-Reply-To: <1461230323-27891-2-git-send-email-pramod.kumar-dY08KVG/lbpWk0Htik3J/w@public.gmane.org>
Hi Pramod
I took a closer look. I don't see why the current MDIO code should not
be used, rather than adding a new framework.
What you need for your Non Ethernet PHYs is that they are somehow
probed. The current MDIO code will do that, based on the compatible
string. An mdio device gets passed a struct mdio_device * to its probe
function, giving you the bus and address on the bus for the
device. Your PHY driver can then register itself using
devm_of_phy_provider_register(). The user of the PHY then needs to use
devm_phy_get() to get a handle on the phy, and can then use
phy_power_on()/phy_power_off().
There is a very simple example here for an MDIO device driver:
http://thread.gmane.org/gmane.linux.network/393532
The muxing of the MDIO busses looks a little tricky. At the moment you have:
writel(cmd, base + MDIO_PARAM_OFFSET);
which mixes together the muxing parameters and the write value. Can
this register be accessed as two 16 bit registers? If it can be, you
can cleanly separate out the muxing.
Take a look at mdio-mux-gpio.c and mdio-mux-mmioreg.c for examples of
MDIO muxes.
Andrew
--
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
* Re: [PATCH RFC net-next] net: dsa: Provide CPU port statistics to master netdev
From: Andrew Lunn @ 2016-04-25 21:43 UTC (permalink / raw)
To: Florian Fainelli; +Cc: netdev, davem, vivien.didelot
In-Reply-To: <1461175101-13506-1-git-send-email-f.fainelli@gmail.com>
On Wed, Apr 20, 2016 at 10:58:21AM -0700, Florian Fainelli wrote:
> This patch overloads the DSA master netdev, aka CPU Ethernet MAC to also
> include switch-side statistics, which is useful for debugging purposes,
> when the switch is not properly connected to the Ethernet MAC (duplex
> mismatch, (RG)MII electrical issues etc.).
>
> We accomplish this by retaining the original copy of the master netdev's
> ethtool_ops, and just overload the 3 operations we care about:
> get_sset_count, get_strings and get_ethtool_stats so as to intercept
> these calls and call into the original master_netdev ethtool_ops, plus
> our own.
Hi Florian
Interesting concept. My one concern is that by concatenating the two
sets of statistics, we get a name clash. I'm not sure the Marvell
switch statistics counters have different names to the Marvell
Ethernet driver statistics counters. ethtool does not care, but maybe
an SNMP agent using these statistics might not be too happy seeing the
same name twice?
Andrew
^ permalink raw reply
* [PATCH v4 net-next 3/3] tcp: Handle eor bit when fragmenting a skb
From: Martin KaFai Lau @ 2016-04-25 21:44 UTC (permalink / raw)
To: netdev
Cc: Eric Dumazet, Neal Cardwell, Soheil Hassas Yeganeh,
Willem de Bruijn, Yuchung Cheng, Kernel Team
In-Reply-To: <1461620690-1081063-1-git-send-email-kafai@fb.com>
When fragmenting a skb, the next_skb should carry
the eor from prev_skb. The eor of prev_skb should
also be reset.
Packetdrill script for testing:
~~~~~~
+0 `sysctl -q -w net.ipv4.tcp_min_tso_segs=10`
+0 `sysctl -q -w net.ipv4.tcp_no_metrics_save=1`
+0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
0.100 < S 0:0(0) win 32792 <mss 1460,sackOK,nop,nop,nop,wscale 7>
0.100 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 7>
0.200 < . 1:1(0) ack 1 win 257
0.200 accept(3, ..., ...) = 4
+0 setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0
0.200 sendto(4, ..., 15330, MSG_EOR, ..., ...) = 15330
0.200 sendto(4, ..., 730, 0, ..., ...) = 730
0.200 > . 1:7301(7300) ack 1
0.200 > . 7301:14601(7300) ack 1
0.300 < . 1:1(0) ack 14601 win 257
0.300 > P. 14601:15331(730) ack 1
0.300 > P. 15331:16061(730) ack 1
0.400 < . 1:1(0) ack 16061 win 257
0.400 close(4) = 0
0.400 > F. 16061:16061(0) ack 1
0.400 < F. 1:1(0) ack 16062 win 257
0.400 > . 16062:16062(0) ack 2
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Neal Cardwell <ncardwell@google.com>
Cc: Soheil Hassas Yeganeh <soheil@google.com>
Cc: Willem de Bruijn <willemb@google.com>
Cc: Yuchung Cheng <ycheng@google.com>
---
net/ipv4/tcp_output.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index fa4d17f..55a926b 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -1128,6 +1128,12 @@ static void tcp_fragment_tstamp(struct sk_buff *skb, struct sk_buff *skb2)
}
}
+static void tcp_skb_fragment_eor(struct sk_buff *skb, struct sk_buff *skb2)
+{
+ TCP_SKB_CB(skb2)->eor = TCP_SKB_CB(skb)->eor;
+ TCP_SKB_CB(skb)->eor = 0;
+}
+
/* Function to create two new TCP segments. Shrinks the given segment
* to the specified size and appends a new segment with the rest of the
* packet to the list. This won't be called frequently, I hope.
@@ -1173,6 +1179,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len,
TCP_SKB_CB(skb)->tcp_flags = flags & ~(TCPHDR_FIN | TCPHDR_PSH);
TCP_SKB_CB(buff)->tcp_flags = flags;
TCP_SKB_CB(buff)->sacked = TCP_SKB_CB(skb)->sacked;
+ tcp_skb_fragment_eor(skb, buff);
if (!skb_shinfo(skb)->nr_frags && skb->ip_summed != CHECKSUM_PARTIAL) {
/* Copy and checksum data tail into the new buffer. */
@@ -1733,6 +1740,8 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len,
/* This packet was never sent out yet, so no SACK bits. */
TCP_SKB_CB(buff)->sacked = 0;
+ tcp_skb_fragment_eor(skb, buff);
+
buff->ip_summed = skb->ip_summed = CHECKSUM_PARTIAL;
skb_split(skb, buff, len);
tcp_fragment_tstamp(skb, buff);
--
2.5.1
^ permalink raw reply related
* [PATCH v4 net-next 0/3] tcp: Make use of MSG_EOR in tcp_sendmsg
From: Martin KaFai Lau @ 2016-04-25 21:44 UTC (permalink / raw)
To: netdev
Cc: Eric Dumazet, Neal Cardwell, Soheil Hassas Yeganeh,
Willem de Bruijn, Yuchung Cheng, Kernel Team
v4:
~ Do not set eor bit in do_tcp_sendpages() since there is
no way to pass MSG_EOR from the userland now.
~ Avoid rmw by testing MSG_EOR first in tcp_sendmsg().
~ Move TCP_SKB_CB(skb)->eor test to a new helper
tcp_skb_can_collapse_to() (suggested by Soheil).
~ Add some packetdrill tests.
v3:
~ Separate EOR marking from the SKBTX_ANY_TSTAMP logic.
~ Move the eor bit test back to the loop in tcp_sendmsg and
tcp_sendpage because there could be >1 threads doing
sendmsg.
~ Thanks to Eric Dumazet's suggestions on v2.
~ The TCP timestamp bug fixes are separated into other threads.
v2:
~ Rework based on the recent work
"add TX timestamping via cmsg" by
Soheil Hassas Yeganeh <soheil.kdev@gmail.com>
~ This version takes the MSG_EOR bit as a signal of
end-of-response-message and leave the selective
timestamping job to the cmsg
~ Changes based on the v1 feedback (like avoid
unlikely check in a loop and adding tcp_sendpage
support)
~ The first 3 patches are bug fixes. The fixes in this
series depend on the newly introduced txstamp_ack in
net-next. I will make relevant patches against net after
getting some feedback.
~ The test results are based on the recently posted net fix:
"tcp: Fix SOF_TIMESTAMPING_TX_ACK when handling dup acks"
One potential use case is to use MSG_EOR with
SOF_TIMESTAMPING_TX_ACK to get a more accurate
TCP ack timestamping on application protocol with
multiple outgoing response messages (e.g. HTTP2).
One of our use case is at the webserver. The webserver tracks
the HTTP2 response latency by measuring when the webserver sends
the first byte to the socket till the TCP ACK of the last byte
is received. In the cases where we don't have client side
measurement, measuring from the server side is the only option.
In the cases we have the client side measurement, the server side
data can also be used to justify/cross-check-with the client
side data.
^ permalink raw reply
* [PATCH v4 net-next 2/3] tcp: Handle eor bit when coalescing skb
From: Martin KaFai Lau @ 2016-04-25 21:44 UTC (permalink / raw)
To: netdev
Cc: Eric Dumazet, Neal Cardwell, Soheil Hassas Yeganeh,
Willem de Bruijn, Yuchung Cheng, Kernel Team
In-Reply-To: <1461620690-1081063-1-git-send-email-kafai@fb.com>
This patch:
1. Prevent next_skb from coalescing to the prev_skb if
TCP_SKB_CB(prev_skb)->eor is set
2. Update the TCP_SKB_CB(prev_skb)->eor if coalescing is
allowed
Packetdrill script for testing:
~~~~~~
+0 `sysctl -q -w net.ipv4.tcp_min_tso_segs=10`
+0 `sysctl -q -w net.ipv4.tcp_no_metrics_save=1`
+0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
0.100 < S 0:0(0) win 32792 <mss 1460,sackOK,nop,nop,nop,wscale 7>
0.100 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 7>
0.200 < . 1:1(0) ack 1 win 257
0.200 accept(3, ..., ...) = 4
+0 setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0
0.200 sendto(4, ..., 730, MSG_EOR, ..., ...) = 730
0.200 sendto(4, ..., 730, MSG_EOR, ..., ...) = 730
0.200 write(4, ..., 11680) = 11680
0.200 > P. 1:731(730) ack 1
0.200 > P. 731:1461(730) ack 1
0.200 > . 1461:8761(7300) ack 1
0.200 > P. 8761:13141(4380) ack 1
0.300 < . 1:1(0) ack 1 win 257 <sack 1461:13141,nop,nop>
0.300 > P. 1:731(730) ack 1
0.300 > P. 731:1461(730) ack 1
0.400 < . 1:1(0) ack 13141 win 257
0.400 close(4) = 0
0.400 > F. 13141:13141(0) ack 1
0.500 < F. 1:1(0) ack 13142 win 257
0.500 > . 13142:13142(0) ack 2
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Neal Cardwell <ncardwell@google.com>
Cc: Soheil Hassas Yeganeh <soheil@google.com>
Cc: Willem de Bruijn <willemb@google.com>
Cc: Yuchung Cheng <ycheng@google.com>
---
net/ipv4/tcp_input.c | 4 ++++
net/ipv4/tcp_output.c | 4 ++++
2 files changed, 8 insertions(+)
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index dcad8f9..65fb708 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -1303,6 +1303,7 @@ static bool tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,
}
TCP_SKB_CB(prev)->tcp_flags |= TCP_SKB_CB(skb)->tcp_flags;
+ TCP_SKB_CB(prev)->eor = TCP_SKB_CB(skb)->eor;
if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
TCP_SKB_CB(prev)->end_seq++;
@@ -1368,6 +1369,9 @@ static struct sk_buff *tcp_shift_skb_data(struct sock *sk, struct sk_buff *skb,
if ((TCP_SKB_CB(prev)->sacked & TCPCB_TAGBITS) != TCPCB_SACKED_ACKED)
goto fallback;
+ if (!tcp_skb_can_collapse_to(prev))
+ goto fallback;
+
in_sack = !after(start_seq, TCP_SKB_CB(skb)->seq) &&
!before(end_seq, TCP_SKB_CB(skb)->end_seq);
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 9d3b4b3..fa4d17f 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -2494,6 +2494,7 @@ static void tcp_collapse_retrans(struct sock *sk, struct sk_buff *skb)
* packet counting does not break.
*/
TCP_SKB_CB(skb)->sacked |= TCP_SKB_CB(next_skb)->sacked & TCPCB_EVER_RETRANS;
+ TCP_SKB_CB(skb)->eor = TCP_SKB_CB(next_skb)->eor;
/* changed transmit queue under us so clear hints */
tcp_clear_retrans_hints_partial(tp);
@@ -2545,6 +2546,9 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *to,
if (!tcp_can_collapse(sk, skb))
break;
+ if (!tcp_skb_can_collapse_to(to))
+ break;
+
space -= skb->len;
if (first) {
--
2.5.1
^ permalink raw reply related
* [PATCH v4 net-next 1/3] tcp: Make use of MSG_EOR in tcp_sendmsg
From: Martin KaFai Lau @ 2016-04-25 21:44 UTC (permalink / raw)
To: netdev
Cc: Eric Dumazet, Neal Cardwell, Soheil Hassas Yeganeh,
Willem de Bruijn, Yuchung Cheng, Kernel Team
In-Reply-To: <1461620690-1081063-1-git-send-email-kafai@fb.com>
This patch adds an eor bit to the TCP_SKB_CB. When MSG_EOR
is passed to tcp_sendmsg, the eor bit will be set at the skb
containing the last byte of the userland's msg. The eor bit
will prevent data from appending to that skb in the future.
The change in do_tcp_sendpages is to honor the eor set
during the previous tcp_sendmsg(MSG_EOR) call.
This patch handles the tcp_sendmsg case. The followup patches
will handle other skb coalescing and fragment cases.
One potential use case is to use MSG_EOR with
SOF_TIMESTAMPING_TX_ACK to get a more accurate
TCP ack timestamping on application protocol with
multiple outgoing response messages (e.g. HTTP2).
Packetdrill script for testing:
~~~~~~
+0 `sysctl -q -w net.ipv4.tcp_min_tso_segs=10`
+0 `sysctl -q -w net.ipv4.tcp_no_metrics_save=1`
+0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
0.100 < S 0:0(0) win 32792 <mss 1460,sackOK,nop,nop,nop,wscale 7>
0.100 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 7>
0.200 < . 1:1(0) ack 1 win 257
0.200 accept(3, ..., ...) = 4
+0 setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0
0.200 write(4, ..., 14600) = 14600
0.200 sendto(4, ..., 730, MSG_EOR, ..., ...) = 730
0.200 sendto(4, ..., 730, MSG_EOR, ..., ...) = 730
0.200 > . 1:7301(7300) ack 1
0.200 > P. 7301:14601(7300) ack 1
0.300 < . 1:1(0) ack 14601 win 257
0.300 > P. 14601:15331(730) ack 1
0.300 > P. 15331:16061(730) ack 1
0.400 < . 1:1(0) ack 16061 win 257
0.400 close(4) = 0
0.400 > F. 16061:16061(0) ack 1
0.400 < F. 1:1(0) ack 16062 win 257
0.400 > . 16062:16062(0) ack 2
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Neal Cardwell <ncardwell@google.com>
Cc: Soheil Hassas Yeganeh <soheil@google.com>
Cc: Willem de Bruijn <willemb@google.com>
Cc: Yuchung Cheng <ycheng@google.com>
Suggested-by: Eric Dumazet <edumazet@google.com>
---
include/net/tcp.h | 8 +++++++-
net/ipv4/tcp.c | 7 +++++--
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 7f2553d..ce08038 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -762,7 +762,8 @@ struct tcp_skb_cb {
__u8 ip_dsfield; /* IPv4 tos or IPv6 dsfield */
__u8 txstamp_ack:1, /* Record TX timestamp for ack? */
- unused:7;
+ eor:1, /* Is skb MSG_EOR marked? */
+ unused:6;
__u32 ack_seq; /* Sequence number ACK'd */
union {
struct inet_skb_parm h4;
@@ -809,6 +810,11 @@ static inline int tcp_skb_mss(const struct sk_buff *skb)
return TCP_SKB_CB(skb)->tcp_gso_size;
}
+static inline bool tcp_skb_can_collapse_to(const struct sk_buff *skb)
+{
+ return likely(!TCP_SKB_CB(skb)->eor);
+}
+
/* Events passed to congestion control interface */
enum tcp_ca_event {
CA_EVENT_TX_START, /* first transmit when no packets in flight */
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 4d73858..ea5364b 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -908,7 +908,8 @@ static ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset,
int copy, i;
bool can_coalesce;
- if (!tcp_send_head(sk) || (copy = size_goal - skb->len) <= 0) {
+ if (!tcp_send_head(sk) || (copy = size_goal - skb->len) <= 0 ||
+ !tcp_skb_can_collapse_to(skb)) {
new_segment:
if (!sk_stream_memory_free(sk))
goto wait_for_sndbuf;
@@ -1156,7 +1157,7 @@ int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
copy = max - skb->len;
}
- if (copy <= 0) {
+ if (copy <= 0 || !tcp_skb_can_collapse_to(skb)) {
new_segment:
/* Allocate new segment. If the interface is SG,
* allocate skb fitting to single page.
@@ -1250,6 +1251,8 @@ new_segment:
copied += copy;
if (!msg_data_left(msg)) {
tcp_tx_timestamp(sk, sockc.tsflags, skb);
+ if (unlikely(flags & MSG_EOR))
+ TCP_SKB_CB(skb)->eor = 1;
goto out;
}
--
2.5.1
^ permalink raw reply related
* Re: [PATCH net v2 2/3] drivers: net: cpsw: fix error messages when using phy-handle DT property
From: David Rivshin (Allworx) @ 2016-04-25 21:55 UTC (permalink / raw)
To: Grygorii Strashko, Mugunthan V N
Cc: Rob Herring, netdev, linux-omap, linux-arm-kernel, devicetree,
linux-kernel, David Miller, Andrew Goodbody, Markus Brunner,
Nicolas Chauvet
In-Reply-To: <571E6C14.8060007@ti.com>
On Mon, 25 Apr 2016 22:12:20 +0300
Grygorii Strashko <grygorii.strashko@ti.com> wrote:
> On 04/22/2016 06:45 PM, David Rivshin (Allworx) wrote:
> > On Fri, 22 Apr 2016 16:03:34 +0300
> > Grygorii Strashko <grygorii.strashko@ti.com> wrote:
> >
> >> On 04/21/2016 09:26 PM, David Rivshin (Allworx) wrote:
> >>> From: David Rivshin <drivshin@allworx.com>
> >>>
> >>> The phy-handle, phy_id, and fixed-link properties are mutually exclusive,
> >>> and only one need be specified. However if phy-handle was specified, an
> >>> error message would complain about the lack of phy_id or fixed-link.
>
> I think, commit message need to be updated.
> You not only fix log messages - you also fix the issue with
> of_get_phy_mode(slave_node); which will not be called if phy-handle is used.
You are correct, and that is probably the more important fix compared
to the error messages.
Because the content is becoming less coherent, what I may do is split
this patch into 3 small patches:
A) devicetree binding documentation changes
B) cpsw_probe_dt changes, with the fixes for of_get_phy_mode() and
related error message
C) cpsw_slave_open changes, with the fixes for crash if of_phy_connect
returns NULL, and related error message
Does that sound reasonable?
>
>
> slave_data->phy_if = of_get_phy_mode(slave_node);
> ^ see below
> >>>
> >>> Also, if phy-handle was specified and the subsequent of_phy_connect()
> >>> failed, the error message still referenced slaved->data->phy_id, which
> >>> would be empty. Instead, use the name of the device_node as a useful
> >>> identifier.
> >>>
> >>> Fixes: 9e42f715264f ("drivers: net: cpsw: add phy-handle parsing")
> >>> Signed-off-by: David Rivshin <drivshin@allworx.com>
> >>> Acked-by: Rob Herring <robh@kernel.org>
> >>> Tested-by: Nicolas Chauvet <kwizart@gmail.com>
> >>> ---
> >>> If would like this for -stable it should apply cleanly as far back
> >>> as 4.5. It failes on 4.4 due to some context differences, but can be
> >>> applied with 'git am -C2'. Or, I can produce a separate patch against
> >>> linux-4.4.y if preferred.
> >>>
> >>> Changes since v1 [1]:
> >>> - Rebased (no conflicts)
> >>> - Added Tested-by from Nicolas Chauvet
> >>> - Added Acked-by from Rob Herring for the binding change
> >>>
> >>> [1] https://patchwork.ozlabs.org/patch/560324/
> >>>
> >>> Documentation/devicetree/bindings/net/cpsw.txt | 4 ++--
> >>> drivers/net/ethernet/ti/cpsw.c | 17 +++++++++++++----
> >>> 2 files changed, 15 insertions(+), 6 deletions(-)
> >>>
> >>> diff --git a/Documentation/devicetree/bindings/net/cpsw.txt b/Documentation/devicetree/bindings/net/cpsw.txt
> >>> index 28a4781..3033c0f 100644
> >>> --- a/Documentation/devicetree/bindings/net/cpsw.txt
> >>> +++ b/Documentation/devicetree/bindings/net/cpsw.txt
> >>> @@ -46,16 +46,16 @@ Optional properties:
> >>> - dual_emac_res_vlan : Specifies VID to be used to segregate the ports
> >>> - mac-address : See ethernet.txt file in the same directory
> >>> - phy_id : Specifies slave phy id
> >>
> >> May be the "phy_id" can be marked as deprecated? (while here)
> >> The recommended property now is "phy-handle".
> >
> > I can certainly do that. Perhaps something like this?
> > - phy_id : Specifies slave phy id (deprecated, use phy-handle)
> >
> > Rob, would you have any issues with bundling that?
> >
> >>
> >>> - phy-handle : See ethernet.txt file in the same directory
> >>>
> >>> Slave sub-nodes:
> >>> - fixed-link : See fixed-link.txt file in the same directory
> >>> - Either the property phy_id, or the sub-node
> >>> - fixed-link can be specified
> >>> +
> >>> +Note: Exactly one of phy_id, phy-handle, or fixed-link must be specified.
> >>>
> >>> Note: "ti,hwmods" field is used to fetch the base address and irq
> >>> resources from TI, omap hwmod data base during device registration.
> >>> Future plan is to migrate hwmod data base contents into device tree
> >>> blob so that, all the required data will be used from device tree dts
> >>> file.
> >>>
> >>> diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
> >>> index d69cb3f..3c81413 100644
> >>> --- a/drivers/net/ethernet/ti/cpsw.c
> >>> +++ b/drivers/net/ethernet/ti/cpsw.c
> >>> @@ -1150,16 +1150,19 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
> >>> if (slave->data->phy_node)
> >>> slave->phy = of_phy_connect(priv->ndev, slave->data->phy_node,
> >>> &cpsw_adjust_link, 0, slave->data->phy_if);
> >>> else
> >>> slave->phy = phy_connect(priv->ndev, slave->data->phy_id,
> >>> &cpsw_adjust_link, slave->data->phy_if);
> >>> if (IS_ERR(slave->phy)) {
> >>> - dev_err(priv->dev, "phy %s not found on slave %d\n",
> >>> - slave->data->phy_id, slave->slave_num);
> >>> + dev_err(priv->dev, "phy \"%s\" not found on slave %d\n",
> >>> + slave->data->phy_node ?
> >>> + slave->data->phy_node->full_name :
> >>> + slave->data->phy_id,
> >>> + slave->slave_num);
> >>
> >> Unfortunately, there are some inconsistency between legacy and FDT API :(
> >> of_phy_connect() will return valid phy_device or NULL, but phy_connect()
> >> can return valid phy_device or ERR_PTR().
> >
> > Good catch, I hadn't noticed that. It looks like that's actually a more
> > serious (pre-existing) bug: if of_phy_connect() returns NULL, we'd end
> > up dereferencing it and pagefaulting.
> >
> > How about moving the IS_ERR() check into the phy_connect() case like this:
> > if (slave->data->phy_node) {
> > slave->phy = of_phy_connect(priv->ndev, slave->data->phy_node,
> > &cpsw_adjust_link, 0, slave->data->phy_if);
>
> [1]
>
> > } else {
> > slave->phy = phy_connect(priv->ndev, slave->data->phy_id,
> > &cpsw_adjust_link, slave->data->phy_if);
> > if (IS_ERR(slave->phy))
> > slave->phy = NULL;
> [2]
> > }
> > if (!slave->phy) {
> > dev_err(priv->dev, "phy \"%s\" not found on slave %d\n",
> > slave->data->phy_node ?
> > slave->data->phy_node->full_name :
> > slave->data->phy_id,
> > slave->slave_num);
> > } else {
> >
> > Since you say the phy_id case is deprecated anyways, I'm not too concerned
> > about not printing the error code returned by phy_connect() in that case
> > (especially since it never did so in the past). That lets us still avoid
> > duplicating the dev_err() itself.
>
> I'm not worry too much about duplicating dev_err() - it's always good to know
> the reason of failure.
>
> So, may be for of_phy_connect() [1]:
> dev_err(priv->dev, "phy \"%s\" not found on slave %d\n",
> slave->data->phy_node->full_name,
> slave->slave_num);
>
> and for phy_connect() [2]:
> dev_err(priv->dev, "phy %s not found on slave %d, err %d\n",
> slave->data->phy_id, slave->slave_num, PTR_ERR(slave->phy));
>
> Mugunthan, any comments?
If that's the preference, then I can incorporate that into V3.
>
> >
> >
> >>
> >>
> >>
> >>> slave->phy = NULL;
> >>> } else {
> >>> phy_attached_info(slave->phy);
> >>>
> >>> phy_start(slave->phy);
> >>>
> >>> /* Configure GMII_SEL register */
> >>> @@ -2030,15 +2033,19 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data,
> >>> /* This is no slave child node, continue */
> >>> if (strcmp(slave_node->name, "slave"))
> >>> continue;
> >>>
> >>> slave_data->phy_node = of_parse_phandle(slave_node,
> >>> "phy-handle", 0);
> >>> parp = of_get_property(slave_node, "phy_id", &lenp);
> >>> - if (of_phy_is_fixed_link(slave_node)) {
> >>> + if (slave_data->phy_node) {
> >>> + dev_dbg(&pdev->dev,
> >>> + "slave[%d] using phy-handle=\"%s\"\n",
> >>> + i, slave_data->phy_node->full_name);
> >>> + } else if (of_phy_is_fixed_link(slave_node)) {
> >>> struct device_node *phy_node;
> >>> struct phy_device *phy_dev;
> >>>
> >>> /* In the case of a fixed PHY, the DT node associated
> >>> * to the PHY is the Ethernet MAC DT node.
> >>> */
> >>> ret = of_phy_register_fixed_link(slave_node);
> >>> @@ -2067,15 +2074,17 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data,
> >>> if (!mdio) {
> >>> dev_err(&pdev->dev, "Missing mdio platform device\n");
> >>> return -EINVAL;
> >>> }
> >>> snprintf(slave_data->phy_id, sizeof(slave_data->phy_id),
> >>> PHY_ID_FMT, mdio->name, phyid);
> >>> } else {
> >>> - dev_err(&pdev->dev, "No slave[%d] phy_id or fixed-link property\n", i);
> >>> + dev_err(&pdev->dev,
> >>> + "No slave[%d] phy_id, phy-handle, or fixed-link property\n",
> >>> + i);
> >>> goto no_phy_slave;
> >>> }
> >>> slave_data->phy_if = of_get_phy_mode(slave_node);
>
> Your change will allow the code to reach this point in case of phy-handle.
>
> >>> if (slave_data->phy_if < 0) {
> >>> dev_err(&pdev->dev, "Missing or malformed slave[%d] phy-mode property\n",
> >>> i);
> >>> return slave_data->phy_if;
> >>>
> >>
> >>
>
>
^ permalink raw reply
* Re: [PATCH] net: ipv6: Delete host routes on an ifdown
From: David Ahern @ 2016-04-25 22:03 UTC (permalink / raw)
To: David Miller; +Cc: netdev, mmanning
In-Reply-To: <20160425.164227.1599148827995063295.davem@davemloft.net>
On 4/25/16 2:42 PM, David Miller wrote:
> From: David Ahern <dsa@cumulusnetworks.com>
> Date: Mon, 25 Apr 2016 13:40:26 -0600
>
>> It's unfortunate you want to take that action. Last week I came across
>> a prior attempt by Stephen to do this same thing -- keep IPv6
>> addresses. That prior attempt was reverted by commit
>> 73a8bd74e261. Cumulus, Brocade, and others clearly want this
>> capability.
>
> But nobody has implemented it correctly, it doesn't matter who wants
> the feature. That's why it keeps getting reverted.
>
> Also, this testing you are talking about should have happened long
> before you submitted that first patch that introduced all of these
> regressions. My observations tell me that the bulk of the testing
> happened afterwards and that's why all the regressions are popping up
> now.
>
My testing when submitting the patch was host level: Add an address,
while(1) (link up, link down), delete an address, etc.
Once it was committed to our kernel it started getting hit with a range
of L3 deployment scenarios with many nodes and networking config files
are uploaded and jumped between on real switch hardware - no reboot but
'networking reload' on the fly. Jumping between different deployments
with different sets addresses, routes, vrf devices, bridges, bonds, etc.
Your objection seems to be 'all these regressions' but beyond the ref
count from Andrey all of the bug reports have come from me with 1 from
Mike, another invested party wanting this to happen. I am the one who
spent the hours dealing with the kernel panics. My patch, my bug, my
time wasted coming up with the delta patch. Rather than focusing on my
mistakes, why not see the commitment on following through with this change?
^ permalink raw reply
* [PATCH] net: dsa: mv88e6xxx: fix uninitialized error return
From: Colin King @ 2016-04-25 22:11 UTC (permalink / raw)
To: David S . Miller, Vivien Didelot, Andrew Lunn, netdev; +Cc: linux-kernel
From: Colin Ian King <colin.king@canonical.com>
The error return err is not initialized and there is a possibility
that err is not assigned causing mv88e6xxx_port_bridge_join to
return a garbage error return status. Fix this by initializing err
to 0.
Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
drivers/net/dsa/mv88e6xxx.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index 028f92f..98d3cfb 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -2207,7 +2207,7 @@ int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
struct net_device *bridge)
{
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
- int i, err;
+ int i, err = 0;
mutex_lock(&ps->smi_mutex);
--
2.7.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