Netdev List
 help / color / mirror / Atom feed
* [PATCH net-next 0/8] udp: GRO in UDP sockets
From: Tom Herbert @ 2016-04-05 15:22 UTC (permalink / raw)
  To: davem, netdev; +Cc: kernel-team

This patch set adds GRO functions (gro_receive and gro_complete) to UDP
sockets and removes udp_offload infrastructure.

Add GRO functions (gro_receive and gro_complete) to UDP sockets. In
udp_gro_receive and udp_gro_complete a socket lookup is done instead of
looking up the port number in udp_offloads.  If a socket is found and
there are GRO functions for it then those are called. This feature
allows binding GRO functions to more than just a port number.
Eventually, we will be able to use this technique to allow application
defined GRO for an application protocol by attaching BPF porgrams to UDP
sockets for doing GRO.

In order to implement these functions, we added exported
udp6_lib_lookup_skb and udp4_lib_lookup_skb functions in ipv4/udp.c and
ipv6/udp.c. Also, inet_iif and references to skb_dst() were changed to
check that dst is set in skbuf before derefencing. In the GRO path there
is now a UDP socket lookup performed before dst is set, to the get the
device in that case we simply use skb->dev.

Tested:

Ran various combinations of VXLAN and GUE TCP_STREAM and TCP_RR tests.
Did not see any material regression.

Tom Herbert (8):
  net: Checks skb_dst to be NULL in inet_iif
  udp: Add udp6_lib_lookup_skb and udp4_lib_lookup_skb
  udp: Add GRO functions to UDP socket
  udp: Add socket based GRO and config
  vxlan: change vxlan to use UDP socket GRO
  fou: change to use UDP socket GRO
  geneve: change to use UDP socket GRO
  udp: Remove udp_offloads

 drivers/net/geneve.c      |  28 ++++--------
 drivers/net/vxlan.c       |  30 ++++--------
 include/linux/netdevice.h |  17 -------
 include/linux/udp.h       |   8 ++++
 include/net/protocol.h    |   3 --
 include/net/route.h       |   7 +--
 include/net/udp.h         |  11 ++++-
 include/net/udp_tunnel.h  |   7 +++
 include/net/vxlan.h       |   1 -
 net/ipv4/fou.c            |  48 +++++++-------------
 net/ipv4/udp.c            |  13 ++++++
 net/ipv4/udp_offload.c    | 113 ++++++++--------------------------------------
 net/ipv4/udp_tunnel.c     |   2 +
 net/ipv6/Makefile         |   5 +-
 net/ipv6/af_inet6.c       |   8 ++++
 net/ipv6/ip6_offload.c    |   2 -
 net/ipv6/ip6_offload.h    |   3 +-
 net/ipv6/udp.c            |  13 ++++++
 net/ipv6/udp_offload.c    |  11 +++--
 19 files changed, 129 insertions(+), 201 deletions(-)

-- 
2.8.0.rc2

^ permalink raw reply

* [PATCH net-next 1/8] net: Checks skb_dst to be NULL in inet_iif
From: Tom Herbert @ 2016-04-05 15:22 UTC (permalink / raw)
  To: davem, netdev; +Cc: kernel-team
In-Reply-To: <1459869776-2090500-1-git-send-email-tom@herbertland.com>

In inet_iif check if skb_rtable is NULL for the skb and return
skb->skb_iif if it is.

This change allows inet_iif to be called before the dst
information has been set in the skb (e.g. when doing socket based
UDP GRO).

Signed-off-by: Tom Herbert <tom@herbertland.com>
---
 include/net/route.h | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/include/net/route.h b/include/net/route.h
index 9b0a523..f4b11ee 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -322,10 +322,11 @@ static inline struct rtable *ip_route_newports(struct flowi4 *fl4, struct rtable
 
 static inline int inet_iif(const struct sk_buff *skb)
 {
-	int iif = skb_rtable(skb)->rt_iif;
+	struct rtable *rt = skb_rtable(skb);
+
+	if (rt && rt->rt_iif)
+		return rt->rt_iif;
 
-	if (iif)
-		return iif;
 	return skb->skb_iif;
 }
 
-- 
2.8.0.rc2

^ permalink raw reply related

* [PATCH net-next 4/8] udp: Add socket based GRO and config
From: Tom Herbert @ 2016-04-05 15:22 UTC (permalink / raw)
  To: davem, netdev; +Cc: kernel-team
In-Reply-To: <1459869776-2090500-1-git-send-email-tom@herbertland.com>

Add gro_receive and  gro_complete to struct udp_tunnel_sock_cfg.

Signed-off-by: Tom Herbert <tom@herbertland.com>
---
 include/net/udp_tunnel.h | 7 +++++++
 net/ipv4/udp_tunnel.c    | 2 ++
 2 files changed, 9 insertions(+)

diff --git a/include/net/udp_tunnel.h b/include/net/udp_tunnel.h
index b831140..2dcf1de 100644
--- a/include/net/udp_tunnel.h
+++ b/include/net/udp_tunnel.h
@@ -64,6 +64,11 @@ static inline int udp_sock_create(struct net *net,
 
 typedef int (*udp_tunnel_encap_rcv_t)(struct sock *sk, struct sk_buff *skb);
 typedef void (*udp_tunnel_encap_destroy_t)(struct sock *sk);
+typedef struct sk_buff **(*udp_tunnel_gro_receive_t)(struct sock *sk,
+						     struct sk_buff **head,
+						     struct sk_buff *skb);
+typedef int (*udp_tunnel_gro_complete_t)(struct sock *sk, struct sk_buff *skb,
+					 int nhoff);
 
 struct udp_tunnel_sock_cfg {
 	void *sk_user_data;     /* user data used by encap_rcv call back */
@@ -71,6 +76,8 @@ struct udp_tunnel_sock_cfg {
 	__u8  encap_type;
 	udp_tunnel_encap_rcv_t encap_rcv;
 	udp_tunnel_encap_destroy_t encap_destroy;
+	udp_tunnel_gro_receive_t gro_receive;
+	udp_tunnel_gro_complete_t gro_complete;
 };
 
 /* Setup the given (UDP) sock to receive UDP encapsulated packets */
diff --git a/net/ipv4/udp_tunnel.c b/net/ipv4/udp_tunnel.c
index 96599d1..47f12c7 100644
--- a/net/ipv4/udp_tunnel.c
+++ b/net/ipv4/udp_tunnel.c
@@ -69,6 +69,8 @@ void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
 	udp_sk(sk)->encap_type = cfg->encap_type;
 	udp_sk(sk)->encap_rcv = cfg->encap_rcv;
 	udp_sk(sk)->encap_destroy = cfg->encap_destroy;
+	udp_sk(sk)->gro_receive = cfg->gro_receive;
+	udp_sk(sk)->gro_complete = cfg->gro_complete;
 
 	udp_tunnel_encap_enable(sock);
 }
-- 
2.8.0.rc2

^ permalink raw reply related

* [PATCH net-next 3/8] udp: Add GRO functions to UDP socket
From: Tom Herbert @ 2016-04-05 15:22 UTC (permalink / raw)
  To: davem, netdev; +Cc: kernel-team
In-Reply-To: <1459869776-2090500-1-git-send-email-tom@herbertland.com>

This patch adds GRO functions (gro_receive and gro_complete) to UDP
sockets. udp_gro_receive is changed to perform socket lookup on a
packet. If a socket is found the related GRO functions are called.

This features obsoletes using UDP offload infrastructure for GRO
(udp_offload). This has the advantage of not being limited to provide
offload on a per port basis, GRO is now applied to whatever individual
UDP sockets are bound to.  This also allows the possbility of
"application defined GRO"-- that is we can attach something like
a BPF program to a UDP socket to perfrom GRO on an application
layer protocol.

Signed-off-by: Tom Herbert <tom@herbertland.com>
---
 include/linux/udp.h    |  8 ++++++++
 include/net/udp.h      |  7 +++++--
 net/ipv4/udp_offload.c | 52 +++++++++++++++++++-------------------------------
 net/ipv6/Makefile      |  5 +++--
 net/ipv6/af_inet6.c    |  8 ++++++++
 net/ipv6/ip6_offload.c |  2 --
 net/ipv6/ip6_offload.h |  3 ++-
 net/ipv6/udp_offload.c | 11 ++++++++---
 8 files changed, 54 insertions(+), 42 deletions(-)

diff --git a/include/linux/udp.h b/include/linux/udp.h
index 3234275..d1fd8cd 100644
--- a/include/linux/udp.h
+++ b/include/linux/udp.h
@@ -71,6 +71,14 @@ struct udp_sock {
 	 */
 	int (*encap_rcv)(struct sock *sk, struct sk_buff *skb);
 	void (*encap_destroy)(struct sock *sk);
+
+	/* GRO functions for UDP socket */
+	struct sk_buff **	(*gro_receive)(struct sock *sk,
+					       struct sk_buff **head,
+					       struct sk_buff *skb);
+	int			(*gro_complete)(struct sock *sk,
+						struct sk_buff *skb,
+						int nhoff);
 };
 
 static inline struct udp_sock *udp_sk(const struct sock *sk)
diff --git a/include/net/udp.h b/include/net/udp.h
index e2e3803..e245a1d 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -158,9 +158,12 @@ static inline __sum16 udp_v4_check(int len, __be32 saddr,
 void udp_set_csum(bool nocheck, struct sk_buff *skb,
 		  __be32 saddr, __be32 daddr, int len);
 
+typedef struct sock *(*udp_lookup_t)(struct sk_buff *skb, __be16 sport,
+				     __be16 dport);
+
 struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
-				 struct udphdr *uh);
-int udp_gro_complete(struct sk_buff *skb, int nhoff);
+				 struct udphdr *uh, udp_lookup_t lookup);
+int udp_gro_complete(struct sk_buff *skb, int nhoff, udp_lookup_t lookup);
 
 static inline struct udphdr *udp_gro_udphdr(struct sk_buff *skb)
 {
diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
index 0ed2daf..65c3fd3 100644
--- a/net/ipv4/udp_offload.c
+++ b/net/ipv4/udp_offload.c
@@ -179,6 +179,7 @@ out_unlock:
 
 	return segs;
 }
+EXPORT_SYMBOL(skb_udp_tunnel_segment);
 
 static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb,
 					 netdev_features_t features)
@@ -304,13 +305,13 @@ unlock:
 EXPORT_SYMBOL(udp_del_offload);
 
 struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
-				 struct udphdr *uh)
+				 struct udphdr *uh, udp_lookup_t lookup)
 {
-	struct udp_offload_priv *uo_priv;
 	struct sk_buff *p, **pp = NULL;
 	struct udphdr *uh2;
 	unsigned int off = skb_gro_offset(skb);
 	int flush = 1;
+	struct sock *sk;
 
 	if (NAPI_GRO_CB(skb)->encap_mark ||
 	    (skb->ip_summed != CHECKSUM_PARTIAL &&
@@ -322,13 +323,11 @@ struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
 	NAPI_GRO_CB(skb)->encap_mark = 1;
 
 	rcu_read_lock();
-	uo_priv = rcu_dereference(udp_offload_base);
-	for (; uo_priv != NULL; uo_priv = rcu_dereference(uo_priv->next)) {
-		if (net_eq(read_pnet(&uo_priv->net), dev_net(skb->dev)) &&
-		    uo_priv->offload->port == uh->dest &&
-		    uo_priv->offload->callbacks.gro_receive)
-			goto unflush;
-	}
+	sk = (*lookup)(skb, uh->source, uh->dest);
+
+	if (sk && udp_sk(sk)->gro_receive)
+		goto unflush;
+
 	goto out_unlock;
 
 unflush:
@@ -352,9 +351,7 @@ unflush:
 
 	skb_gro_pull(skb, sizeof(struct udphdr)); /* pull encapsulating udp header */
 	skb_gro_postpull_rcsum(skb, uh, sizeof(struct udphdr));
-	NAPI_GRO_CB(skb)->proto = uo_priv->offload->ipproto;
-	pp = uo_priv->offload->callbacks.gro_receive(head, skb,
-						     uo_priv->offload);
+	pp = udp_sk(sk)->gro_receive(sk, head, skb);
 
 out_unlock:
 	rcu_read_unlock();
@@ -362,6 +359,7 @@ out:
 	NAPI_GRO_CB(skb)->flush |= flush;
 	return pp;
 }
+EXPORT_SYMBOL(udp_gro_receive);
 
 static struct sk_buff **udp4_gro_receive(struct sk_buff **head,
 					 struct sk_buff *skb)
@@ -383,39 +381,28 @@ static struct sk_buff **udp4_gro_receive(struct sk_buff **head,
 					     inet_gro_compute_pseudo);
 skip:
 	NAPI_GRO_CB(skb)->is_ipv6 = 0;
-	return udp_gro_receive(head, skb, uh);
+	return udp_gro_receive(head, skb, uh, udp4_lib_lookup_skb);
 
 flush:
 	NAPI_GRO_CB(skb)->flush = 1;
 	return NULL;
 }
 
-int udp_gro_complete(struct sk_buff *skb, int nhoff)
+int udp_gro_complete(struct sk_buff *skb, int nhoff,
+		     udp_lookup_t lookup)
 {
-	struct udp_offload_priv *uo_priv;
 	__be16 newlen = htons(skb->len - nhoff);
 	struct udphdr *uh = (struct udphdr *)(skb->data + nhoff);
 	int err = -ENOSYS;
+	struct sock *sk;
 
 	uh->len = newlen;
 
 	rcu_read_lock();
-
-	uo_priv = rcu_dereference(udp_offload_base);
-	for (; uo_priv != NULL; uo_priv = rcu_dereference(uo_priv->next)) {
-		if (net_eq(read_pnet(&uo_priv->net), dev_net(skb->dev)) &&
-		    uo_priv->offload->port == uh->dest &&
-		    uo_priv->offload->callbacks.gro_complete)
-			break;
-	}
-
-	if (uo_priv) {
-		NAPI_GRO_CB(skb)->proto = uo_priv->offload->ipproto;
-		err = uo_priv->offload->callbacks.gro_complete(skb,
-				nhoff + sizeof(struct udphdr),
-				uo_priv->offload);
-	}
-
+	sk = (*lookup)(skb, uh->source, uh->dest);
+	if (sk && udp_sk(sk)->gro_complete)
+		err = udp_sk(sk)->gro_complete(sk, skb,
+				nhoff + sizeof(struct udphdr));
 	rcu_read_unlock();
 
 	if (skb->remcsum_offload)
@@ -426,6 +413,7 @@ int udp_gro_complete(struct sk_buff *skb, int nhoff)
 
 	return err;
 }
+EXPORT_SYMBOL(udp_gro_complete);
 
 static int udp4_gro_complete(struct sk_buff *skb, int nhoff)
 {
@@ -440,7 +428,7 @@ static int udp4_gro_complete(struct sk_buff *skb, int nhoff)
 		skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL;
 	}
 
-	return udp_gro_complete(skb, nhoff);
+	return udp_gro_complete(skb, nhoff, udp4_lib_lookup_skb);
 }
 
 static const struct net_offload udpv4_offload = {
diff --git a/net/ipv6/Makefile b/net/ipv6/Makefile
index 2fbd90b..5e9d6bf 100644
--- a/net/ipv6/Makefile
+++ b/net/ipv6/Makefile
@@ -8,9 +8,10 @@ ipv6-objs :=	af_inet6.o anycast.o ip6_output.o ip6_input.o addrconf.o \
 		addrlabel.o \
 		route.o ip6_fib.o ipv6_sockglue.o ndisc.o udp.o udplite.o \
 		raw.o icmp.o mcast.o reassembly.o tcp_ipv6.o ping.o \
-		exthdrs.o datagram.o ip6_flowlabel.o inet6_connection_sock.o
+		exthdrs.o datagram.o ip6_flowlabel.o inet6_connection_sock.o \
+		udp_offload.o
 
-ipv6-offload :=	ip6_offload.o tcpv6_offload.o udp_offload.o exthdrs_offload.o
+ipv6-offload :=	ip6_offload.o tcpv6_offload.o exthdrs_offload.o
 
 ipv6-$(CONFIG_SYSCTL) = sysctl_net_ipv6.o
 ipv6-$(CONFIG_IPV6_MROUTE) += ip6mr.o
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index b11c37c..9a2fec5 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -64,6 +64,8 @@
 #include <asm/uaccess.h>
 #include <linux/mroute6.h>
 
+#include "ip6_offload.h"
+
 MODULE_AUTHOR("Cast of dozens");
 MODULE_DESCRIPTION("IPv6 protocol stack for Linux");
 MODULE_LICENSE("GPL");
@@ -958,6 +960,10 @@ static int __init inet6_init(void)
 	if (err)
 		goto udplitev6_fail;
 
+	err = udpv6_offload_init();
+	if (err)
+		goto udpv6_offload_fail;
+
 	err = tcpv6_init();
 	if (err)
 		goto tcpv6_fail;
@@ -987,6 +993,8 @@ pingv6_fail:
 ipv6_packet_fail:
 	tcpv6_exit();
 tcpv6_fail:
+	udpv6_offload_exit();
+udpv6_offload_fail:
 	udplitev6_exit();
 udplitev6_fail:
 	udpv6_exit();
diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c
index 82e9f30..204af22 100644
--- a/net/ipv6/ip6_offload.c
+++ b/net/ipv6/ip6_offload.c
@@ -325,8 +325,6 @@ static int __init ipv6_offload_init(void)
 
 	if (tcpv6_offload_init() < 0)
 		pr_crit("%s: Cannot add TCP protocol offload\n", __func__);
-	if (udp_offload_init() < 0)
-		pr_crit("%s: Cannot add UDP protocol offload\n", __func__);
 	if (ipv6_exthdrs_offload_init() < 0)
 		pr_crit("%s: Cannot add EXTHDRS protocol offload\n", __func__);
 
diff --git a/net/ipv6/ip6_offload.h b/net/ipv6/ip6_offload.h
index 2e155c6..96b40e4 100644
--- a/net/ipv6/ip6_offload.h
+++ b/net/ipv6/ip6_offload.h
@@ -12,7 +12,8 @@
 #define __ip6_offload_h
 
 int ipv6_exthdrs_offload_init(void);
-int udp_offload_init(void);
+int udpv6_offload_init(void);
+int udpv6_offload_exit(void);
 int tcpv6_offload_init(void);
 
 #endif
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c
index 2b0fbe6..5429f6b 100644
--- a/net/ipv6/udp_offload.c
+++ b/net/ipv6/udp_offload.c
@@ -153,7 +153,7 @@ static struct sk_buff **udp6_gro_receive(struct sk_buff **head,
 
 skip:
 	NAPI_GRO_CB(skb)->is_ipv6 = 1;
-	return udp_gro_receive(head, skb, uh);
+	return udp_gro_receive(head, skb, uh, udp6_lib_lookup_skb);
 
 flush:
 	NAPI_GRO_CB(skb)->flush = 1;
@@ -173,7 +173,7 @@ static int udp6_gro_complete(struct sk_buff *skb, int nhoff)
 		skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL;
 	}
 
-	return udp_gro_complete(skb, nhoff);
+	return udp_gro_complete(skb, nhoff, udp6_lib_lookup_skb);
 }
 
 static const struct net_offload udpv6_offload = {
@@ -184,7 +184,12 @@ static const struct net_offload udpv6_offload = {
 	},
 };
 
-int __init udp_offload_init(void)
+int udpv6_offload_init(void)
 {
 	return inet6_add_offload(&udpv6_offload, IPPROTO_UDP);
 }
+
+int udpv6_offload_exit(void)
+{
+	return inet6_del_offload(&udpv6_offload, IPPROTO_UDP);
+}
-- 
2.8.0.rc2

^ permalink raw reply related

* [PATCH net-next 5/8] vxlan: change vxlan to use UDP socket GRO
From: Tom Herbert @ 2016-04-05 15:22 UTC (permalink / raw)
  To: davem, netdev; +Cc: kernel-team
In-Reply-To: <1459869776-2090500-1-git-send-email-tom@herbertland.com>

Adapt vxlan_gro_receive, vxlan_gro_complete to take a socket argument.
Set these functions in tunnel_config.  Don't set udp_offloads any more.

Signed-off-by: Tom Herbert <tom@herbertland.com>
---
 drivers/net/vxlan.c | 30 ++++++++----------------------
 include/net/vxlan.h |  1 -
 2 files changed, 8 insertions(+), 23 deletions(-)

diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 1c0fa36..29e7269 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -551,16 +551,15 @@ static struct vxlanhdr *vxlan_gro_remcsum(struct sk_buff *skb,
 	return vh;
 }
 
-static struct sk_buff **vxlan_gro_receive(struct sk_buff **head,
-					  struct sk_buff *skb,
-					  struct udp_offload *uoff)
+static struct sk_buff **vxlan_gro_receive(struct sock *sk,
+					  struct sk_buff **head,
+					  struct sk_buff *skb)
 {
 	struct sk_buff *p, **pp = NULL;
 	struct vxlanhdr *vh, *vh2;
 	unsigned int hlen, off_vx;
 	int flush = 1;
-	struct vxlan_sock *vs = container_of(uoff, struct vxlan_sock,
-					     udp_offloads);
+	struct vxlan_sock *vs = rcu_dereference_sk_user_data(sk);
 	__be32 flags;
 	struct gro_remcsum grc;
 
@@ -613,8 +612,7 @@ out:
 	return pp;
 }
 
-static int vxlan_gro_complete(struct sk_buff *skb, int nhoff,
-			      struct udp_offload *uoff)
+static int vxlan_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff)
 {
 	udp_tunnel_gro_complete(skb, nhoff);
 
@@ -629,13 +627,6 @@ static void vxlan_notify_add_rx_port(struct vxlan_sock *vs)
 	struct net *net = sock_net(sk);
 	sa_family_t sa_family = vxlan_get_sk_family(vs);
 	__be16 port = inet_sk(sk)->inet_sport;
-	int err;
-
-	if (sa_family == AF_INET) {
-		err = udp_add_offload(net, &vs->udp_offloads);
-		if (err)
-			pr_warn("vxlan: udp_add_offload failed with status %d\n", err);
-	}
 
 	rcu_read_lock();
 	for_each_netdev_rcu(net, dev) {
@@ -662,9 +653,6 @@ static void vxlan_notify_del_rx_port(struct vxlan_sock *vs)
 							    port);
 	}
 	rcu_read_unlock();
-
-	if (sa_family == AF_INET)
-		udp_del_offload(&vs->udp_offloads);
 }
 
 /* Add new entry to forwarding table -- assumes lock held */
@@ -2640,21 +2628,19 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, bool ipv6,
 	atomic_set(&vs->refcnt, 1);
 	vs->flags = (flags & VXLAN_F_RCV_FLAGS);
 
-	/* Initialize the vxlan udp offloads structure */
-	vs->udp_offloads.port = port;
-	vs->udp_offloads.callbacks.gro_receive  = vxlan_gro_receive;
-	vs->udp_offloads.callbacks.gro_complete = vxlan_gro_complete;
-
 	spin_lock(&vn->sock_lock);
 	hlist_add_head_rcu(&vs->hlist, vs_head(net, port));
 	vxlan_notify_add_rx_port(vs);
 	spin_unlock(&vn->sock_lock);
 
 	/* Mark socket as an encapsulation socket. */
+	memset(&tunnel_cfg, 0, sizeof(tunnel_cfg));
 	tunnel_cfg.sk_user_data = vs;
 	tunnel_cfg.encap_type = 1;
 	tunnel_cfg.encap_rcv = vxlan_rcv;
 	tunnel_cfg.encap_destroy = NULL;
+	tunnel_cfg.gro_receive = vxlan_gro_receive;
+	tunnel_cfg.gro_complete = vxlan_gro_complete;
 
 	setup_udp_tunnel_sock(net, sock, &tunnel_cfg);
 
diff --git a/include/net/vxlan.h b/include/net/vxlan.h
index 73ed2e9..2ad2136 100644
--- a/include/net/vxlan.h
+++ b/include/net/vxlan.h
@@ -131,7 +131,6 @@ struct vxlan_sock {
 	struct rcu_head	  rcu;
 	struct hlist_head vni_list[VNI_HASH_SIZE];
 	atomic_t	  refcnt;
-	struct udp_offload udp_offloads;
 	u32		  flags;
 };
 
-- 
2.8.0.rc2

^ permalink raw reply related

* [PATCH net-next 2/8] udp: Add udp6_lib_lookup_skb and udp4_lib_lookup_skb
From: Tom Herbert @ 2016-04-05 15:22 UTC (permalink / raw)
  To: davem, netdev; +Cc: kernel-team
In-Reply-To: <1459869776-2090500-1-git-send-email-tom@herbertland.com>

Add externally visible functions to lookup a UDP socket by skb. This
will be used for GRO in UDP sockets. These functions also check
if skb->dst is set, and if it is not skb->dev is used to get dev_net.
This allows calling lookup functions before dst has been set on the
skbuff.

Signed-off-by: Tom Herbert <tom@herbertland.com>
---
 include/net/udp.h |  4 ++++
 net/ipv4/udp.c    | 13 +++++++++++++
 net/ipv6/udp.c    | 13 +++++++++++++
 3 files changed, 30 insertions(+)

diff --git a/include/net/udp.h b/include/net/udp.h
index d870ec1..e2e3803 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -260,6 +260,8 @@ struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
 struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
 			       __be32 daddr, __be16 dport, int dif,
 			       struct udp_table *tbl, struct sk_buff *skb);
+struct sock *udp4_lib_lookup_skb(struct sk_buff *skb,
+				 __be16 sport, __be16 dport);
 struct sock *udp6_lib_lookup(struct net *net,
 			     const struct in6_addr *saddr, __be16 sport,
 			     const struct in6_addr *daddr, __be16 dport,
@@ -269,6 +271,8 @@ struct sock *__udp6_lib_lookup(struct net *net,
 			       const struct in6_addr *daddr, __be16 dport,
 			       int dif, struct udp_table *tbl,
 			       struct sk_buff *skb);
+struct sock *udp6_lib_lookup_skb(struct sk_buff *skb,
+				 __be16 sport, __be16 dport);
 
 /*
  * 	SNMP statistics for UDP and UDP-Lite
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 355bdb2..b39c566 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -604,6 +604,19 @@ static inline struct sock *__udp4_lib_lookup_skb(struct sk_buff *skb,
 				 udptable, skb);
 }
 
+struct sock *udp4_lib_lookup_skb(struct sk_buff *skb,
+				 __be16 sport, __be16 dport)
+{
+	const struct iphdr *iph = ip_hdr(skb);
+	const struct net_device *dev =
+	    skb_dst(skb) ? skb_dst(skb)->dev : skb->dev;
+
+	return __udp4_lib_lookup(dev_net(dev), iph->saddr, sport,
+				 iph->daddr, dport, inet_iif(skb),
+				 &udp_table, skb);
+}
+EXPORT_SYMBOL_GPL(udp4_lib_lookup_skb);
+
 /* Must be called under rcu_read_lock().
  * Does increment socket refcount.
  */
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 78a7dfd..33a58eb 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -326,6 +326,19 @@ static struct sock *__udp6_lib_lookup_skb(struct sk_buff *skb,
 				 udptable, skb);
 }
 
+struct sock *udp6_lib_lookup_skb(struct sk_buff *skb,
+				 __be16 sport, __be16 dport)
+{
+	const struct ipv6hdr *iph = ipv6_hdr(skb);
+	const struct net_device *dev =
+	    skb_dst(skb) ? skb_dst(skb)->dev : skb->dev;
+
+	return __udp6_lib_lookup(dev_net(dev), &iph->saddr, sport,
+				 &iph->daddr, dport, inet6_iif(skb),
+				 &udp_table, skb);
+}
+EXPORT_SYMBOL_GPL(udp6_lib_lookup_skb);
+
 /* Must be called under rcu_read_lock().
  * Does increment socket refcount.
  */
-- 
2.8.0.rc2

^ permalink raw reply related

* [PATCH net-next 6/8] fou: change to use UDP socket GRO
From: Tom Herbert @ 2016-04-05 15:22 UTC (permalink / raw)
  To: davem, netdev; +Cc: kernel-team
In-Reply-To: <1459869776-2090500-1-git-send-email-tom@herbertland.com>

Adapt gue_gro_receive, gue_gro_complete to take a socket argument.
Don't set udp_offloads any more.

Signed-off-by: Tom Herbert <tom@herbertland.com>
---
 net/ipv4/fou.c | 48 +++++++++++++++++-------------------------------
 1 file changed, 17 insertions(+), 31 deletions(-)

diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c
index 5a94aea..5738b97 100644
--- a/net/ipv4/fou.c
+++ b/net/ipv4/fou.c
@@ -22,7 +22,6 @@ struct fou {
 	u8 flags;
 	__be16 port;
 	u16 type;
-	struct udp_offload udp_offloads;
 	struct list_head list;
 	struct rcu_head rcu;
 };
@@ -186,13 +185,13 @@ drop:
 	return 0;
 }
 
-static struct sk_buff **fou_gro_receive(struct sk_buff **head,
-					struct sk_buff *skb,
-					struct udp_offload *uoff)
+static struct sk_buff **fou_gro_receive(struct sock *sk,
+					struct sk_buff **head,
+					struct sk_buff *skb)
 {
 	const struct net_offload *ops;
 	struct sk_buff **pp = NULL;
-	u8 proto = NAPI_GRO_CB(skb)->proto;
+	u8 proto = fou_from_sock(sk)->protocol;
 	const struct net_offload **offloads;
 
 	/* We can clear the encap_mark for FOU as we are essentially doing
@@ -217,11 +216,11 @@ out_unlock:
 	return pp;
 }
 
-static int fou_gro_complete(struct sk_buff *skb, int nhoff,
-			    struct udp_offload *uoff)
+static int fou_gro_complete(struct sock *sk, struct sk_buff *skb,
+			    int nhoff)
 {
 	const struct net_offload *ops;
-	u8 proto = NAPI_GRO_CB(skb)->proto;
+	u8 proto = fou_from_sock(sk)->protocol;
 	int err = -ENOSYS;
 	const struct net_offload **offloads;
 
@@ -264,9 +263,9 @@ static struct guehdr *gue_gro_remcsum(struct sk_buff *skb, unsigned int off,
 	return guehdr;
 }
 
-static struct sk_buff **gue_gro_receive(struct sk_buff **head,
-					struct sk_buff *skb,
-					struct udp_offload *uoff)
+static struct sk_buff **gue_gro_receive(struct sock *sk,
+					struct sk_buff **head,
+					struct sk_buff *skb)
 {
 	const struct net_offload **offloads;
 	const struct net_offload *ops;
@@ -277,7 +276,7 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head,
 	void *data;
 	u16 doffset = 0;
 	int flush = 1;
-	struct fou *fou = container_of(uoff, struct fou, udp_offloads);
+	struct fou *fou = fou_from_sock(sk);
 	struct gro_remcsum grc;
 
 	skb_gro_remcsum_init(&grc);
@@ -386,8 +385,7 @@ out:
 	return pp;
 }
 
-static int gue_gro_complete(struct sk_buff *skb, int nhoff,
-			    struct udp_offload *uoff)
+static int gue_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff)
 {
 	const struct net_offload **offloads;
 	struct guehdr *guehdr = (struct guehdr *)(skb->data + nhoff);
@@ -435,10 +433,7 @@ static int fou_add_to_port_list(struct net *net, struct fou *fou)
 static void fou_release(struct fou *fou)
 {
 	struct socket *sock = fou->sock;
-	struct sock *sk = sock->sk;
 
-	if (sk->sk_family == AF_INET)
-		udp_del_offload(&fou->udp_offloads);
 	list_del(&fou->list);
 	udp_tunnel_sock_release(sock);
 
@@ -448,11 +443,9 @@ static void fou_release(struct fou *fou)
 static int fou_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
 {
 	udp_sk(sk)->encap_rcv = fou_udp_recv;
-	fou->protocol = cfg->protocol;
-	fou->udp_offloads.callbacks.gro_receive = fou_gro_receive;
-	fou->udp_offloads.callbacks.gro_complete = fou_gro_complete;
-	fou->udp_offloads.port = cfg->udp_config.local_udp_port;
-	fou->udp_offloads.ipproto = cfg->protocol;
+	udp_sk(sk)->gro_receive = fou_gro_receive;
+	udp_sk(sk)->gro_complete = fou_gro_complete;
+	fou_from_sock(sk)->protocol = cfg->protocol;
 
 	return 0;
 }
@@ -460,9 +453,8 @@ static int fou_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
 static int gue_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
 {
 	udp_sk(sk)->encap_rcv = gue_udp_recv;
-	fou->udp_offloads.callbacks.gro_receive = gue_gro_receive;
-	fou->udp_offloads.callbacks.gro_complete = gue_gro_complete;
-	fou->udp_offloads.port = cfg->udp_config.local_udp_port;
+	udp_sk(sk)->gro_receive = gue_gro_receive;
+	udp_sk(sk)->gro_complete = gue_gro_complete;
 
 	return 0;
 }
@@ -521,12 +513,6 @@ static int fou_create(struct net *net, struct fou_cfg *cfg,
 
 	sk->sk_allocation = GFP_ATOMIC;
 
-	if (cfg->udp_config.family == AF_INET) {
-		err = udp_add_offload(net, &fou->udp_offloads);
-		if (err)
-			goto error;
-	}
-
 	err = fou_add_to_port_list(net, fou);
 	if (err)
 		goto error;
-- 
2.8.0.rc2

^ permalink raw reply related

* [PATCH net-next 7/8] geneve: change to use UDP socket GRO
From: Tom Herbert @ 2016-04-05 15:22 UTC (permalink / raw)
  To: davem, netdev; +Cc: kernel-team
In-Reply-To: <1459869776-2090500-1-git-send-email-tom@herbertland.com>

Adapt geneve_gro_receive, geneve_gro_complete to take a socket argument.
Set these functions in tunnel_config.  Don't set udp_offloads any more.

Signed-off-by: Tom Herbert <tom@herbertland.com>
---
 drivers/net/geneve.c | 28 ++++++++--------------------
 1 file changed, 8 insertions(+), 20 deletions(-)

diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index bc16889..a9fbf17 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -87,7 +87,6 @@ struct geneve_sock {
 	struct socket		*sock;
 	struct rcu_head		rcu;
 	int			refcnt;
-	struct udp_offload	udp_offloads;
 	struct hlist_head	vni_list[VNI_HASH_SIZE];
 	u32			flags;
 };
@@ -409,14 +408,6 @@ static void geneve_notify_add_rx_port(struct geneve_sock *gs)
 	struct net *net = sock_net(sk);
 	sa_family_t sa_family = geneve_get_sk_family(gs);
 	__be16 port = inet_sk(sk)->inet_sport;
-	int err;
-
-	if (sa_family == AF_INET) {
-		err = udp_add_offload(sock_net(sk), &gs->udp_offloads);
-		if (err)
-			pr_warn("geneve: udp_add_offload failed with status %d\n",
-				err);
-	}
 
 	rcu_read_lock();
 	for_each_netdev_rcu(net, dev) {
@@ -432,9 +423,9 @@ static int geneve_hlen(struct genevehdr *gh)
 	return sizeof(*gh) + gh->opt_len * 4;
 }
 
-static struct sk_buff **geneve_gro_receive(struct sk_buff **head,
-					   struct sk_buff *skb,
-					   struct udp_offload *uoff)
+static struct sk_buff **geneve_gro_receive(struct sock *sk,
+					   struct sk_buff **head,
+					   struct sk_buff *skb)
 {
 	struct sk_buff *p, **pp = NULL;
 	struct genevehdr *gh, *gh2;
@@ -495,8 +486,8 @@ out:
 	return pp;
 }
 
-static int geneve_gro_complete(struct sk_buff *skb, int nhoff,
-			       struct udp_offload *uoff)
+static int geneve_gro_complete(struct sock *sk, struct sk_buff *skb,
+			       int nhoff)
 {
 	struct genevehdr *gh;
 	struct packet_offload *ptype;
@@ -545,14 +536,14 @@ static struct geneve_sock *geneve_socket_create(struct net *net, __be16 port,
 		INIT_HLIST_HEAD(&gs->vni_list[h]);
 
 	/* Initialize the geneve udp offloads structure */
-	gs->udp_offloads.port = port;
-	gs->udp_offloads.callbacks.gro_receive  = geneve_gro_receive;
-	gs->udp_offloads.callbacks.gro_complete = geneve_gro_complete;
 	geneve_notify_add_rx_port(gs);
 
 	/* Mark socket as an encapsulation socket */
+	memset(&tunnel_cfg, 0, sizeof(tunnel_cfg));
 	tunnel_cfg.sk_user_data = gs;
 	tunnel_cfg.encap_type = 1;
+	tunnel_cfg.gro_receive = geneve_gro_receive;
+	tunnel_cfg.gro_complete = geneve_gro_complete;
 	tunnel_cfg.encap_rcv = geneve_udp_encap_recv;
 	tunnel_cfg.encap_destroy = NULL;
 	setup_udp_tunnel_sock(net, sock, &tunnel_cfg);
@@ -576,9 +567,6 @@ static void geneve_notify_del_rx_port(struct geneve_sock *gs)
 	}
 
 	rcu_read_unlock();
-
-	if (sa_family == AF_INET)
-		udp_del_offload(&gs->udp_offloads);
 }
 
 static void __geneve_sock_release(struct geneve_sock *gs)
-- 
2.8.0.rc2

^ permalink raw reply related

* [PATCH net-next 8/8] udp: Remove udp_offloads
From: Tom Herbert @ 2016-04-05 15:22 UTC (permalink / raw)
  To: davem, netdev; +Cc: kernel-team
In-Reply-To: <1459869776-2090500-1-git-send-email-tom@herbertland.com>

Now that the UDP encapsulation GRO functions have been moved to the UDP
socket we not longer need the udp_offload insfrastructure so removing it.

Signed-off-by: Tom Herbert <tom@herbertland.com>
---
 include/linux/netdevice.h | 17 -------------
 include/net/protocol.h    |  3 ---
 net/ipv4/udp_offload.c    | 63 -----------------------------------------------
 3 files changed, 83 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index cb0d5d0..cb4e508 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2159,23 +2159,6 @@ struct packet_offload {
 	struct list_head	 list;
 };
 
-struct udp_offload;
-
-struct udp_offload_callbacks {
-	struct sk_buff		**(*gro_receive)(struct sk_buff **head,
-						 struct sk_buff *skb,
-						 struct udp_offload *uoff);
-	int			(*gro_complete)(struct sk_buff *skb,
-						int nhoff,
-						struct udp_offload *uoff);
-};
-
-struct udp_offload {
-	__be16			 port;
-	u8			 ipproto;
-	struct udp_offload_callbacks callbacks;
-};
-
 /* often modified stats are per-CPU, other are shared (netdev->stats) */
 struct pcpu_sw_netstats {
 	u64     rx_packets;
diff --git a/include/net/protocol.h b/include/net/protocol.h
index da689f5..bf36ca3 100644
--- a/include/net/protocol.h
+++ b/include/net/protocol.h
@@ -107,9 +107,6 @@ int inet_del_offload(const struct net_offload *prot, unsigned char num);
 void inet_register_protosw(struct inet_protosw *p);
 void inet_unregister_protosw(struct inet_protosw *p);
 
-int  udp_add_offload(struct net *net, struct udp_offload *prot);
-void udp_del_offload(struct udp_offload *prot);
-
 #if IS_ENABLED(CONFIG_IPV6)
 int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char num);
 int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char num);
diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
index 65c3fd3..6230cf4 100644
--- a/net/ipv4/udp_offload.c
+++ b/net/ipv4/udp_offload.c
@@ -14,18 +14,6 @@
 #include <net/udp.h>
 #include <net/protocol.h>
 
-static DEFINE_SPINLOCK(udp_offload_lock);
-static struct udp_offload_priv __rcu *udp_offload_base __read_mostly;
-
-#define udp_deref_protected(X) rcu_dereference_protected(X, lockdep_is_held(&udp_offload_lock))
-
-struct udp_offload_priv {
-	struct udp_offload	*offload;
-	possible_net_t	net;
-	struct rcu_head		rcu;
-	struct udp_offload_priv __rcu *next;
-};
-
 static struct sk_buff *__skb_udp_tunnel_segment(struct sk_buff *skb,
 	netdev_features_t features,
 	struct sk_buff *(*gso_inner_segment)(struct sk_buff *skb,
@@ -254,56 +242,6 @@ out:
 	return segs;
 }
 
-int udp_add_offload(struct net *net, struct udp_offload *uo)
-{
-	struct udp_offload_priv *new_offload = kzalloc(sizeof(*new_offload), GFP_ATOMIC);
-
-	if (!new_offload)
-		return -ENOMEM;
-
-	write_pnet(&new_offload->net, net);
-	new_offload->offload = uo;
-
-	spin_lock(&udp_offload_lock);
-	new_offload->next = udp_offload_base;
-	rcu_assign_pointer(udp_offload_base, new_offload);
-	spin_unlock(&udp_offload_lock);
-
-	return 0;
-}
-EXPORT_SYMBOL(udp_add_offload);
-
-static void udp_offload_free_routine(struct rcu_head *head)
-{
-	struct udp_offload_priv *ou_priv = container_of(head, struct udp_offload_priv, rcu);
-	kfree(ou_priv);
-}
-
-void udp_del_offload(struct udp_offload *uo)
-{
-	struct udp_offload_priv __rcu **head = &udp_offload_base;
-	struct udp_offload_priv *uo_priv;
-
-	spin_lock(&udp_offload_lock);
-
-	uo_priv = udp_deref_protected(*head);
-	for (; uo_priv != NULL;
-	     uo_priv = udp_deref_protected(*head)) {
-		if (uo_priv->offload == uo) {
-			rcu_assign_pointer(*head,
-					   udp_deref_protected(uo_priv->next));
-			goto unlock;
-		}
-		head = &uo_priv->next;
-	}
-	pr_warn("udp_del_offload: didn't find offload for port %d\n", ntohs(uo->port));
-unlock:
-	spin_unlock(&udp_offload_lock);
-	if (uo_priv)
-		call_rcu(&uo_priv->rcu, udp_offload_free_routine);
-}
-EXPORT_SYMBOL(udp_del_offload);
-
 struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
 				 struct udphdr *uh, udp_lookup_t lookup)
 {
@@ -327,7 +265,6 @@ struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
 
 	if (sk && udp_sk(sk)->gro_receive)
 		goto unflush;
-
 	goto out_unlock;
 
 unflush:
-- 
2.8.0.rc2

^ permalink raw reply related

* [PATCH net-next 1/3] net: dsa: make the STP state function return void
From: Vivien Didelot @ 2016-04-05 15:24 UTC (permalink / raw)
  To: netdev
  Cc: linux-kernel, kernel, David S. Miller, Andrew Lunn,
	Florian Fainelli, Jiri Pirko, Scott Feldman, Vivien Didelot

The DSA layer doesn't care about the return code of the port_stp_update
routine, so make it void in the layer and the DSA drivers.

Replace the useless dsa_slave_stp_update function with a
dsa_slave_stp_state function used to reply to the switchdev
SWITCHDEV_ATTR_ID_PORT_STP_STATE attribute.

In the meantime, rename port_stp_update to port_stp_state to explicit
the state change.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
---
 Documentation/networking/dsa/dsa.txt |  2 +-
 drivers/net/dsa/bcm_sf2.c            | 16 +++++-----------
 drivers/net/dsa/mv88e6171.c          |  2 +-
 drivers/net/dsa/mv88e6352.c          |  2 +-
 drivers/net/dsa/mv88e6xxx.c          |  6 ++----
 drivers/net/dsa/mv88e6xxx.h          |  2 +-
 include/net/dsa.h                    |  3 +--
 net/dsa/slave.c                      | 32 +++++++++++++++-----------------
 8 files changed, 27 insertions(+), 38 deletions(-)

diff --git a/Documentation/networking/dsa/dsa.txt b/Documentation/networking/dsa/dsa.txt
index 8ba3369..4afa719 100644
--- a/Documentation/networking/dsa/dsa.txt
+++ b/Documentation/networking/dsa/dsa.txt
@@ -533,7 +533,7 @@ Bridge layer
   out at the switch hardware for the switch to (re) learn MAC addresses behind
   this port.
 
-- port_stp_update: bridge layer function invoked when a given switch port STP
+- port_stp_state: bridge layer function invoked when a given switch port STP
   state is computed by the bridge layer and should be propagated to switch
   hardware to forward/block/learn traffic. The switch driver is responsible for
   computing a STP state change based on current and asked parameters and perform
diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
index 95944d5..b847624 100644
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
@@ -545,12 +545,11 @@ static void bcm_sf2_sw_br_leave(struct dsa_switch *ds, int port)
 	priv->port_sts[port].bridge_dev = NULL;
 }
 
-static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
-				       u8 state)
+static void bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
+					u8 state)
 {
 	struct bcm_sf2_priv *priv = ds_to_priv(ds);
 	u8 hw_state, cur_hw_state;
-	int ret = 0;
 	u32 reg;
 
 	reg = core_readl(priv, CORE_G_PCTL_PORT(port));
@@ -574,7 +573,7 @@ static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
 		break;
 	default:
 		pr_err("%s: invalid STP state: %d\n", __func__, state);
-		return -EINVAL;
+		return;
 	}
 
 	/* Fast-age ARL entries if we are moving a port from Learning or
@@ -584,11 +583,8 @@ static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
 	if (cur_hw_state != hw_state) {
 		if (cur_hw_state >= G_MISTP_LEARN_STATE &&
 		    hw_state <= G_MISTP_LISTEN_STATE) {
-			ret = bcm_sf2_sw_fast_age_port(ds, port);
-			if (ret) {
+			if (bcm_sf2_sw_fast_age_port(ds, port))
 				pr_err("%s: fast-ageing failed\n", __func__);
-				return ret;
-			}
 		}
 	}
 
@@ -596,8 +592,6 @@ static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
 	reg &= ~(G_MISTP_STATE_MASK << G_MISTP_STATE_SHIFT);
 	reg |= hw_state;
 	core_writel(priv, reg, CORE_G_PCTL_PORT(port));
-
-	return 0;
 }
 
 /* Address Resolution Logic routines */
@@ -1387,7 +1381,7 @@ static struct dsa_switch_driver bcm_sf2_switch_driver = {
 	.set_eee		= bcm_sf2_sw_set_eee,
 	.port_bridge_join	= bcm_sf2_sw_br_join,
 	.port_bridge_leave	= bcm_sf2_sw_br_leave,
-	.port_stp_update	= bcm_sf2_sw_br_set_stp_state,
+	.port_stp_state		= bcm_sf2_sw_br_set_stp_state,
 	.port_fdb_prepare	= bcm_sf2_sw_fdb_prepare,
 	.port_fdb_add		= bcm_sf2_sw_fdb_add,
 	.port_fdb_del		= bcm_sf2_sw_fdb_del,
diff --git a/drivers/net/dsa/mv88e6171.c b/drivers/net/dsa/mv88e6171.c
index c0164b9..2f142cb 100644
--- a/drivers/net/dsa/mv88e6171.c
+++ b/drivers/net/dsa/mv88e6171.c
@@ -105,7 +105,7 @@ struct dsa_switch_driver mv88e6171_switch_driver = {
 	.get_regs		= mv88e6xxx_get_regs,
 	.port_bridge_join	= mv88e6xxx_port_bridge_join,
 	.port_bridge_leave	= mv88e6xxx_port_bridge_leave,
-	.port_stp_update        = mv88e6xxx_port_stp_update,
+	.port_stp_state		= mv88e6xxx_port_stp_state,
 	.port_vlan_filtering	= mv88e6xxx_port_vlan_filtering,
 	.port_vlan_prepare	= mv88e6xxx_port_vlan_prepare,
 	.port_vlan_add		= mv88e6xxx_port_vlan_add,
diff --git a/drivers/net/dsa/mv88e6352.c b/drivers/net/dsa/mv88e6352.c
index 5f528ab..756593a 100644
--- a/drivers/net/dsa/mv88e6352.c
+++ b/drivers/net/dsa/mv88e6352.c
@@ -326,7 +326,7 @@ struct dsa_switch_driver mv88e6352_switch_driver = {
 	.get_regs		= mv88e6xxx_get_regs,
 	.port_bridge_join	= mv88e6xxx_port_bridge_join,
 	.port_bridge_leave	= mv88e6xxx_port_bridge_leave,
-	.port_stp_update	= mv88e6xxx_port_stp_update,
+	.port_stp_state		= mv88e6xxx_port_stp_state,
 	.port_vlan_filtering	= mv88e6xxx_port_vlan_filtering,
 	.port_vlan_prepare	= mv88e6xxx_port_vlan_prepare,
 	.port_vlan_add		= mv88e6xxx_port_vlan_add,
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index 0dda281..5a2e46d 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -1193,7 +1193,7 @@ static int _mv88e6xxx_port_based_vlan_map(struct dsa_switch *ds, int port)
 	return _mv88e6xxx_reg_write(ds, REG_PORT(port), PORT_BASE_VLAN, reg);
 }
 
-int mv88e6xxx_port_stp_update(struct dsa_switch *ds, int port, u8 state)
+void mv88e6xxx_port_stp_state(struct dsa_switch *ds, int port, u8 state)
 {
 	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
 	int stp_state;
@@ -1215,14 +1215,12 @@ int mv88e6xxx_port_stp_update(struct dsa_switch *ds, int port, u8 state)
 		break;
 	}
 
-	/* mv88e6xxx_port_stp_update may be called with softirqs disabled,
+	/* mv88e6xxx_port_stp_state may be called with softirqs disabled,
 	 * so we can not update the port state directly but need to schedule it.
 	 */
 	ps->ports[port].state = stp_state;
 	set_bit(port, ps->port_state_update_mask);
 	schedule_work(&ps->bridge_work);
-
-	return 0;
 }
 
 static int _mv88e6xxx_port_pvid(struct dsa_switch *ds, int port, u16 *new,
diff --git a/drivers/net/dsa/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx.h
index 26a424a..8a62afb 100644
--- a/drivers/net/dsa/mv88e6xxx.h
+++ b/drivers/net/dsa/mv88e6xxx.h
@@ -497,7 +497,7 @@ int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
 int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
 			       struct net_device *bridge);
 void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port);
-int mv88e6xxx_port_stp_update(struct dsa_switch *ds, int port, u8 state);
+void mv88e6xxx_port_stp_state(struct dsa_switch *ds, int port, u8 state);
 int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
 				  bool vlan_filtering);
 int mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
diff --git a/include/net/dsa.h b/include/net/dsa.h
index 6463bb2..eddd0f3 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -299,8 +299,7 @@ struct dsa_switch_driver {
 	int	(*port_bridge_join)(struct dsa_switch *ds, int port,
 				    struct net_device *bridge);
 	void	(*port_bridge_leave)(struct dsa_switch *ds, int port);
-	int	(*port_stp_update)(struct dsa_switch *ds, int port,
-				   u8 state);
+	void	(*port_stp_state)(struct dsa_switch *ds, int port, u8 state);
 
 	/*
 	 * VLAN support
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index a575f03..1c55f96 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -104,8 +104,8 @@ static int dsa_slave_open(struct net_device *dev)
 			goto clear_promisc;
 	}
 
-	if (ds->drv->port_stp_update)
-		ds->drv->port_stp_update(ds, p->port, stp_state);
+	if (ds->drv->port_stp_state)
+		ds->drv->port_stp_state(ds, p->port, stp_state);
 
 	if (p->phy)
 		phy_start(p->phy);
@@ -147,8 +147,8 @@ static int dsa_slave_close(struct net_device *dev)
 	if (ds->drv->port_disable)
 		ds->drv->port_disable(ds, p->port, p->phy);
 
-	if (ds->drv->port_stp_update)
-		ds->drv->port_stp_update(ds, p->port, BR_STATE_DISABLED);
+	if (ds->drv->port_stp_state)
+		ds->drv->port_stp_state(ds, p->port, BR_STATE_DISABLED);
 
 	return 0;
 }
@@ -305,16 +305,19 @@ static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 	return -EOPNOTSUPP;
 }
 
-static int dsa_slave_stp_update(struct net_device *dev, u8 state)
+static int dsa_slave_stp_state(struct net_device *dev,
+			       const struct switchdev_attr *attr,
+			       struct switchdev_trans *trans)
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
 	struct dsa_switch *ds = p->parent;
-	int ret = -EOPNOTSUPP;
 
-	if (ds->drv->port_stp_update)
-		ret = ds->drv->port_stp_update(ds, p->port, state);
+	if (switchdev_trans_ph_prepare(trans))
+		return ds->drv->port_stp_state ? 0 : -EOPNOTSUPP;
+
+	ds->drv->port_stp_state(ds, p->port, attr->u.stp_state);
 
-	return ret;
+	return 0;
 }
 
 static int dsa_slave_vlan_filtering(struct net_device *dev,
@@ -339,17 +342,11 @@ static int dsa_slave_port_attr_set(struct net_device *dev,
 				   const struct switchdev_attr *attr,
 				   struct switchdev_trans *trans)
 {
-	struct dsa_slave_priv *p = netdev_priv(dev);
-	struct dsa_switch *ds = p->parent;
 	int ret;
 
 	switch (attr->id) {
 	case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
-		if (switchdev_trans_ph_prepare(trans))
-			ret = ds->drv->port_stp_update ? 0 : -EOPNOTSUPP;
-		else
-			ret = ds->drv->port_stp_update(ds, p->port,
-						       attr->u.stp_state);
+		ret = dsa_slave_stp_state(dev, attr, trans);
 		break;
 	case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
 		ret = dsa_slave_vlan_filtering(dev, attr, trans);
@@ -468,7 +465,8 @@ static void dsa_slave_bridge_port_leave(struct net_device *dev)
 	/* Port left the bridge, put in BR_STATE_DISABLED by the bridge layer,
 	 * so allow it to be in BR_STATE_FORWARDING to be kept functional
 	 */
-	dsa_slave_stp_update(dev, BR_STATE_FORWARDING);
+	if (ds->drv->port_stp_state)
+		ds->drv->port_stp_state(ds, p->port, BR_STATE_FORWARDING);
 }
 
 static int dsa_slave_port_attr_get(struct net_device *dev,
-- 
2.8.0

^ permalink raw reply related

* [PATCH net-next 3/3] net: dsa: make the VLAN add function return void
From: Vivien Didelot @ 2016-04-05 15:24 UTC (permalink / raw)
  To: netdev
  Cc: linux-kernel, kernel, David S. Miller, Andrew Lunn,
	Florian Fainelli, Jiri Pirko, Scott Feldman, Vivien Didelot
In-Reply-To: <1459869875-23815-1-git-send-email-vivien.didelot@savoirfairelinux.com>

The switchdev design implies that a software error should not happen in
the commit phase since it must have been previously reported in the
prepare phase. If an hardware error occurs during the commit phase,
there is nothing switchdev can do about it.

The DSA layer separates port_vlan_prepare and port_vlan_add for
simplicity and convenience. If an hardware error occurs during the
commit phase, there is no need to report it outside the driver itself.

Make the DSA port_vlan_add routine return void for explicitness.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
---
 drivers/net/dsa/mv88e6xxx.c | 26 +++++++++++---------------
 drivers/net/dsa/mv88e6xxx.h |  6 +++---
 include/net/dsa.h           |  2 +-
 net/dsa/slave.c             | 11 +++--------
 4 files changed, 18 insertions(+), 27 deletions(-)

diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index bca9a2c..2911f91 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -1908,31 +1908,27 @@ static int _mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port, u16 vid,
 	return _mv88e6xxx_vtu_loadpurge(ds, &vlan);
 }
 
-int mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
-			    const struct switchdev_obj_port_vlan *vlan,
-			    struct switchdev_trans *trans)
+void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
+			     const struct switchdev_obj_port_vlan *vlan,
+			     struct switchdev_trans *trans)
 {
 	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
 	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
 	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
 	u16 vid;
-	int err = 0;
 
 	mutex_lock(&ps->smi_mutex);
 
-	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
-		err = _mv88e6xxx_port_vlan_add(ds, port, vid, untagged);
-		if (err)
-			goto unlock;
-	}
+	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid)
+		if (_mv88e6xxx_port_vlan_add(ds, port, vid, untagged))
+			netdev_warn(ds->ports[port], "cannot add VLAN %d%c\n",
+				    vid, untagged ? 'u' : 't');
 
-	/* no PVID with ranges, otherwise it's a bug */
-	if (pvid)
-		err = _mv88e6xxx_port_pvid_set(ds, port, vlan->vid_end);
-unlock:
-	mutex_unlock(&ps->smi_mutex);
+	if (pvid && _mv88e6xxx_port_pvid_set(ds, port, vlan->vid_end))
+		netdev_warn(ds->ports[port], "cannot set PVID %d\n",
+			    vlan->vid_end);
 
-	return err;
+	mutex_unlock(&ps->smi_mutex);
 }
 
 static int _mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port, u16 vid)
diff --git a/drivers/net/dsa/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx.h
index ece008f..ad59022 100644
--- a/drivers/net/dsa/mv88e6xxx.h
+++ b/drivers/net/dsa/mv88e6xxx.h
@@ -503,9 +503,9 @@ int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
 int mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
 				const struct switchdev_obj_port_vlan *vlan,
 				struct switchdev_trans *trans);
-int mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
-			    const struct switchdev_obj_port_vlan *vlan,
-			    struct switchdev_trans *trans);
+void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
+			     const struct switchdev_obj_port_vlan *vlan,
+			     struct switchdev_trans *trans);
 int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
 			    const struct switchdev_obj_port_vlan *vlan);
 int mv88e6xxx_port_vlan_dump(struct dsa_switch *ds, int port,
diff --git a/include/net/dsa.h b/include/net/dsa.h
index fa42b8c..071b50d 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -309,7 +309,7 @@ struct dsa_switch_driver {
 	int	(*port_vlan_prepare)(struct dsa_switch *ds, int port,
 				     const struct switchdev_obj_port_vlan *vlan,
 				     struct switchdev_trans *trans);
-	int	(*port_vlan_add)(struct dsa_switch *ds, int port,
+	void	(*port_vlan_add)(struct dsa_switch *ds, int port,
 				 const struct switchdev_obj_port_vlan *vlan,
 				 struct switchdev_trans *trans);
 	int	(*port_vlan_del)(struct dsa_switch *ds, int port,
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 5a34bab..134b76e 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -207,21 +207,16 @@ static int dsa_slave_port_vlan_add(struct net_device *dev,
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
 	struct dsa_switch *ds = p->parent;
-	int err;
 
 	if (switchdev_trans_ph_prepare(trans)) {
 		if (!ds->drv->port_vlan_prepare || !ds->drv->port_vlan_add)
 			return -EOPNOTSUPP;
 
-		err = ds->drv->port_vlan_prepare(ds, p->port, vlan, trans);
-		if (err)
-			return err;
-	} else {
-		err = ds->drv->port_vlan_add(ds, p->port, vlan, trans);
-		if (err)
-			return err;
+		return ds->drv->port_vlan_prepare(ds, p->port, vlan, trans);
 	}
 
+	ds->drv->port_vlan_add(ds, p->port, vlan, trans);
+
 	return 0;
 }
 
-- 
2.8.0

^ permalink raw reply related

* [PATCH net-next 2/3] net: dsa: make the FDB add function return void
From: Vivien Didelot @ 2016-04-05 15:24 UTC (permalink / raw)
  To: netdev
  Cc: linux-kernel, kernel, David S. Miller, Andrew Lunn,
	Florian Fainelli, Jiri Pirko, Scott Feldman, Vivien Didelot
In-Reply-To: <1459869875-23815-1-git-send-email-vivien.didelot@savoirfairelinux.com>

The switchdev design implies that a software error should not happen in
the commit phase since it must have been previously reported in the
prepare phase. If an hardware error occurs during the commit phase,
there is nothing switchdev can do about it.

The DSA layer separates port_fdb_prepare and port_fdb_add for simplicity
and convenience. If an hardware error occurs during the commit phase,
there is no need to report it outside the DSA driver itself.

Make the DSA port_fdb_add routine return void for explicitness.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
---
 drivers/net/dsa/bcm_sf2.c   |  9 +++++----
 drivers/net/dsa/mv88e6xxx.c | 12 +++++-------
 drivers/net/dsa/mv88e6xxx.h |  6 +++---
 include/net/dsa.h           |  2 +-
 net/dsa/slave.c             | 16 ++++++++--------
 5 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
index b847624..feebeaa 100644
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
@@ -722,13 +722,14 @@ static int bcm_sf2_sw_fdb_prepare(struct dsa_switch *ds, int port,
 	return 0;
 }
 
-static int bcm_sf2_sw_fdb_add(struct dsa_switch *ds, int port,
-			      const struct switchdev_obj_port_fdb *fdb,
-			      struct switchdev_trans *trans)
+static void bcm_sf2_sw_fdb_add(struct dsa_switch *ds, int port,
+			       const struct switchdev_obj_port_fdb *fdb,
+			       struct switchdev_trans *trans)
 {
 	struct bcm_sf2_priv *priv = ds_to_priv(ds);
 
-	return bcm_sf2_arl_op(priv, 0, port, fdb->addr, fdb->vid, true);
+	if (bcm_sf2_arl_op(priv, 0, port, fdb->addr, fdb->vid, true))
+		pr_err("%s: failed to add address\n", __func__);
 }
 
 static int bcm_sf2_sw_fdb_del(struct dsa_switch *ds, int port,
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index 5a2e46d..bca9a2c 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -2090,21 +2090,19 @@ int mv88e6xxx_port_fdb_prepare(struct dsa_switch *ds, int port,
 	return 0;
 }
 
-int mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
-			   const struct switchdev_obj_port_fdb *fdb,
-			   struct switchdev_trans *trans)
+void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
+			    const struct switchdev_obj_port_fdb *fdb,
+			    struct switchdev_trans *trans)
 {
 	int state = is_multicast_ether_addr(fdb->addr) ?
 		GLOBAL_ATU_DATA_STATE_MC_STATIC :
 		GLOBAL_ATU_DATA_STATE_UC_STATIC;
 	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
-	int ret;
 
 	mutex_lock(&ps->smi_mutex);
-	ret = _mv88e6xxx_port_fdb_load(ds, port, fdb->addr, fdb->vid, state);
+	if (_mv88e6xxx_port_fdb_load(ds, port, fdb->addr, fdb->vid, state))
+		netdev_warn(ds->ports[port], "cannot load address\n");
 	mutex_unlock(&ps->smi_mutex);
-
-	return ret;
 }
 
 int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
diff --git a/drivers/net/dsa/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx.h
index 8a62afb..ece008f 100644
--- a/drivers/net/dsa/mv88e6xxx.h
+++ b/drivers/net/dsa/mv88e6xxx.h
@@ -514,9 +514,9 @@ int mv88e6xxx_port_vlan_dump(struct dsa_switch *ds, int port,
 int mv88e6xxx_port_fdb_prepare(struct dsa_switch *ds, int port,
 			       const struct switchdev_obj_port_fdb *fdb,
 			       struct switchdev_trans *trans);
-int mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
-			   const struct switchdev_obj_port_fdb *fdb,
-			   struct switchdev_trans *trans);
+void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
+			    const struct switchdev_obj_port_fdb *fdb,
+			    struct switchdev_trans *trans);
 int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
 			   const struct switchdev_obj_port_fdb *fdb);
 int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
diff --git a/include/net/dsa.h b/include/net/dsa.h
index eddd0f3..fa42b8c 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -324,7 +324,7 @@ struct dsa_switch_driver {
 	int	(*port_fdb_prepare)(struct dsa_switch *ds, int port,
 				    const struct switchdev_obj_port_fdb *fdb,
 				    struct switchdev_trans *trans);
-	int	(*port_fdb_add)(struct dsa_switch *ds, int port,
+	void	(*port_fdb_add)(struct dsa_switch *ds, int port,
 				const struct switchdev_obj_port_fdb *fdb,
 				struct switchdev_trans *trans);
 	int	(*port_fdb_del)(struct dsa_switch *ds, int port,
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 1c55f96..5a34bab 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -256,17 +256,17 @@ static int dsa_slave_port_fdb_add(struct net_device *dev,
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
 	struct dsa_switch *ds = p->parent;
-	int ret;
 
-	if (!ds->drv->port_fdb_prepare || !ds->drv->port_fdb_add)
-		return -EOPNOTSUPP;
+	if (switchdev_trans_ph_prepare(trans)) {
+		if (!ds->drv->port_fdb_prepare || !ds->drv->port_fdb_add)
+			return -EOPNOTSUPP;
 
-	if (switchdev_trans_ph_prepare(trans))
-		ret = ds->drv->port_fdb_prepare(ds, p->port, fdb, trans);
-	else
-		ret = ds->drv->port_fdb_add(ds, p->port, fdb, trans);
+		return ds->drv->port_fdb_prepare(ds, p->port, fdb, trans);
+	}
 
-	return ret;
+	ds->drv->port_fdb_add(ds, p->port, fdb, trans);
+
+	return 0;
 }
 
 static int dsa_slave_port_fdb_del(struct net_device *dev,
-- 
2.8.0

^ permalink raw reply related

* Re: [RFC PATCH 0/6] ppp: add rtnetlink support
From: Stephen Hemminger @ 2016-04-05 15:27 UTC (permalink / raw)
  To: Guillaume Nault; +Cc: netdev, linux-ppp, Paul Mackerras, David Miller
In-Reply-To: <cover.1459807527.git.g.nault@alphalink.fr>

On Tue, 5 Apr 2016 02:56:17 +0200
Guillaume Nault <g.nault@alphalink.fr> wrote:

> PPP devices lack the ability to be customised at creation time. In
> particular they can't be created in a given netns or with a particular
> name. Moving or renaming the device after creation is possible, but
> creates undesirable transient effects on servers where PPP devices are
> constantly created and removed, as users connect and disconnect.
> Implementing rtnetlink support solves this problem.

Good to see PPP behave like other tunnels.

> The rtnetlink handlers implemented in this series are minimal, and can
> only replace the PPPIOCNEWUNIT ioctl. The rest of PPP ioctls remains
> necessary for any other operation on channels and units.
> It is perfectly to possible to mix PPP devices created by rtnl
> and by ioctl(PPPIOCNEWUNIT). Devices will behave in the same way,
> except for a few specific cases (as detailed in patch #6).

What blocks PPP from being fully netlink (use attributes),
and work with same API set independent of how device was created.
Special cases are nuisance and source of bugs.

> I'm sending the series only as RFC this time, because there are a few
> points I'm unsatisfied with.
> 
> First, I'm not fond of passing file descriptors as netlink attributes,
> as done with IFLA_PPP_DEV_FD (which is filled with a /dev/ppp fd). But
> given how PPP units work, we have to associate a /dev/ppp fd somehow.
> 
> More importantly, the locking constraints of PPP are quite problematic.
> The rtnetlink handler has to associate the new PPP unit with the
> /dev/ppp file descriptor passed as parameter. This requires holding the
> ppp_mutex (see e8e56ffd9d29 "ppp: ensure file->private_data can't be
> overridden"), while the rtnetlink callback is already protected by
> rtnl_lock(). Since other parts of the module take these locks in
> reverse order, most of this series deals with preparing the code for
> inverting the dependency between rtnl_lock and ppp_mutex. Some more
> work is needed on that part (see patch #4 for details), but I wanted
> to be sure that approach it worth it before spending some more time on
> it.

One other way to handle the locking is to use trylock. Yes it justs
pushs the problem back to userspace, but that is how lock reordering was
handled in sysfs.

> Other approach
> 
> I've considered another approach where no /dev/ppp file descriptor
> is associated to the PPP unit at creation time. This removes all the
> problems described above. The PPP interface that is created behaves
> mostly like a dummy device until it gets associated with a /dev/ppp
> file descriptor (using the PPPIOCATTACH ioctl).
> The problem here is that, AFAIK, we can't return the unit identifier of
> the new PPP device to the user space program having issued the
> RTM_NEWLINK message. This identifier is required for the
> ioctl(PPPIOCATTACH) call. Of course we could return such information
> in an RTM_GETLINK message, but the user would need to query the device
> name that was created. This would only work for users that can set the
> IFLA_IFNAME attribute in their original RTM_NEWLINK message.
> 
> 
> Patch series
> 
> Patches 1 to 3 prepare the code for inverting lock ordering between
> ppp_mutex and rtnl_lock. Patch #4 does the lock inversion.
> The actual infrastructure is implemented in patches #5 and #6.

^ permalink raw reply

* Re: [RFC PATCH 5/6] ppp: define reusable device creation functions
From: Stephen Hemminger @ 2016-04-05 15:28 UTC (permalink / raw)
  To: Guillaume Nault; +Cc: netdev, linux-ppp, Paul Mackerras, David Miller
In-Reply-To: <522658eb90148cb670fb4f5db1429c41788aa4d8.1459807527.git.g.nault@alphalink.fr>

On Tue, 5 Apr 2016 02:56:29 +0200
Guillaume Nault <g.nault@alphalink.fr> wrote:

> Move PPP device initialisation and registration out of
> ppp_create_interface().
> This prepares code for device registration with rtnetlink.
> 
> Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
> ---
>  drivers/net/ppp/ppp_generic.c | 185 ++++++++++++++++++++++++------------------
>  1 file changed, 106 insertions(+), 79 deletions(-)
> 
> diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
> index 8aaedb8..516f8dc 100644
> --- a/drivers/net/ppp/ppp_generic.c
> +++ b/drivers/net/ppp/ppp_generic.c
> @@ -183,6 +183,11 @@ struct channel {
>  #endif /* CONFIG_PPP_MULTILINK */
>  };
>  
> +struct ppp_config {
> +	struct file *file;
> +	s32 unit;
> +};
> +
>  /*
>   * SMP locking issues:
>   * Both the ppp.rlock and ppp.wlock locks protect the ppp.channels
> @@ -984,6 +989,87 @@ static struct pernet_operations ppp_net_ops = {
>  	.size = sizeof(struct ppp_net),
>  };
>  
> +static int ppp_unit_register(struct ppp *ppp, int unit)
> +{
> +	struct ppp_net *pn = ppp_pernet(ppp->ppp_net);
> +	int ret;
> +
> +	mutex_lock(&pn->all_ppp_mutex);
> +
> +	if (unit < 0) {
> +		ret = unit_get(&pn->units_idr, ppp);
> +		if (ret < 0)
> +			goto err;
> +	} else {
> +		/* Caller asked for a specific unit number. Fail with -EEXIST
> +		 * if unavailable. For backward compatibility, return -EEXIST
> +		 * too if idr allocation fails; this makes pppd retry without
> +		 * requesting a specific unit number.
> +		 */
> +		if (unit_find(&pn->units_idr, unit)) {
> +			ret = -EEXIST;
> +			goto err;
> +		}
> +		ret = unit_set(&pn->units_idr, ppp, unit);
> +		if (ret < 0) {
> +			/* Rewrite error for backward compatibility */
> +			ret = -EEXIST;
> +			goto err;
> +		}
> +	}
> +	ppp->file.index = ret;
> +
> +	snprintf(ppp->dev->name, IFNAMSIZ, "ppp%i", ppp->file.index);
> +
> +	ret = register_netdevice(ppp->dev);
> +	if (ret < 0)
> +		goto err_unit;
> +
> +	atomic_inc(&ppp_unit_count);
> +
> +	mutex_unlock(&pn->all_ppp_mutex);
> +
> +	return 0;
> +
> +err_unit:
> +	unit_put(&pn->units_idr, ppp->file.index);
> +err:
> +	mutex_unlock(&pn->all_ppp_mutex);
> +
> +	return ret;
> +}
> +
> +static int ppp_dev_configure(struct net *src_net, struct net_device *dev,
> +			     const struct ppp_config *conf)
> +{
> +	struct ppp *ppp = netdev_priv(dev);
> +	int indx;
> +
> +	ppp->dev = dev;
> +	ppp->mru = PPP_MRU;
> +	ppp->ppp_net = src_net;
> +	ppp->owner = conf->file;
> +
> +	init_ppp_file(&ppp->file, INTERFACE);
> +	ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */
> +
> +	for (indx = 0; indx < NUM_NP; ++indx)
> +		ppp->npmode[indx] = NPMODE_PASS;
> +	INIT_LIST_HEAD(&ppp->channels);
> +	spin_lock_init(&ppp->rlock);
> +	spin_lock_init(&ppp->wlock);
> +#ifdef CONFIG_PPP_MULTILINK
> +	ppp->minseq = -1;
> +	skb_queue_head_init(&ppp->mrq);
> +#endif /* CONFIG_PPP_MULTILINK */
> +#ifdef CONFIG_PPP_FILTER
> +	ppp->pass_filter = NULL;
> +	ppp->active_filter = NULL;
> +#endif /* CONFIG_PPP_FILTER */
> +
> +	return ppp_unit_register(ppp, conf->unit);
> +}
> +
>  #define PPP_MAJOR	108
>  
>  /* Called at boot time if ppp is compiled into the kernel,
> @@ -2758,107 +2844,48 @@ ppp_get_stats(struct ppp *ppp, struct ppp_stats *st)
>   */
>  static int ppp_create_interface(struct net *net, struct file *file, int *unit)
>  {
> +	struct ppp_config conf = {
> +		.file = file,
> +		.unit = *unit,
> +	};
> +	struct net_device *dev;
>  	struct ppp *ppp;
> -	struct ppp_net *pn;
> -	struct net_device *dev = NULL;
> -	int ret = -ENOMEM;
> -	int i;
> +	int err;
>  
>  	dev = alloc_netdev(sizeof(struct ppp), "", NET_NAME_ENUM, ppp_setup);
> -	if (!dev)
> -		goto out1;
> -
> -	pn = ppp_pernet(net);
> -
> -	ppp = netdev_priv(dev);
> -	ppp->dev = dev;
> -	ppp->mru = PPP_MRU;
> -	init_ppp_file(&ppp->file, INTERFACE);
> -	ppp->file.hdrlen = PPP_HDRLEN - 2;	/* don't count proto bytes */
> -	ppp->owner = file;
> -	for (i = 0; i < NUM_NP; ++i)
> -		ppp->npmode[i] = NPMODE_PASS;
> -	INIT_LIST_HEAD(&ppp->channels);
> -	spin_lock_init(&ppp->rlock);
> -	spin_lock_init(&ppp->wlock);
> -#ifdef CONFIG_PPP_MULTILINK
> -	ppp->minseq = -1;
> -	skb_queue_head_init(&ppp->mrq);
> -#endif /* CONFIG_PPP_MULTILINK */
> -#ifdef CONFIG_PPP_FILTER
> -	ppp->pass_filter = NULL;
> -	ppp->active_filter = NULL;
> -#endif /* CONFIG_PPP_FILTER */
> +	if (!dev) {
> +		err = -ENOMEM;
> +		goto err;
> +	}
>  
> -	/*
> -	 * drum roll: don't forget to set
> -	 * the net device is belong to
> -	 */
>  	dev_net_set(dev, net);
>  
>  	rtnl_lock();
>  	mutex_lock(&ppp_mutex);
> -	mutex_lock(&pn->all_ppp_mutex);
> -
>  	if (file->private_data) {
> -		ret = -ENOTTY;
> -		goto out2;
> -	}
> -
> -	if (*unit < 0) {
> -		ret = unit_get(&pn->units_idr, ppp);
> -		if (ret < 0)
> -			goto out2;
> -	} else {
> -		ret = -EEXIST;
> -		if (unit_find(&pn->units_idr, *unit))
> -			goto out2; /* unit already exists */
> -		/*
> -		 * if caller need a specified unit number
> -		 * lets try to satisfy him, otherwise --
> -		 * he should better ask us for new unit number
> -		 *
> -		 * NOTE: yes I know that returning EEXIST it's not
> -		 * fair but at least pppd will ask us to allocate
> -		 * new unit in this case so user is happy :)
> -		 */
> -		ret = unit_set(&pn->units_idr, ppp, *unit);
> -		if (ret < 0) {
> -			ret = -EEXIST;
> -			goto out2;
> -		}
> +		err = -ENOTTY;
> +		goto err_dev;
>  	}
>  
> -	/* Initialize the new ppp unit */
> -	ppp->file.index = ret;
> -	sprintf(dev->name, "ppp%d", ret);
> +	err = ppp_dev_configure(net, dev, &conf);
> +	if (err < 0)
> +		goto err_dev;
>  
> -	ret = register_netdevice(dev);
> -	if (ret != 0) {
> -		unit_put(&pn->units_idr, ppp->file.index);
> -		netdev_err(ppp->dev, "PPP: couldn't register device %s (%d)\n",
> -			   dev->name, ret);
> -		goto out2;
> -	}
> -
> -	ppp->ppp_net = net;
> -	file->private_data = &ppp->file;
> +	ppp = netdev_priv(dev);
>  	*unit = ppp->file.index;
> -	atomic_inc(&ppp_unit_count);
> +	file->private_data = &ppp->file;
>  
> -	mutex_unlock(&pn->all_ppp_mutex);
>  	mutex_unlock(&ppp_mutex);
>  	rtnl_unlock();
>  
>  	return 0;
>  
> -out2:
> -	mutex_unlock(&pn->all_ppp_mutex);
> +err_dev:
>  	mutex_unlock(&ppp_mutex);
>  	rtnl_unlock();
>  	free_netdev(dev);
> -out1:
> -	return ret;
> +err:
> +	return err;
>  }
>  
>  /*

Does PPP module autoload correctly based on the netlink attributes?

^ permalink raw reply

* Re: [RESEND PATCH V4 2/3] IB/hns: Add HiSilicon RoCE driver support
From: Leon Romanovsky @ 2016-04-05 15:32 UTC (permalink / raw)
  To: oulijun
  Cc: dledford, sean.hefty, hal.rosenstock, davem, jeffrey.t.kirsher,
	jiri, ogerlitz, linux-rdma, linux-kernel, netdev, gongyangming,
	xiaokun, tangchaofei, haifeng.wei, yisen.zhuang, yankejian,
	lisheng011, charles.chenxin, linuxarm
In-Reply-To: <57036A25.9000106@huawei.com>

On Tue, Apr 05, 2016 at 03:32:53PM +0800, oulijun wrote:
> >>  .../infiniband/hw/hisilicon/hns/hns_roce_v1_hw.c   | 2832 ++++++++++++++++++++
> >>  .../infiniband/hw/hisilicon/hns/hns_roce_v1_hw.h   |  985 +++++++
> >                                           ^^^^^^
> > Do you support v1 of RoCE or v1 of your HW?
> > 
> Here, v1 stands for hw, that is, we support v1 of our hw.

So you should write hns_roce_hw_v1 and not hns_roce_v1_hw

> >>  23 files changed, 10429 insertions(+)
> > 
> > Please appreciate the effort needed to review such large patch and
> > invest time and effort to divide this to number of small easy review patches.
> > 
>     Surely, i have pay attention to the patch, but i consider that it is not better to
> split the patch into small patch. because it will the base function of RoCE.
>     For your advice, i will make further efforts to taking a discussion how to reslove the question.

Faisal Latif's submission [1] can help you to get inspiration.

Also please DON'T submit your patches till you get rid of unrelated
functions/macros/defines and DMA operations for register access.

[1] https://lwn.net/Articles/668721/

> 
> thanks
> Lijun Ou
> > .
> > 
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" 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: [net PATCH v2 2/2] ipv4/GRO: Make GRO conform to RFC 6864
From: Tom Herbert @ 2016-04-05 15:36 UTC (permalink / raw)
  To: Edward Cree
  Cc: Herbert Xu, Alexander Duyck, Alexander Duyck, Jesse Gross,
	Eric Dumazet, Netdev, David Miller
In-Reply-To: <5703D4C5.9060305@solarflare.com>

On Tue, Apr 5, 2016 at 12:07 PM, Edward Cree <ecree@solarflare.com> wrote:
> On 05/04/16 05:32, Herbert Xu wrote:
>> On Mon, Apr 04, 2016 at 09:26:55PM -0700, Alexander Duyck wrote:
>>> The question I would have is what are you really losing with increment
>>> from 0 versus fixed 0?  From what I see it is essentially just garbage
>>> in/garbage out.
>> GRO is meant to be lossless, that is, you should not be able to
>> detect its presence from the outside.  If you lose information then
>> you're breaking this rule and people will soon start asking for it
>> to be disabled in various situations.
>>
>> I'm not against doing this per se but it should not be part of the
>> default configuration.
> I'm certainly in favour of this being configurable - indeed IMHO it should
> also be possible to configure GRO with the 'looser' semantics of LRO, so
> that people who want that can get it without all the horrible "don't confuse
> Slow Start" hacks, and so that LRO can go away (AIUI the only reasons it
> exists are (a) improved performance from the 'loose' semantics and (b) old
> kernels without GRO.  We may not be able to kill (b) but we can certainly
> address (a)).
>
> But I don't agree that the default has to be totally lossless; anyone who is
> caring about the ID fields in atomic datagrams is breaking the RFCs, and can
> be assumed to Know What They're Doing sufficiently to configure this.
>
> On the gripping hand, I feel like GRO+TSO is the wrong model for speeding up
> forwarding/routing workloads.  Instead we should be looking into having lists
> of SKBs traverse the stack together, splitting the list whenever e.g. the
> destination changes.  That seems like it ought to be much more efficient than
> rewriting headers twice, once to coalesce a superframe and once to segment it
> again - and it also means this worry about GRO being lossless can go away.
> But until someone tries implementing skb batches, we won't know for sure if
> it works (and I don't have time right now ;)
>
Ed,

I thought about that some. It seems like we would want to do both GRO
and retain all the individual packets in the skb so that we could use
those for forwarding instead of GSO as I think you're saying. This
would would work great in the plain forwarding case, but one problem
is what to do if the host modifies the super packet (for instance when
forwarding over a tunnel we might add encapsulation header). This
should work in GSO (although we need to address the limitations around
1 encap level), not sure this is easy if we need to add a header to
each packet in a batch.

Tom



> -Ed

^ permalink raw reply

* Re: [PATCH v4 net-next 01/15] nfp: correct RX buffer length calculation
From: David Miller @ 2016-04-05 15:39 UTC (permalink / raw)
  To: jakub.kicinski; +Cc: netdev
In-Reply-To: <1459544811-24879-2-git-send-email-jakub.kicinski@netronome.com>

From: Jakub Kicinski <jakub.kicinski@netronome.com>
Date: Fri,  1 Apr 2016 22:06:37 +0100

> When calculating the RX buffer length we need to account for
> up to 2 VLAN tags and up to 8 MPLS labels.  Rounding up to 1k
> is an relic of a distant past and can be removed.  While at
> it also remove trivial print statement.
> 
> Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>

I disagree with the MPLS aspect of this change.

VLAN is special, in that when the hardware supports VLAN properly, the
VLAN header doesn't eat into the MTU and is sort of "transparent".

But MPLS doesn't work that way.

MPLS is in the main frame and takes up MTU space.

Therefore I see no reason to increase the buffer length by 8 * MPLS
which is just a rediculous amount of wasted space.

I'm not applying this without at least some more explanations about
why exactly you need to account for these values in the commit message.

^ permalink raw reply

* Re: ADMtek ADM8511 "Pegasus II" USB Ethernet causes oops
From: Petko Manolov @ 2016-04-05 15:42 UTC (permalink / raw)
  To: Lincoln Ramsay, petkan; +Cc: linux-usb, netdev
In-Reply-To: <57039405.7050501@gmail.com>

Hi,

I've no idea how this PEGASUS_MTU + 8 got in.  Maybe somebody played games with the skb alignment over the years.

I'm traveling right now so i'll look at the patch more closely when I get back.  At first glance it does look OK.


cheers,
Petko



On April 5, 2016 1:31:33 PM GMT+03:00, Lincoln Ramsay <a1291762@gmail.com> wrote:
>Hello,
>
>I have this (rather old) USB ethernet device but I cannot use it
>because 
>it crashes my machine.
>
>Simply plugging in the adapter and causing some traffic (pinging the 
>gateway will do) causes an oops. With older kernels (3.10-3.19) this
>was 
>generally nearly instant. With the current kernel (4.6 rc2) it can take
>
>longer to trigger (several minutes of pinging). Booting with the
>adapter 
>inserted does not change the observed behaviour.
>
>I found (via bisecting) that commit 
>313a58e487ab3eb80e7e1f9baddc75968288aad9 causes the symptom. However,
>it 
>looks like this just exposes an older, underlying problem. The 
>underlying problem appears to be a skb buffer overrun. I think this 
>overrun was not visible before this change due to the memory allocation
>
>pattern of the buffer pool.
>
>I updated the code to avoid reading more data than the buffer can hold 
>(see patch at the end) and I could use the adapter. My machine was up 
>all day running this patch and doing network traffic over the adapter 
>without issue.
>
>/proc/version says
>Linux version 4.6.0-040600rc2-generic (kernel@tangerine) (gcc version 
>5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2) ) #201604031130 SMP Sun Apr 3 
>15:32:46 UTC 2016
>
>Here's an example oops (obtained via netconsole over the other ethernet
>
>interface). However, I doubt it's much use due to the nature of the 
>issue. I have seen a variety of different oops messages while 
>investigating this issue.
>
>[   56.333612] BUG: unable to handle kernel NULL pointer dereference at
>
>0000000000000020
>[   56.333700] IP: [<ffffffff81718ccd>] skb_release_data+0x7d/0x120
>[   56.333764] PGD baf0c067 PUD bb738067 PMD 0
>[   56.333828] Oops: 0000 [#1] SMP
>[   56.333880] Modules linked in: nouveau arc4 iwldvm mac80211 ttm 
>drm_kms_helper drm coretemp kvm_intel i2c_algo_bit snd_hda_codec_hdmi 
>pata_pcmcia fb_sys_fops kvm syscopyarea sysfillrect
>snd_hda_codec_analog 
>uvcvideo iwlwifi snd_hda_codec_generic sysimgblt hp_wmi r852 irqbypass 
>snd_hda_intel sparse_keymap ppdev videobuf2_vmalloc mxm_wmi sm_common 
>pcmcia nand snd_hda_codec videobuf2_memops nand_ecc snd_hda_core 
>nand_bch cfg80211 videobuf2_v4l2 snd_hwdep snd_pcm videobuf2_core 
>yenta_socket bch snd_timer videodev snd pcmcia_rsrc nand_ids r592 
>pcmcia_core mtd soundcore lpc_ich serio_raw pegasus memstick media 
>netconsole mii hp_accel lis3lv02d configfs input_leds joydev 
>input_polldev shpchp 8250_fintek wmi mei_me tpm_infineon parport_pc mei
>
>video lp mac_hid parport hid_generic sdhci_pci e1000e ptp usbhid 
>firewire_ohci psmouse pps_core firewire_core crc_itu_t sdhci hid 
>pata_acpi fjes
>[   56.335370] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 
>4.6.0-040600rc2-generic #201604031130
>[   56.335417] Hardware name: Hewlett-Packard HP EliteBook 8530w/30E7, 
>BIOS 68PDV Ver. F.20 12/08/2011
>[   56.335465] task: ffff880136428d00 ti: ffff880136434000 task.ti: 
>ffff880136434000
>[   56.335508] RIP: 0010:[<ffffffff81718ccd>] [<ffffffff81718ccd>] 
>skb_release_data+0x7d/0x120
>[   56.335570] RSP: 0018:ffff88013bc83c80  EFLAGS: 00010206
>[   56.335609] RAX: 0000000000000000 RBX: ffff8801342cde00 RCX: 
>0000000000000011
>[   56.335650] RDX: 0000000001010a0a RSI: 00000000090000e0 RDI: 
>ffff8801342cde00
>[   56.335693] RBP: ffff88013bc83ca0 R08: 0000000000000000 R09: 
>0000000000000000
>[   56.335734] R10: 0000000000000001 R11: 0000000000000000 R12: 
>ffff8801342cde00
>[   56.335776] R13: 0000000000000000 R14: ffff8801356715c0 R15: 
>ffff8801358600a0
>[   56.335818] FS:  0000000000000000(0000) GS:ffff88013bc80000(0000) 
>knlGS:0000000000000000
>[   56.335866] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
>[   56.335903] CR2: 0000000000000020 CR3: 00000000bba1f000 CR4: 
>00000000000006e0
>[   56.335945] Stack:
>[   56.335965]  ffff8801342cde00 ffff8801342cde00 ffffffff8176c757 
>ffffffff81ef48c0
>[   56.336052]  ffff88013bc83cb8 ffffffff81718d94 ffff8801342cde00 
>ffff88013bc83ce0
>[   56.336137]  ffffffff81718df2 ffff8801342cde00 ffff880135670fce 
>ffffffff81ef48c0
>[   56.336223] Call Trace:
>[   56.336244]  <IRQ>
>[   56.336338]  [<ffffffff8176c757>] ? ip_rcv_finish+0x197/0x390
>[   56.336387]  [<ffffffff81718d94>] skb_release_all+0x24/0x30
>[   56.336425]  [<ffffffff81718df2>] kfree_skb+0x32/0x90
>[   56.336461]  [<ffffffff8176c757>] ip_rcv_finish+0x197/0x390
>[   56.336498]  [<ffffffff8176d001>] ip_rcv+0x291/0x3b0
>[   56.336537]  [<ffffffff8172c6b3>]
>__netif_receive_skb_core+0x523/0xaa0
>[   56.336582]  [<ffffffff8161d773>] ?
>usb_submit_urb.part.6+0x2f3/0x560
>[   56.336622]  [<ffffffff8171d87a>] ? __build_skb+0x2a/0xe0
>[   56.336660]  [<ffffffff8172cc48>] __netif_receive_skb+0x18/0x60
>[   56.336698]  [<ffffffff8172dd48>] process_backlog+0xa8/0x150
>[   56.337576]  [<ffffffff8172d495>] net_rx_action+0x225/0x360
>[   56.337576]  [<ffffffff8161abda>] ? usb_giveback_urb_bh+0xba/0x100
>[   56.337576]  [<ffffffff8183cb66>] __do_softirq+0xf6/0x27e
>[   56.337576]  [<ffffffff810883d3>] irq_exit+0xa3/0xb0
>[   56.337576]  [<ffffffff8183c8c4>] do_IRQ+0x54/0xd0
>[   56.337576]  [<ffffffff8183a9c2>] common_interrupt+0x82/0x82
>[   56.337576]  <EOI>
>[   56.337576]  [<ffffffff816cab1a>] ? cpuidle_enter_state+0x11a/0x2c0
>[   56.337576]  [<ffffffff816cacf7>] cpuidle_enter+0x17/0x20
>[   56.337576]  [<ffffffff810c691a>] call_cpuidle+0x2a/0x50
>[   56.337576]  [<ffffffff810c6cfe>] cpu_startup_entry+0x29e/0x340
>[   56.337576]  [<ffffffff81051cbe>] start_secondary+0x15e/0x190
>[   56.337576] Code: 00 45 31 ed 41 80 3e 00 49 89 fc 75 0f eb 55 41 0f
>
>b6 06 41 83 c5 01 44 39 e8 7e 48 49 63 c5 48 83 c0 03 48 c1 e0 04 49 8b
>
>04 06 <48> 8b 50 20 48 8d 5a ff 83 e2 01 48 0f 44 d8 f0 ff 4b 1c 74 5a
>[   56.337576] RIP  [<ffffffff81718ccd>] skb_release_data+0x7d/0x120
>[   56.337576]  RSP <ffff88013bc83c80>
>[   56.337576] CR2: 0000000000000020
>[   56.337576] ---[ end trace 1e92d60587813cad ]---
>[   56.337576] Kernel panic - not syncing: Fatal exception in interrupt
>[   56.337576] Kernel Offset: disabled
>[   56.337576] ---[ end Kernel panic - not syncing: Fatal exception in 
>interrupt
>[   56.337576] ------------[ cut here ]------------
>[   56.337576] WARNING: CPU: 1 PID: 0 at 
>/home/kernel/COD/linux/kernel/time/tick-broadcast.c:642 
>tick_handle_oneshot_broadcast+0x1e5/0x1f0
>[   56.337576] Modules linked in: nouveau arc4 iwldvm mac80211 ttm 
>drm_kms_helper drm coretemp kvm_intel i2c_algo_bit snd_hda_codec_hdmi 
>pata_pcmcia fb_sys_fops kvm syscopyarea sysfillrect
>snd_hda_codec_analog 
>uvcvideo iwlwifi snd_hda_codec_generic sysimgblt hp_wmi r852 irqbypass 
>snd_hda_intel sparse_keymap ppdev videobuf2_vmalloc mxm_wmi sm_common 
>pcmcia nand snd_hda_codec videobuf2_memops nand_ecc snd_hda_core 
>nand_bch cfg80211 videobuf2_v4l2 snd_hwdep snd_pcm videobuf2_core 
>yenta_socket bch snd_timer videodev snd pcmcia_rsrc nand_ids r592 
>pcmcia_core mtd soundcore lpc_ich serio_raw pegasus memstick media 
>netconsole mii hp_accel lis3lv02d configfs input_leds joydev 
>input_polldev shpchp 8250_fintek wmi mei_me tpm_infineon parport_pc mei
>
>video lp mac_hid parport hid_generic sdhci_pci e1000e ptp usbhid 
>firewire_ohci psmouse pps_core firewire_core crc_itu_t sdhci hid 
>pata_acpi fjes
>[   56.337576] CPU: 1 PID: 0 Comm: swapper/1 Tainted: G D         
>4.6.0-040600rc2-generic #201604031130
>[   56.337576] Hardware name: Hewlett-Packard HP EliteBook 8530w/30E7, 
>BIOS 68PDV Ver. F.20 12/08/2011
>[   56.337576]  0000000000000086 5ce7513385219fe0 ffff88013bc837a8 
>ffffffff813ee8d3
>[   56.337576]  0000000000000000 0000000000000000 ffff88013bc837e8 
>ffffffff810827cb
>[   56.337576]  000002823bc837e8 7fffffffffffffff 000000000000f160 
>0000000d20aa97dc
>[   56.337576] Call Trace:
>[   56.337576]  <IRQ>  [<ffffffff813ee8d3>] dump_stack+0x63/0x90
>[   56.337576]  [<ffffffff810827cb>] __warn+0xcb/0xf0
>[   56.337576]  [<ffffffff810828fd>] warn_slowpath_null+0x1d/0x20
>[   56.337576]  [<ffffffff81101015>] 
>tick_handle_oneshot_broadcast+0x1e5/0x1f0
>[   56.337576]  [<ffffffff81031975>] timer_interrupt+0x15/0x20
>[   56.337576]  [<ffffffff810de192>] handle_irq_event_percpu+0x82/0x1c0
>[   56.337576]  [<ffffffff810de30e>] handle_irq_event+0x3e/0x60
>[   56.337576]  [<ffffffff810e19bd>] handle_edge_irq+0x7d/0x150
>[   56.337576]  [<ffffffff810312fa>] handle_irq+0x1a/0x30
>[   56.337576]  [<ffffffff8183c8bb>] do_IRQ+0x4b/0xd0
>[   56.337576]  [<ffffffff8183a9c2>] common_interrupt+0x82/0x82
>[   56.337576]  [<ffffffff811927f6>] ? panic+0x1dd/0x220
>[   56.337576]  [<ffffffff81031dbc>] oops_end+0xcc/0xd0
>[   56.337576]  [<ffffffff8106b22a>] no_context+0x13a/0x380
>[   56.337576]  [<ffffffff8106b4f1>] __bad_area_nosemaphore+0x81/0x200
>[   56.337576]  [<ffffffff8106b684>] bad_area_nosemaphore+0x14/0x20
>[   56.337576]  [<ffffffff8106ba20>] __do_page_fault+0xc0/0x4d0
>[   56.337576]  [<ffffffff811e7803>] ? dma_pool_alloc+0x1b3/0x240
>[   56.337576]  [<ffffffff813fbf6b>] ? __const_udelay+0x2b/0x30
>[   56.337576]  [<ffffffff8106be52>] do_page_fault+0x22/0x30
>[   56.337576]  [<ffffffff8183c078>] page_fault+0x28/0x30
>[   56.337576]  [<ffffffff81718ccd>] ? skb_release_data+0x7d/0x120
>[   56.337576]  [<ffffffff8176c757>] ? ip_rcv_finish+0x197/0x390
>[   56.337576]  [<ffffffff81718d94>] skb_release_all+0x24/0x30
>[   56.337576]  [<ffffffff81718df2>] kfree_skb+0x32/0x90
>[   56.337576]  [<ffffffff8176c757>] ip_rcv_finish+0x197/0x390
>[   56.337576]  [<ffffffff8176d001>] ip_rcv+0x291/0x3b0
>[   56.337576]  [<ffffffff8172c6b3>]
>__netif_receive_skb_core+0x523/0xaa0
>[   56.337576]  [<ffffffff8161d773>] ?
>usb_submit_urb.part.6+0x2f3/0x560
>[   56.337576]  [<ffffffff8171d87a>] ? __build_skb+0x2a/0xe0
>[   56.337576]  [<ffffffff8172cc48>] __netif_receive_skb+0x18/0x60
>[   56.337576]  [<ffffffff8172dd48>] process_backlog+0xa8/0x150
>[   56.337576]  [<ffffffff8172d495>] net_rx_action+0x225/0x360
>[   56.337576]  [<ffffffff8161abda>] ? usb_giveback_urb_bh+0xba/0x100
>[   56.337576]  [<ffffffff8183cb66>] __do_softirq+0xf6/0x27e
>[   56.337576]  [<ffffffff810883d3>] irq_exit+0xa3/0xb0
>[   56.337576]  [<ffffffff8183c8c4>] do_IRQ+0x54/0xd0
>[   56.337576]  [<ffffffff8183a9c2>] common_interrupt+0x82/0x82
>[   56.337576]  <EOI>  [<ffffffff816cab1a>] ? 
>cpuidle_enter_state+0x11a/0x2c0
>[   56.337576]  [<ffffffff816cacf7>] cpuidle_enter+0x17/0x20
>[   56.337576]  [<ffffffff810c691a>] call_cpuidle+0x2a/0x50
>[   56.337576]  [<ffffffff810c6cfe>] cpu_startup_entry+0x29e/0x340
>[   56.337576]  [<ffffffff81051cbe>] start_secondary+0x15e/0x190
>[   56.337576] ---[ end trace 1e92d60587813cae ]---
>
>lsb-release -rd says
>Description:    Ubuntu 14.04.4 LTS
>Release:    14.04
>
>ver_linux says
>Linux woody 4.6.0-040600rc2-generic #201604031130 SMP Sun Apr 3
>15:32:46 
>UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
>
>GNU C            4.8
>GNU Make        3.81
>Binutils        2.24
>Util-linux        2.20.1
>Mount            2.20.1
>Module-init-tools    15
>E2fsprogs        1.42.9
>PPP            2.4.5
>Linux C Library        2.19
>Dynamic linker (ldd)    2.19
>Linux C++ Library    6.0.19
>Procps            3.3.9
>Net-tools        1.60
>Kbd            1.15.5
>Console-tools        1.15.5
>Sh-utils        8.21
>Udev            204
>Wireless-tools        30
>Modules Loaded        8250_fintek arc4 bch cfg80211 configfs coretemp 
>crc_itu_t drm drm_kms_helper e1000e fb_sys_fops firewire_core 
>firewire_ohci fjes hid hid_generic hp_accel hp_wmi i2c_algo_bit 
>input_leds input_polldev ip_tables iptable_nat irqbypass iwldvm iwlwifi
>
>joydev kvm kvm_intel lis3lv02d lp lpc_ich mac80211 mac_hid media mei 
>mei_me memstick mii mtd mxm_wmi nand nand_bch nand_ecc nand_ids 
>netconsole nf_conntrack nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat 
>nf_nat_ipv4 nf_nat_redirect nouveau parport parport_pc pata_acpi 
>pata_pcmcia pcmcia pcmcia_core pcmcia_rsrc pegasus ppdev pps_core 
>psmouse ptp r592 r852 sdhci sdhci_pci serio_raw shpchp sm_common snd 
>snd_hda_codec snd_hda_codec_analog snd_hda_codec_generic 
>snd_hda_codec_hdmi snd_hda_core snd_hda_intel snd_hwdep snd_pcm 
>snd_timer soundcore sparse_keymap syscopyarea sysfillrect sysimgblt 
>tpm_infineon ttm usbhid uvcvideo video videobuf2_core videobuf2_memops 
>videobuf2_v4l2 videobuf2_vmalloc videodev wmi x_tables xt_REDIRECT 
>xt_tcpudp yenta_socket
>
>/proc/cpuinfo says
>processor    : 0
>vendor_id    : GenuineIntel
>cpu family    : 6
>model        : 23
>model name    : Intel(R) Core(TM)2 Duo CPU     T9600  @ 2.80GHz
>stepping    : 6
>microcode    : 0x60f
>cpu MHz        : 800.000
>cache size    : 6144 KB
>physical id    : 0
>siblings    : 2
>core id        : 0
>cpu cores    : 2
>apicid        : 0
>initial apicid    : 0
>fpu        : yes
>fpu_exception    : yes
>cpuid level    : 10
>wp        : yes
>flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
>
>cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall 
>nx lm constant_tsc arch_perfmon pebs bts nopl aperfmperf eagerfpu pni 
>dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 
>lahf_lm tpr_shadow vnmi flexpriority dtherm
>bugs        :
>bogomips    : 5585.93
>clflush size    : 64
>cache_alignment    : 64
>address sizes    : 36 bits physical, 48 bits virtual
>power management:
>
>processor    : 1
>vendor_id    : GenuineIntel
>cpu family    : 6
>model        : 23
>model name    : Intel(R) Core(TM)2 Duo CPU     T9600  @ 2.80GHz
>stepping    : 6
>microcode    : 0x60f
>cpu MHz        : 800.000
>cache size    : 6144 KB
>physical id    : 0
>siblings    : 2
>core id        : 1
>cpu cores    : 2
>apicid        : 1
>initial apicid    : 1
>fpu        : yes
>fpu_exception    : yes
>cpuid level    : 10
>wp        : yes
>flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
>
>cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall 
>nx lm constant_tsc arch_perfmon pebs bts nopl aperfmperf eagerfpu pni 
>dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 
>lahf_lm tpr_shadow vnmi flexpriority dtherm
>bugs        :
>bogomips    : 5585.98
>clflush size    : 64
>cache_alignment    : 64
>address sizes    : 36 bits physical, 48 bits virtual
>power management:
>
>/proc/modules says
>pegasus 32768 0 - Live 0x0000000000000000
>mii 16384 1 pegasus, Live 0x0000000000000000
>xt_REDIRECT 16384 1 - Live 0x0000000000000000
>nf_nat_redirect 16384 1 xt_REDIRECT, Live 0x0000000000000000
>xt_tcpudp 16384 1 - Live 0x0000000000000000
>iptable_nat 16384 1 - Live 0x0000000000000000
>nf_conntrack_ipv4 16384 1 - Live 0x0000000000000000
>nf_defrag_ipv4 16384 1 nf_conntrack_ipv4, Live 0x0000000000000000
>nf_nat_ipv4 16384 1 iptable_nat, Live 0x0000000000000000
>nf_nat 24576 2 nf_nat_redirect,nf_nat_ipv4, Live 0x0000000000000000
>nf_conntrack 106496 3 nf_conntrack_ipv4,nf_nat_ipv4,nf_nat, Live 
>0x0000000000000000
>ip_tables 28672 1 iptable_nat, Live 0x0000000000000000
>x_tables 36864 3 xt_REDIRECT,xt_tcpudp,ip_tables, Live
>0x0000000000000000
>nouveau 1515520 1 - Live 0x0000000000000000
>arc4 16384 2 - Live 0x0000000000000000
>iwldvm 233472 0 - Live 0x0000000000000000
>ttm 98304 1 nouveau, Live 0x0000000000000000
>mac80211 745472 1 iwldvm, Live 0x0000000000000000
>drm_kms_helper 147456 1 nouveau, Live 0x0000000000000000
>drm 364544 4 nouveau,ttm,drm_kms_helper, Live 0x0000000000000000
>snd_hda_codec_hdmi 45056 1 - Live 0x0000000000000000
>coretemp 16384 0 - Live 0x0000000000000000
>i2c_algo_bit 16384 1 nouveau, Live 0x0000000000000000
>fb_sys_fops 16384 1 drm_kms_helper, Live 0x0000000000000000
>snd_hda_codec_analog 16384 1 - Live 0x0000000000000000
>kvm_intel 188416 0 - Live 0x0000000000000000
>snd_hda_codec_generic 73728 1 snd_hda_codec_analog, Live
>0x0000000000000000
>syscopyarea 16384 1 drm_kms_helper, Live 0x0000000000000000
>pata_pcmcia 20480 1 - Live 0x0000000000000000
>sysfillrect 16384 1 drm_kms_helper, Live 0x0000000000000000
>hp_wmi 16384 0 - Live 0x0000000000000000
>uvcvideo 90112 0 - Live 0x0000000000000000
>kvm 569344 1 kvm_intel, Live 0x0000000000000000
>snd_hda_intel 36864 0 - Live 0x0000000000000000
>sparse_keymap 16384 1 hp_wmi, Live 0x0000000000000000
>sysimgblt 16384 1 drm_kms_helper, Live 0x0000000000000000
>ppdev 20480 0 - Live 0x0000000000000000
>mxm_wmi 16384 1 nouveau, Live 0x0000000000000000
>r852 20480 0 - Live 0x0000000000000000
>iwlwifi 217088 1 iwldvm, Live 0x0000000000000000
>snd_hda_codec 135168 4 
>snd_hda_codec_hdmi,snd_hda_codec_analog,snd_hda_codec_generic,snd_hda_intel,
>
>Live 0x0000000000000000
>sm_common 20480 1 r852, Live 0x0000000000000000
>nand 69632 2 r852,sm_common, Live 0x0000000000000000
>snd_hda_core 81920 5 
>snd_hda_codec_hdmi,snd_hda_codec_analog,snd_hda_codec_generic,snd_hda_intel,snd_hda_codec,
>
>Live 0x0000000000000000
>videobuf2_vmalloc 16384 1 uvcvideo, Live 0x0000000000000000
>nand_ecc 16384 1 nand, Live 0x0000000000000000
>videobuf2_memops 16384 1 videobuf2_vmalloc, Live 0x0000000000000000
>nand_bch 16384 1 nand, Live 0x0000000000000000
>snd_hwdep 16384 1 snd_hda_codec, Live 0x0000000000000000
>videobuf2_v4l2 24576 1 uvcvideo, Live 0x0000000000000000
>bch 20480 1 nand_bch, Live 0x0000000000000000
>irqbypass 16384 1 kvm, Live 0x0000000000000000
>snd_pcm 110592 4 
>snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_core, Live 
>0x0000000000000000
>videobuf2_core 40960 2 uvcvideo,videobuf2_v4l2, Live 0x0000000000000000
>nand_ids 16384 1 nand, Live 0x0000000000000000
>pcmcia 61440 1 pata_pcmcia, Live 0x0000000000000000
>mtd 57344 2 sm_common,nand, Live 0x0000000000000000
>cfg80211 581632 3 iwldvm,mac80211,iwlwifi, Live 0x0000000000000000
>videodev 180224 3 uvcvideo,videobuf2_v4l2,videobuf2_core, Live 
>0x0000000000000000
>snd_timer 32768 1 snd_pcm, Live 0x0000000000000000
>yenta_socket 45056 0 - Live 0x0000000000000000
>lpc_ich 24576 0 - Live 0x0000000000000000
>snd 81920 8 
>snd_hda_codec_hdmi,snd_hda_codec_analog,snd_hda_codec_generic,snd_hda_intel,snd_hda_codec,snd_hwdep,snd_pcm,snd_timer,
>
>Live 0x0000000000000000
>netconsole 20480 0 - Live 0x0000000000000000
>r592 20480 0 - Live 0x0000000000000000
>media 40960 2 uvcvideo,videodev, Live 0x0000000000000000
>soundcore 16384 1 snd, Live 0x0000000000000000
>pcmcia_rsrc 20480 1 yenta_socket, Live 0x0000000000000000
>pcmcia_core 24576 3 pcmcia,yenta_socket,pcmcia_rsrc, Live
>0x0000000000000000
>serio_raw 16384 0 - Live 0x0000000000000000
>memstick 20480 1 r592, Live 0x0000000000000000
>hp_accel 28672 0 - Live 0x0000000000000000
>lis3lv02d 20480 1 hp_accel, Live 0x0000000000000000
>configfs 40960 2 netconsole, Live 0x0000000000000000
>input_leds 16384 0 - Live 0x0000000000000000
>joydev 20480 0 - Live 0x0000000000000000
>input_polldev 16384 1 lis3lv02d, Live 0x0000000000000000
>shpchp 36864 0 - Live 0x0000000000000000
>8250_fintek 16384 0 - Live 0x0000000000000000
>mei_me 32768 0 - Live 0x0000000000000000
>tpm_infineon 20480 0 - Live 0x0000000000000000
>parport_pc 32768 1 - Live 0x0000000000000000
>mei 102400 1 mei_me, Live 0x0000000000000000
>video 40960 1 nouveau, Live 0x0000000000000000
>lp 20480 0 - Live 0x0000000000000000
>wmi 20480 3 nouveau,hp_wmi,mxm_wmi, Live 0x0000000000000000
>mac_hid 16384 0 - Live 0x0000000000000000
>parport 49152 3 ppdev,parport_pc,lp, Live 0x0000000000000000
>hid_generic 16384 0 - Live 0x0000000000000000
>e1000e 237568 0 - Live 0x0000000000000000
>usbhid 49152 0 - Live 0x0000000000000000
>ptp 20480 1 e1000e, Live 0x0000000000000000
>sdhci_pci 28672 0 - Live 0x0000000000000000
>firewire_ohci 40960 0 - Live 0x0000000000000000
>psmouse 131072 0 - Live 0x0000000000000000
>firewire_core 65536 1 firewire_ohci, Live 0x0000000000000000
>crc_itu_t 16384 1 firewire_core, Live 0x0000000000000000
>sdhci 45056 1 sdhci_pci, Live 0x0000000000000000
>hid 122880 2 hid_generic,usbhid, Live 0x0000000000000000
>pps_core 20480 1 ptp, Live 0x0000000000000000
>pata_acpi 16384 0 - Live 0x0000000000000000
>fjes 28672 0 - Live 0x0000000000000000
>
>/proc/ioports says
>0000-0cf7 : PCI Bus 0000:00
>   0000-001f : dma1
>   0020-0021 : pic1
>   0040-0043 : timer0
>   0050-0053 : timer1
>   0060-0060 : keyboard
>   0062-0062 : PNP0C09:00
>     0062-0062 : EC data
>   0064-0064 : keyboard
>   0066-0066 : PNP0C09:00
>     0066-0066 : EC cmd
>   0070-0077 : rtc0
>   0080-008f : dma page reg
>   00a0-00a1 : pic2
>   00c0-00df : dma2
>   00f0-00ff : fpu
>     00f0-00f0 : PNP0C04:00
>   0170-0177 : 0000:00:1f.2
>     0170-0177 : ata_piix
>   01f0-01f7 : 0000:00:1f.2
>     01f0-01f7 : ata_piix
>   0200-027f : pnp 00:03
>   0376-0376 : 0000:00:1f.2
>     0376-0376 : ata_piix
>   0378-037a : parport0
>   037b-037f : parport0
>   03c0-03df : vesafb
>   03f6-03f6 : 0000:00:1f.2
>     03f6-03f6 : ata_piix
>   03f8-03ff : serial
>   0400-0403 : ACPI PM1a_EVT_BLK
>   0404-0405 : ACPI PM1a_CNT_BLK
>   0408-040b : ACPI PM_TMR
>   0410-0415 : ACPI CPU throttle
>   0420-042f : ACPI GPE0_BLK
>   0430-0433 : iTCO_wdt.0.auto
>   0450-0450 : ACPI PM2_CNT_BLK
>   0460-047f : iTCO_wdt.0.auto
>   0500-057f : pnp 00:03
>   0778-077a : parport0
>0cf8-0cff : PCI conf1
>0d00-ffff : PCI Bus 0000:00
>   1000-1003 : pnp 00:03
>   1010-101f : pnp 00:03
>   2000-2fff : PCI Bus 0000:86
>     2000-20ff : PCI CardBus 0000:87
>     2100-210f : pcmcia_socket0
>       2100-210f : pcmcia0.0
>     2400-24ff : PCI CardBus 0000:87
>   3000-4fff : PCI Bus 0000:45
>   5000-6fff : PCI Bus 0000:04
>   7000-7fff : PCI Bus 0000:01
>     7000-707f : 0000:01:00.0
>   8000-801f : 0000:00:1d.2
>     8000-801f : uhci_hcd
>   8020-803f : 0000:00:1d.1
>     8020-803f : uhci_hcd
>   8040-805f : 0000:00:1d.0
>     8040-805f : uhci_hcd
>   8060-807f : 0000:00:1a.2
>     8060-807f : uhci_hcd
>   8080-809f : 0000:00:1a.1
>     8080-809f : uhci_hcd
>   80a0-80bf : 0000:00:1a.0
>     80a0-80bf : uhci_hcd
>   80c0-80df : 0000:00:19.0
>   80e0-80ef : 0000:00:1f.5
>     80e0-80ef : ata_piix
>   80f0-80ff : 0000:00:1f.5
>     80f0-80ff : ata_piix
>   8100-810f : 0000:00:1f.2
>     8100-810f : ata_piix
>   8110-811f : 0000:00:1f.2
>     8110-811f : ata_piix
>   8120-812f : 0000:00:03.2
>   8130-8137 : 0000:00:1f.5
>     8130-8137 : ata_piix
>   8138-813f : 0000:00:1f.5
>     8138-813f : ata_piix
>   8150-8157 : 0000:00:03.3
>     8150-8157 : serial
>   8158-815f : 0000:00:03.2
>   8160-8167 : 0000:00:03.2
>   8168-816b : 0000:00:1f.5
>     8168-816b : ata_piix
>   816c-816f : 0000:00:1f.5
>     816c-816f : ata_piix
>   8178-817b : 0000:00:03.2
>   817c-817f : 0000:00:03.2
>   9000-9fff : PCI Bus 0000:02
>   a000-afff : PCI Bus 0000:03
>   ef80-ef9f : pnp 00:03
>   ffff-ffff : pnp 00:03
>
>/proc/iomem says
>00000000-00000fff : reserved
>00001000-0009fbff : System RAM
>0009fc00-0009ffff : reserved
>000a0000-000bffff : PCI Bus 0000:00
>000c0000-000ce1ff : Video ROM
>000ce800-000cf7ff : Adapter ROM
>000cf800-000d07ff : Adapter ROM
>000ef000-000fffff : reserved
>   000f0000-000fffff : System ROM
>00100000-b8e1dfff : System RAM
>   01000000-0183eff7 : Kernel code
>   0183eff8-01f4347f : Kernel data
>   020c6000-02207fff : Kernel bss
>b8e1e000-b8e1ffff : reserved
>b8e20000-b9d6ffff : System RAM
>b9d70000-b9d7ffff : ACPI Non-volatile Storage
>b9d80000-bc492fff : System RAM
>bc493000-bc692fff : ACPI Non-volatile Storage
>bc693000-bde91fff : System RAM
>bde92000-bde99fff : reserved
>bde9a000-bdebefff : System RAM
>bdebf000-bdecefff : reserved
>bdecf000-bdfcefff : ACPI Non-volatile Storage
>bdfcf000-bdffefff : ACPI Tables
>bdfff000-bdffffff : System RAM
>be000000-bfffffff : reserved
>c0000000-dfffffff : PCI Bus 0000:00
>   c0000000-cfffffff : PCI Bus 0000:01
>     c0000000-cfffffff : 0000:01:00.0
>   d0000000-d2ffffff : PCI Bus 0000:01
>     d0000000-d1ffffff : 0000:01:00.0
>     d2000000-d2ffffff : 0000:01:00.0
>   d3000000-d30fffff : PCI Bus 0000:86
>     d3000000-d3000fff : 0000:86:09.4
>       d3000000-d3000fff : yenta_socket
>     d3001000-d30017ff : 0000:86:09.0
>       d3001000-d30017ff : firewire_ohci
>     d3001800-d30018ff : 0000:86:09.3
>       d3001800-d30018ff : r852
>     d3001900-d30019ff : 0000:86:09.2
>       d3001900-d30019ff : r592
>     d3001b00-d3001bff : 0000:86:09.1
>       d3001b00-d3001bff : mmc0
>     d3010000-d3010fff : pcmcia_socket0
>   d3100000-d70fffff : PCI Bus 0000:45
>   d7100000-db0fffff : PCI Bus 0000:04
>   db100000-db1fffff : PCI Bus 0000:03
>     db100000-db101fff : 0000:03:00.0
>       db100000-db101fff : iwlwifi
>   db200000-db2fffff : PCI Bus 0000:02
>   db300000-db31ffff : 0000:00:19.0
>     db300000-db31ffff : e1000e
>   db320000-db323fff : 0000:00:1b.0
>     db320000-db323fff : ICH HD audio
>   db324000-db324fff : 0000:00:19.0
>     db324000-db324fff : e1000e
>   db325000-db325fff : 0000:00:03.3
>   db326000-db3263ff : 0000:00:1d.7
>     db326000-db3263ff : ehci_hcd
>   db326400-db3267ff : 0000:00:1a.7
>     db326400-db3267ff : ehci_hcd
>   db326800-db32680f : 0000:00:03.0
>     db326800-db32680f : mei_me
>   db400000-db5fffff : PCI Bus 0000:02
>   db600000-db7fffff : PCI Bus 0000:03
>   db800000-db9fffff : PCI Bus 0000:04
>   dba00000-dbbfffff : PCI Bus 0000:45
>   dc000000-dfffffff : PCI CardBus 0000:87
>e0000000-efffffff : PCI MMCONFIG 0000 [bus 00-ff]
>   e0000000-efffffff : reserved
>     e0000000-efffffff : pnp 00:00
>f0000000-fedfffff : PCI Bus 0000:00
>   f0000000-f3ffffff : PCI CardBus 0000:87
>   fec00000-fec00fff : reserved
>     fec00000-fec003ff : IOAPIC 0
>   fed00000-fed003ff : HPET 0
>     fed00000-fed003ff : pnp 00:02
>   fed10000-fed13fff : reserved
>     fed10000-fed13fff : pnp 00:00
>   fed18000-fed19fff : reserved
>     fed18000-fed18fff : pnp 00:00
>     fed19000-fed19fff : pnp 00:00
>   fed1c000-fed1ffff : reserved
>     fed1c000-fed1ffff : pnp 00:00
>       fed1f410-fed1f414 : iTCO_wdt.0.auto
>   fed20000-fed3ffff : pnp 00:00
>   fed40000-fed44fff : GTPM
>   fed45000-fed8ffff : pnp 00:00
>fee00000-fee00fff : Local APIC
>   fee00000-fee00fff : reserved
>fee01000-ffffffff : PCI Bus 0000:00
>   ff000000-ffffffff : INT0800:00
>     ffe80000-ffffffff : reserved
>100000000-13bffffff : System RAM
>
>sudo lspci -vvv says
>00:00.0 Host bridge: Intel Corporation Mobile 4 Series Chipset Memory 
>Controller Hub (rev 07)
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort+ >SERR- <PERR- INTx-
>     Latency: 0
>     Capabilities: [e0] Vendor Specific Information: Len=0a <?>
>
>00:01.0 PCI bridge: Intel Corporation Mobile 4 Series Chipset PCI 
>Express Graphics Port (rev 07) (prog-if 00 [Normal decode])
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx+
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0, Cache Line Size: 64 bytes
>     Bus: primary=00, secondary=01, subordinate=01, sec-latency=0
>     I/O behind bridge: 00007000-00007fff
>     Memory behind bridge: d0000000-d2ffffff
>   Prefetchable memory behind bridge: 00000000c0000000-00000000cfffffff
>     Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort+ <SERR- <PERR-
>     BridgeCtl: Parity- SERR- NoISA- VGA+ MAbort- >Reset- FastB2B-
>         PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
>     Capabilities: [88] Subsystem: Hewlett-Packard Company Device 30e7
>     Capabilities: [80] Power Management version 3
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [90] MSI: Enable+ Count=1/1 Maskable- 64bit-
>         Address: fee0300c  Data: 41e1
>     Capabilities: [a0] Express (v1) Root Port (Slot+), MSI 00
>         DevCap:    MaxPayload 128 bytes, PhantFunc 0
>             ExtTag- RBE+
>         DevCtl:    Report errors: Correctable- Non-Fatal- Fatal- 
>Unsupported-
>             RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
>             MaxPayload 128 bytes, MaxReadReq 128 bytes
>         DevSta:    CorrErr+ UncorrErr- FatalErr- UnsuppReq- AuxPwr- 
>TransPend-
>       LnkCap:    Port #2, Speed 2.5GT/s, Width x16, ASPM L0s L1, Exit 
>Latency L0s <256ns, L1 <4us
>             ClockPM- Surprise- LLActRep- BwNot-
>        LnkCtl:    ASPM L0s L1 Enabled; RCB 64 bytes Disabled- CommClk+
>             ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
>         LnkSta:    Speed 2.5GT/s, Width x16, TrErr- Train- SlotClk+ 
>DLActive- BWMgmt- ABWMgmt-
>         SltCap:    AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ 
>Surprise-
>             Slot #1, PowerLimit 75.000W; Interlock- NoCompl+
>         SltCtl:    Enable: AttnBtn- PwrFlt- MRL- PresDet+ CmdCplt- 
>HPIrq+ LinkChg-
>             Control: AttnInd Off, PwrInd On, Power- Interlock-
>         SltSta:    Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet+ 
>Interlock-
>             Changed: MRL- PresDet- LinkState-
>         RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna+ 
>CRSVisible-
>         RootCap: CRSVisible-
>         RootSta: PME ReqID 0000, PMEStatus- PMEPending-
>     Capabilities: [100 v1] Virtual Channel
>         Caps:    LPEVC=0 RefClk=100ns PATEntryBits=1
>         Arb:    Fixed+ WRR32- WRR64- WRR128-
>         Ctrl:    ArbSelect=Fixed
>         Status:    InProgress-
>         VC0:    Caps:    PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
>             Arb:    Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
>             Ctrl:    Enable+ ID=0 ArbSelect=Fixed TC/VC=01
>             Status:    NegoPending- InProgress-
>     Capabilities: [140 v1] Root Complex Link
>         Desc:    PortNumber=02 ComponentID=01 EltType=Config
>        Link0:    Desc:    TargetPort=00 TargetComponent=01 AssocRCRB- 
>LinkType=MemMapped LinkValid+
>             Addr:    00000000fed19000
>     Kernel driver in use: pcieport
>
>00:03.0 Communication controller: Intel Corporation Mobile 4 Series 
>Chipset MEI Controller (rev 07)
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx+
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin A routed to IRQ 30
>     Region 0: Memory at db326800 (64-bit, non-prefetchable) [size=16]
>     Capabilities: [50] Power Management version 3
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [8c] MSI: Enable+ Count=1/1 Maskable- 64bit+
>         Address: 00000000fee0300c  Data: 41e2
>     Kernel driver in use: mei_me
>
>00:03.2 IDE interface: Intel Corporation Mobile 4 Series Chipset PT
>IDER 
>Controller (rev 07) (prog-if 85 [Master SecO PriO])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Interrupt: pin C routed to IRQ 18
>     Region 0: I/O ports at 8160 [size=8]
>     Region 1: I/O ports at 817c [size=4]
>     Region 2: I/O ports at 8158 [size=8]
>     Region 3: I/O ports at 8178 [size=4]
>     Region 4: I/O ports at 8120 [size=16]
>     Capabilities: [c8] Power Management version 3
>         Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA 
>PME(D0-,D1-,D2-,D3hot-,D3cold-)
>         Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+
>         Address: 0000000000000000  Data: 0000
>
>00:03.3 Serial controller: Intel Corporation Mobile 4 Series Chipset
>AMT 
>SOL Redirection (rev 07) (prog-if 02 [16550])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin B routed to IRQ 17
>     Region 0: I/O ports at 8150 [size=8]
>     Region 1: Memory at db325000 (32-bit, non-prefetchable) [size=4K]
>     Capabilities: [c8] Power Management version 3
>         Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA 
>PME(D0-,D1-,D2-,D3hot-,D3cold-)
>         Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+
>         Address: 0000000000000000  Data: 0000
>     Kernel driver in use: serial
>
>00:19.0 Ethernet controller: Intel Corporation 82567LM Gigabit Network 
>Connection (rev 03)
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx+
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin A routed to IRQ 29
>    Region 0: Memory at db300000 (32-bit, non-prefetchable) [size=128K]
>     Region 1: Memory at db324000 (32-bit, non-prefetchable) [size=4K]
>     Region 2: I/O ports at 80c0 [size=32]
>     Capabilities: [c8] Power Management version 2
>         Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=1 PME-
>     Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
>         Address: 00000000fee0200c  Data: 4143
>     Capabilities: [e0] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: e1000e
>
>00:1a.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI
>
>Controller #4 (rev 03) (prog-if 00 [UHCI])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin A routed to IRQ 16
>     Region 4: I/O ports at 80a0 [size=32]
>     Capabilities: [50] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: uhci_hcd
>
>00:1a.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI
>
>Controller #5 (rev 03) (prog-if 00 [UHCI])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin B routed to IRQ 17
>     Region 4: I/O ports at 8080 [size=32]
>     Capabilities: [50] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: uhci_hcd
>
>00:1a.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI
>
>Controller #6 (rev 03) (prog-if 00 [UHCI])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin C routed to IRQ 18
>     Region 4: I/O ports at 8060 [size=32]
>     Capabilities: [50] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: uhci_hcd
>
>00:1a.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2
>EHCI 
>Controller #2 (rev 03) (prog-if 20 [EHCI])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin D routed to IRQ 19
>     Region 0: Memory at db326400 (32-bit, non-prefetchable) [size=1K]
>     Capabilities: [50] Power Management version 2
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME+
>     Capabilities: [58] Debug port: BAR=1 offset=00a0
>     Capabilities: [98] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: ehci-pci
>
>00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio 
>Controller (rev 03)
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx+
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0, Cache Line Size: 64 bytes
>     Interrupt: pin A routed to IRQ 32
>     Region 0: Memory at db320000 (64-bit, non-prefetchable) [size=16K]
>     Capabilities: [50] Power Management version 2
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=55mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [60] MSI: Enable+ Count=1/1 Maskable- 64bit+
>         Address: 00000000fee0300c  Data: 4163
>     Capabilities: [70] Express (v1) Root Complex Integrated Endpoint, 
>MSI 00
>         DevCap:    MaxPayload 128 bytes, PhantFunc 0
>             ExtTag- RBE-
>         DevCtl:    Report errors: Correctable- Non-Fatal- Fatal- 
>Unsupported-
>             RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop+
>             MaxPayload 128 bytes, MaxReadReq 128 bytes
>         DevSta:    CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ 
>TransPend-
>     Capabilities: [100 v1] Virtual Channel
>         Caps:    LPEVC=0 RefClk=100ns PATEntryBits=1
>         Arb:    Fixed- WRR32- WRR64- WRR128-
>         Ctrl:    ArbSelect=Fixed
>         Status:    InProgress-
>         VC0:    Caps:    PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
>             Arb:    Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
>             Ctrl:    Enable+ ID=0 ArbSelect=Fixed TC/VC=7f
>             Status:    NegoPending- InProgress-
>         VC1:    Caps:    PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
>             Arb:    Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
>             Ctrl:    Enable+ ID=1 ArbSelect=Fixed TC/VC=80
>             Status:    NegoPending- InProgress-
>     Capabilities: [130 v1] Root Complex Link
>         Desc:    PortNumber=0f ComponentID=02 EltType=Config
>        Link0:    Desc:    TargetPort=00 TargetComponent=02 AssocRCRB- 
>LinkType=MemMapped LinkValid+
>             Addr:    00000000fed1c000
>     Kernel driver in use: snd_hda_intel
>
>00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express 
>Port 1 (rev 03) (prog-if 00 [Normal decode])
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx+
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0, Cache Line Size: 64 bytes
>     Bus: primary=00, secondary=02, subordinate=02, sec-latency=0
>     I/O behind bridge: 00009000-00009fff
>     Memory behind bridge: db200000-db2fffff
>   Prefetchable memory behind bridge: 00000000db400000-00000000db5fffff
>     Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort+ <SERR- <PERR-
>     BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B-
>         PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
>     Capabilities: [40] Express (v1) Root Port (Slot+), MSI 00
>         DevCap:    MaxPayload 128 bytes, PhantFunc 0
>             ExtTag- RBE+
>         DevCtl:    Report errors: Correctable- Non-Fatal- Fatal- 
>Unsupported-
>             RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
>             MaxPayload 128 bytes, MaxReadReq 128 bytes
>         DevSta:    CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ 
>TransPend-
>        LnkCap:    Port #1, Speed 2.5GT/s, Width x1, ASPM L0s L1, Exit 
>Latency L0s <1us, L1 <4us
>             ClockPM- Surprise- LLActRep+ BwNot-
>         LnkCtl:    ASPM Disabled; RCB 64 bytes Disabled- CommClk-
>             ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
>         LnkSta:    Speed 2.5GT/s, Width x0, TrErr- Train- SlotClk+ 
>DLActive- BWMgmt- ABWMgmt-
>         SltCap:    AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ 
>Surprise+
>             Slot #0, PowerLimit 6.500W; Interlock- NoCompl-
>         SltCtl:    Enable: AttnBtn- PwrFlt- MRL- PresDet+ CmdCplt+ 
>HPIrq+ LinkChg+
>            Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock-
>         SltSta:    Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet- 
>Interlock-
>             Changed: MRL- PresDet- LinkState-
>         RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna+ 
>CRSVisible-
>         RootCap: CRSVisible-
>         RootSta: PME ReqID 0000, PMEStatus- PMEPending-
>     Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
>         Address: fee0300c  Data: 4122
>     Capabilities: [90] Subsystem: Device 0000:0000
>     Capabilities: [a0] Power Management version 2
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [100 v1] Virtual Channel
>         Caps:    LPEVC=0 RefClk=100ns PATEntryBits=1
>         Arb:    Fixed+ WRR32- WRR64- WRR128-
>         Ctrl:    ArbSelect=Fixed
>         Status:    InProgress-
>         VC0:    Caps:    PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
>             Arb:    Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256-
>             Ctrl:    Enable+ ID=0 ArbSelect=Fixed TC/VC=01
>             Status:    NegoPending- InProgress-
>     Capabilities: [180 v1] Root Complex Link
>         Desc:    PortNumber=01 ComponentID=02 EltType=Config
>        Link0:    Desc:    TargetPort=00 TargetComponent=02 AssocRCRB- 
>LinkType=MemMapped LinkValid+
>             Addr:    00000000fed1c000
>     Kernel driver in use: pcieport
>
>00:1c.1 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express 
>Port 2 (rev 03) (prog-if 00 [Normal decode])
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx+
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0, Cache Line Size: 64 bytes
>     Bus: primary=00, secondary=03, subordinate=03, sec-latency=0
>     I/O behind bridge: 0000a000-0000afff
>     Memory behind bridge: db100000-db1fffff
>   Prefetchable memory behind bridge: 00000000db600000-00000000db7fffff
>     Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort+ <SERR- <PERR-
>     BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B-
>         PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
>     Capabilities: [40] Express (v1) Root Port (Slot+), MSI 00
>         DevCap:    MaxPayload 128 bytes, PhantFunc 0
>             ExtTag- RBE+
>         DevCtl:    Report errors: Correctable- Non-Fatal- Fatal- 
>Unsupported-
>             RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
>             MaxPayload 128 bytes, MaxReadReq 128 bytes
>         DevSta:    CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ 
>TransPend-
>        LnkCap:    Port #2, Speed 2.5GT/s, Width x1, ASPM L0s L1, Exit 
>Latency L0s <256ns, L1 <4us
>             ClockPM- Surprise- LLActRep+ BwNot-
>         LnkCtl:    ASPM L1 Enabled; RCB 64 bytes Disabled- CommClk+
>             ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
>         LnkSta:    Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ 
>DLActive+ BWMgmt- ABWMgmt-
>         SltCap:    AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ 
>Surprise+
>             Slot #1, PowerLimit 6.500W; Interlock- NoCompl-
>         SltCtl:    Enable: AttnBtn- PwrFlt- MRL- PresDet+ CmdCplt+ 
>HPIrq+ LinkChg+
>            Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock-
>         SltSta:    Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet+ 
>Interlock-
>             Changed: MRL- PresDet- LinkState-
>         RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna+ 
>CRSVisible-
>         RootCap: CRSVisible-
>         RootSta: PME ReqID 0000, PMEStatus- PMEPending-
>     Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
>         Address: fee0300c  Data: 4152
>     Capabilities: [90] Subsystem: Device 0000:0000
>     Capabilities: [a0] Power Management version 2
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [100 v1] Virtual Channel
>         Caps:    LPEVC=0 RefClk=100ns PATEntryBits=1
>         Arb:    Fixed+ WRR32- WRR64- WRR128-
>         Ctrl:    ArbSelect=Fixed
>         Status:    InProgress-
>         VC0:    Caps:    PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
>             Arb:    Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256-
>             Ctrl:    Enable+ ID=0 ArbSelect=Fixed TC/VC=01
>             Status:    NegoPending- InProgress-
>     Capabilities: [180 v1] Root Complex Link
>         Desc:    PortNumber=02 ComponentID=02 EltType=Config
>        Link0:    Desc:    TargetPort=00 TargetComponent=02 AssocRCRB- 
>LinkType=MemMapped LinkValid+
>             Addr:    00000000fed1c000
>     Kernel driver in use: pcieport
>
>00:1c.2 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express 
>Port 3 (rev 03) (prog-if 00 [Normal decode])
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx+
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0, Cache Line Size: 64 bytes
>     Bus: primary=00, secondary=04, subordinate=44, sec-latency=0
>     I/O behind bridge: 00005000-00006fff
>     Memory behind bridge: d7100000-db0fffff
>   Prefetchable memory behind bridge: 00000000db800000-00000000db9fffff
>     Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort+ <SERR- <PERR-
>     BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B-
>         PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
>     Capabilities: [40] Express (v1) Root Port (Slot+), MSI 00
>         DevCap:    MaxPayload 128 bytes, PhantFunc 0
>             ExtTag- RBE+
>         DevCtl:    Report errors: Correctable- Non-Fatal- Fatal- 
>Unsupported-
>             RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
>             MaxPayload 128 bytes, MaxReadReq 128 bytes
>         DevSta:    CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ 
>TransPend-
>        LnkCap:    Port #3, Speed 2.5GT/s, Width x1, ASPM L0s L1, Exit 
>Latency L0s <1us, L1 <4us
>             ClockPM- Surprise- LLActRep+ BwNot-
>         LnkCtl:    ASPM Disabled; RCB 64 bytes Disabled- CommClk-
>             ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
>         LnkSta:    Speed 2.5GT/s, Width x0, TrErr- Train- SlotClk+ 
>DLActive- BWMgmt- ABWMgmt-
>         SltCap:    AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ 
>Surprise+
>             Slot #2, PowerLimit 6.500W; Interlock- NoCompl-
>         SltCtl:    Enable: AttnBtn- PwrFlt- MRL- PresDet+ CmdCplt+ 
>HPIrq+ LinkChg+
>            Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock-
>         SltSta:    Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet- 
>Interlock-
>             Changed: MRL- PresDet- LinkState-
>         RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna+ 
>CRSVisible-
>         RootCap: CRSVisible-
>         RootSta: PME ReqID 0000, PMEStatus- PMEPending-
>     Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
>         Address: fee0300c  Data: 4172
>     Capabilities: [90] Subsystem: Device 0000:0000
>     Capabilities: [a0] Power Management version 2
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [100 v1] Virtual Channel
>         Caps:    LPEVC=0 RefClk=100ns PATEntryBits=1
>         Arb:    Fixed+ WRR32- WRR64- WRR128-
>         Ctrl:    ArbSelect=Fixed
>         Status:    InProgress-
>         VC0:    Caps:    PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
>             Arb:    Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256-
>             Ctrl:    Enable+ ID=0 ArbSelect=Fixed TC/VC=01
>             Status:    NegoPending- InProgress-
>     Capabilities: [180 v1] Root Complex Link
>         Desc:    PortNumber=03 ComponentID=02 EltType=Config
>        Link0:    Desc:    TargetPort=00 TargetComponent=02 AssocRCRB- 
>LinkType=MemMapped LinkValid+
>             Addr:    00000000fed1c000
>     Kernel driver in use: pcieport
>
>00:1c.4 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express 
>Port 5 (rev 03) (prog-if 00 [Normal decode])
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx+
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0, Cache Line Size: 64 bytes
>     Bus: primary=00, secondary=45, subordinate=85, sec-latency=0
>     I/O behind bridge: 00003000-00004fff
>     Memory behind bridge: d3100000-d70fffff
>   Prefetchable memory behind bridge: 00000000dba00000-00000000dbbfffff
>     Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort+ <SERR- <PERR-
>     BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B-
>         PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
>     Capabilities: [40] Express (v1) Root Port (Slot+), MSI 00
>         DevCap:    MaxPayload 128 bytes, PhantFunc 0
>             ExtTag- RBE+
>         DevCtl:    Report errors: Correctable- Non-Fatal- Fatal- 
>Unsupported-
>             RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
>             MaxPayload 128 bytes, MaxReadReq 128 bytes
>         DevSta:    CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ 
>TransPend-
>        LnkCap:    Port #5, Speed 2.5GT/s, Width x1, ASPM L0s L1, Exit 
>Latency L0s <1us, L1 <4us
>             ClockPM- Surprise- LLActRep+ BwNot-
>         LnkCtl:    ASPM Disabled; RCB 64 bytes Disabled- CommClk-
>             ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
>         LnkSta:    Speed 2.5GT/s, Width x0, TrErr- Train- SlotClk+ 
>DLActive- BWMgmt- ABWMgmt-
>         SltCap:    AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ 
>Surprise+
>             Slot #4, PowerLimit 6.500W; Interlock- NoCompl-
>         SltCtl:    Enable: AttnBtn- PwrFlt- MRL- PresDet+ CmdCplt+ 
>HPIrq+ LinkChg+
>            Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock-
>         SltSta:    Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet- 
>Interlock-
>             Changed: MRL- PresDet- LinkState-
>         RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna+ 
>CRSVisible-
>         RootCap: CRSVisible-
>         RootSta: PME ReqID 0000, PMEStatus- PMEPending-
>     Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
>         Address: fee0300c  Data: 4182
>     Capabilities: [90] Subsystem: Device 0000:0000
>     Capabilities: [a0] Power Management version 2
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [100 v1] Virtual Channel
>         Caps:    LPEVC=0 RefClk=100ns PATEntryBits=1
>         Arb:    Fixed+ WRR32- WRR64- WRR128-
>         Ctrl:    ArbSelect=Fixed
>         Status:    InProgress-
>         VC0:    Caps:    PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
>             Arb:    Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256-
>             Ctrl:    Enable+ ID=0 ArbSelect=Fixed TC/VC=01
>             Status:    NegoPending- InProgress-
>     Capabilities: [180 v1] Root Complex Link
>         Desc:    PortNumber=05 ComponentID=02 EltType=Config
>        Link0:    Desc:    TargetPort=00 TargetComponent=02 AssocRCRB- 
>LinkType=MemMapped LinkValid+
>             Addr:    00000000fed1c000
>     Kernel driver in use: pcieport
>
>00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI
>
>Controller #1 (rev 03) (prog-if 00 [UHCI])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin A routed to IRQ 20
>     Region 4: I/O ports at 8040 [size=32]
>     Capabilities: [50] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: uhci_hcd
>
>00:1d.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI
>
>Controller #2 (rev 03) (prog-if 00 [UHCI])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin B routed to IRQ 22
>     Region 4: I/O ports at 8020 [size=32]
>     Capabilities: [50] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: uhci_hcd
>
>00:1d.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI
>
>Controller #3 (rev 03) (prog-if 00 [UHCI])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin C routed to IRQ 18
>     Region 4: I/O ports at 8000 [size=32]
>     Capabilities: [50] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: uhci_hcd
>
>00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2
>EHCI 
>Controller #1 (rev 03) (prog-if 20 [EHCI])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin D routed to IRQ 20
>     Region 0: Memory at db326000 (32-bit, non-prefetchable) [size=1K]
>     Capabilities: [50] Power Management version 2
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [58] Debug port: BAR=1 offset=00a0
>     Capabilities: [98] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: ehci-pci
>
>00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 93) 
>(prog-if 01 [Subtractive decode])
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR+ FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Bus: primary=00, secondary=86, subordinate=8a, sec-latency=64
>     I/O behind bridge: 00002000-00002fff
>     Memory behind bridge: d3000000-d30fffff
>   Prefetchable memory behind bridge: 00000000fff00000-00000000000fffff
>     Secondary status: 66MHz- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort+ <SERR- <PERR-
>     BridgeCtl: Parity- SERR+ NoISA- VGA- MAbort- >Reset- FastB2B-
>         PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
>     Capabilities: [50] Subsystem: Device 0000:0000
>
>00:1f.0 ISA bridge: Intel Corporation ICH9M-E LPC Interface Controller 
>(rev 03)
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Capabilities: [e0] Vendor Specific Information: Len=0c <?>
>     Kernel driver in use: lpc_ich
>
>00:1f.2 IDE interface: Intel Corporation 82801IBM/IEM (ICH9M/ICH9M-E) 2
>
>port SATA Controller [IDE mode] (rev 03) (prog-if 8a [Master SecP
>PriP])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin A routed to IRQ 21
>     Region 0: I/O ports at 01f0 [size=8]
>     Region 1: I/O ports at 03f4
>     Region 2: I/O ports at 0170 [size=8]
>     Region 3: I/O ports at 0374
>     Region 4: I/O ports at 8110 [size=16]
>     Region 5: I/O ports at 8100 [size=16]
>     Capabilities: [70] Power Management version 3
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA 
>PME(D0-,D1-,D2-,D3hot-,D3cold-)
>         Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [b0] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: ata_piix
>
>00:1f.5 IDE interface: Intel Corporation 82801IBM/IEM (ICH9M/ICH9M-E) 2
>
>port SATA Controller [IDE mode] (rev 03) (prog-if 85 [Master SecO
>PriO])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0
>     Interrupt: pin C routed to IRQ 18
>     Region 0: I/O ports at 8138 [size=8]
>     Region 1: I/O ports at 816c [size=4]
>     Region 2: I/O ports at 8130 [size=8]
>     Region 3: I/O ports at 8168 [size=4]
>     Region 4: I/O ports at 80f0 [size=16]
>     Region 5: I/O ports at 80e0 [size=16]
>     Capabilities: [70] Power Management version 3
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA 
>PME(D0-,D1-,D2-,D3hot-,D3cold-)
>         Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [b0] PCI Advanced Features
>         AFCap: TP+ FLR+
>         AFCtrl: FLR-
>         AFStatus: TP-
>     Kernel driver in use: ata_piix
>
>01:00.0 VGA compatible controller: NVIDIA Corporation G96GLM [Quadro FX
>
>770M] (rev a1) (prog-if 00 [VGA controller])
>     Subsystem: Hewlett-Packard Company Device 30e7
>     Physical Slot: 1
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx+
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0, Cache Line Size: 64 bytes
>     Interrupt: pin A routed to IRQ 33
>     Region 0: Memory at d2000000 (32-bit, non-prefetchable) [size=16M]
>     Region 1: Memory at c0000000 (64-bit, prefetchable) [size=256M]
>     Region 3: Memory at d0000000 (64-bit, non-prefetchable) [size=32M]
>     Region 5: I/O ports at 7000 [size=128]
>     Expansion ROM at 000c0000 [disabled] [size=128K]
>     Capabilities: [60] Power Management version 3
>         Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA 
>PME(D0-,D1-,D2-,D3hot-,D3cold-)
>         Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [68] MSI: Enable+ Count=1/1 Maskable- 64bit+
>         Address: 00000000fee0300c  Data: 4173
>     Capabilities: [78] Express (v2) Endpoint, MSI 00
>         DevCap:    MaxPayload 128 bytes, PhantFunc 0, Latency L0s 
><256ns, L1 <4us
>             ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
>         DevCtl:    Report errors: Correctable- Non-Fatal- Fatal- 
>Unsupported-
>             RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+
>             MaxPayload 128 bytes, MaxReadReq 512 bytes
>         DevSta:    CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- 
>TransPend-
>       LnkCap:    Port #0, Speed 2.5GT/s, Width x16, ASPM L0s L1, Exit 
>Latency L0s <256ns, L1 <1us
>             ClockPM- Surprise- LLActRep- BwNot-
>       LnkCtl:    ASPM L0s L1 Enabled; RCB 128 bytes Disabled- CommClk+
>             ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
>         LnkSta:    Speed 2.5GT/s, Width x16, TrErr- Train- SlotClk+ 
>DLActive- BWMgmt- ABWMgmt-
>        DevCap2: Completion Timeout: Not Supported, TimeoutDis+, LTR-, 
>OBFF Not Supported
>         DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR-, 
>OBFF Disabled
>        LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-
>              Transmit Margin: Normal Operating Range, 
>EnterModifiedCompliance- ComplianceSOS-
>              Compliance De-emphasis: -6dB
>         LnkSta2: Current De-emphasis Level: -6dB, 
>EqualizationComplete-, EqualizationPhase1-
>              EqualizationPhase2-, EqualizationPhase3-, 
>LinkEqualizationRequest-
>     Capabilities: [b4] Vendor Specific Information: Len=14 <?>
>     Capabilities: [100 v1] Virtual Channel
>         Caps:    LPEVC=0 RefClk=100ns PATEntryBits=1
>         Arb:    Fixed- WRR32- WRR64- WRR128-
>         Ctrl:    ArbSelect=Fixed
>         Status:    InProgress-
>         VC0:    Caps:    PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
>             Arb:    Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
>             Ctrl:    Enable+ ID=0 ArbSelect=Fixed TC/VC=01
>             Status:    NegoPending- InProgress-
>     Capabilities: [128 v1] Power Budgeting <?>
>     Capabilities: [600 v1] Vendor Specific Information: ID=0001 Rev=1 
>Len=024 <?>
>     Kernel driver in use: nouveau
>
>03:00.0 Network controller: Intel Corporation Ultimate N WiFi Link 5300
>     Subsystem: Intel Corporation Device 1011
>     Physical Slot: 1-1
>   Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx+
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 0, Cache Line Size: 64 bytes
>     Interrupt: pin A routed to IRQ 31
>     Region 0: Memory at db100000 (64-bit, non-prefetchable) [size=8K]
>     Capabilities: [c8] Power Management version 3
>         Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA 
>PME(D0+,D1-,D2-,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
>     Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
>         Address: 00000000fee0300c  Data: 4153
>     Capabilities: [e0] Express (v1) Endpoint, MSI 00
>         DevCap:    MaxPayload 128 bytes, PhantFunc 0, Latency L0s 
><512ns, L1 unlimited
>             ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset+
>         DevCtl:    Report errors: Correctable- Non-Fatal- Fatal- 
>Unsupported-
>             RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+ FLReset-
>             MaxPayload 128 bytes, MaxReadReq 128 bytes
>         DevSta:    CorrErr+ UncorrErr- FatalErr- UnsuppReq+ AuxPwr+ 
>TransPend-
>        LnkCap:    Port #0, Speed 2.5GT/s, Width x1, ASPM L0s L1, Exit 
>Latency L0s <128ns, L1 <32us
>             ClockPM+ Surprise- LLActRep- BwNot-
>        LnkCtl:    ASPM L0s L1 Enabled; RCB 64 bytes Disabled- CommClk+
>             ExtSynch- ClockPM+ AutWidDis- BWInt- AutBWInt-
>         LnkSta:    Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ 
>DLActive- BWMgmt- ABWMgmt-
>     Capabilities: [100 v1] Advanced Error Reporting
>         UESta:    DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- 
>RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
>         UEMsk:    DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- 
>RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
>         UESvrt:    DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- 
>RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
>      CESta:    RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
>      CEMsk:    RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
>     AERCap:    First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-
>    Capabilities: [140 v1] Device Serial Number 00-21-6a-ff-ff-0d-ba-8a
>     Kernel driver in use: iwlwifi
>
>86:09.0 FireWire (IEEE 1394): Ricoh Co Ltd R5C832 IEEE 1394 Controller 
>(rev 06) (prog-if 10 [OHCI])
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 64 (500ns min, 1000ns max), Cache Line Size: 64 bytes
>     Interrupt: pin A routed to IRQ 20
>     Region 0: Memory at d3001000 (32-bit, non-prefetchable) [size=2K]
>     Capabilities: [dc] Power Management version 2
>         Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA 
>PME(D0+,D1+,D2+,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=2 PME+
>     Kernel driver in use: firewire_ohci
>
>86:09.1 SD Host controller: Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro 
>Host Adapter (rev 25)
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 64, Cache Line Size: 64 bytes
>     Interrupt: pin B routed to IRQ 22
>     Region 0: Memory at d3001b00 (32-bit, non-prefetchable) [size=256]
>     Capabilities: [80] Power Management version 2
>         Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA 
>PME(D0+,D1+,D2+,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=2 PME-
>     Kernel driver in use: sdhci-pci
>
>86:09.2 System peripheral: Ricoh Co Ltd R5C592 Memory Stick Bus Host 
>Adapter (rev 14)
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 64, Cache Line Size: 64 bytes
>     Interrupt: pin B routed to IRQ 22
>     Region 0: Memory at d3001900 (32-bit, non-prefetchable) [size=256]
>     Capabilities: [80] Power Management version 2
>         Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA 
>PME(D0+,D1+,D2+,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=2 PME-
>     Kernel driver in use: r592
>
>86:09.3 System peripheral: Ricoh Co Ltd xD-Picture Card Controller (rev
>14)
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 64, Cache Line Size: 64 bytes
>     Interrupt: pin B routed to IRQ 22
>     Region 0: Memory at d3001800 (32-bit, non-prefetchable) [size=256]
>     Capabilities: [80] Power Management version 2
>         Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA 
>PME(D0+,D1+,D2+,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=2 PME-
>     Kernel driver in use: r852
>
>86:09.4 CardBus bridge: Ricoh Co Ltd RL5c476 II (rev bb)
>     Subsystem: Hewlett-Packard Company Device 30e7
>   Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
>Stepping- SERR- FastB2B- DisINTx-
>     Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- 
><TAbort- <MAbort- >SERR- <PERR- INTx-
>     Latency: 168
>     Interrupt: pin B routed to IRQ 22
>     Region 0: Memory at d3000000 (32-bit, non-prefetchable) [size=4K]
>     Bus: primary=86, secondary=87, subordinate=8a, sec-latency=176
>     Memory window 0: dc000000-dfffffff (prefetchable)
>     Memory window 1: f0000000-f3ffffff
>     I/O window 0: 00002000-000020ff
>     I/O window 1: 00002400-000024ff
>  BridgeCtl: Parity- SERR- ISA- VGA- MAbort- >Reset- 16bInt- PostWrite+
>     16-bit legacy interface ports at 0001
>     Capabilities: [dc] Power Management version 2
>         Flags: PMEClk+ DSI- D1+ D2+ AuxCurrent=0mA 
>PME(D0+,D1+,D2+,D3hot+,D3cold+)
>         Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=2 PME-
>         Bridge: PM- B3+
>     Kernel driver in use: yenta_cardbus
>
>
> From 4acb3b3b5199d92bc21a2d043582addfe671eff7 Mon Sep 17 00:00:00 2001
>From: Lincoln Ramsay <a1291762@gmail.com>
>Date: Sat, 2 Apr 2016 14:47:49 +1000
>Subject: [PATCH] pegasus: Do not write more data to the buffer than it
>can
>  hold.
>
>---
>  drivers/net/usb/pegasus.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
>diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c
>index 03e8a15..ab85656 100644
>--- a/drivers/net/usb/pegasus.c
>+++ b/drivers/net/usb/pegasus.c
>@@ -528,7 +528,7 @@ static void read_bulk_callback(struct urb *urb)
>  goon:
>      usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb,
>                usb_rcvbulkpipe(pegasus->usb, 1),
>-              pegasus->rx_skb->data, PEGASUS_MTU + 8,
>+              pegasus->rx_skb->data, PEGASUS_MTU,
>                read_bulk_callback, pegasus);
>      rx_status = usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC);
>      if (rx_status == -ENODEV)
>@@ -569,7 +569,7 @@ static void rx_fixup(unsigned long data)
>      }
>      usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb,
>                usb_rcvbulkpipe(pegasus->usb, 1),
>-              pegasus->rx_skb->data, PEGASUS_MTU + 8,
>+              pegasus->rx_skb->data, PEGASUS_MTU,
>                read_bulk_callback, pegasus);
>  try_again:
>      status = usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC);
>@@ -823,7 +823,7 @@ static int pegasus_open(struct net_device *net)
>
>      usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb,
>                usb_rcvbulkpipe(pegasus->usb, 1),
>-              pegasus->rx_skb->data, PEGASUS_MTU + 8,
>+              pegasus->rx_skb->data, PEGASUS_MTU,
>                read_bulk_callback, pegasus);
>      if ((res = usb_submit_urb(pegasus->rx_urb, GFP_KERNEL))) {
>          if (res == -ENODEV)

^ permalink raw reply

* Re: [net PATCH v2 2/2] ipv4/GRO: Make GRO conform to RFC 6864
From: Alexander Duyck @ 2016-04-05 15:52 UTC (permalink / raw)
  To: Herbert Xu
  Cc: Alexander Duyck, Tom Herbert, Jesse Gross, Eric Dumazet, Netdev,
	David Miller
In-Reply-To: <20160405043209.GA9822@gondor.apana.org.au>

On Mon, Apr 4, 2016 at 9:32 PM, Herbert Xu <herbert@gondor.apana.org.au> wrote:
> On Mon, Apr 04, 2016 at 09:26:55PM -0700, Alexander Duyck wrote:
>>
>> The problem is right now we are mangling the IP ID for outer headers
>> on tunnels.  We end up totally ignoring the delta between the values
>> so if you have two flows that get interleaved over the same tunnel GRO
>> will currently mash the IP IDs for the two tunnels so that they end up
>> overlapping.
>
> Then it should be fixed.  I never reviewed those patches or I would
> have objected at the time.

The problem is what you are proposing is much larger than I am
comfortable proposing for a net patch so I will probably go back to
targeting net-next.

>> The reason why I keep referencing RFC 6864 is because it specifies
>> that the IP ID field must not be read if the DF bit is set, and that
>> if we are manipulating headers we can handle the IP ID as though we
>> are the transmitting station.  What this means is that if DF is not
>> set we have to have unique values per packet, otherwise we can ignore
>> the values if DF is set.
>
> As I said GRO itself should not be visible.  The fact that it is
> for tunnels is a bug.

Right.  But the fact that we are even trying to get reliable data out
of IP ID is also a bug.  The fact is the IP ID isn't going to be
linear in the case of tunnels.  There is a good liklihood that the IP
ID will jump around if we are doing encapsulation using a third party
device such as a switch.  That was one of the reasons why my first
implementation just completely ignored the IP ID in the case that the
DF bit is set.  Honestly I am leaning more toward taking the approach
of going back to that implementation and adding a sysctl that would
let you disable it.  Maybe something like net.ipv4.gro.rfc6864 since
that is the RFC that spells out that we should treat IP ID as a
floating input/output if DF is set.  Basically we need to be able to
do that if the GSO partial code is going to work.

>> The question I would have is what are you really losing with increment
>> from 0 versus fixed 0?  From what I see it is essentially just garbage
>> in/garbage out.
>
> GRO is meant to be lossless, that is, you should not be able to
> detect its presence from the outside.  If you lose information then
> you're breaking this rule and people will soon start asking for it
> to be disabled in various situations.

Right.  But in this case we technically aren't losing information.
That is the thing I have been trying to point out with RFC 6864.  It
calls out that you MUST not read IP ID if the DF bit is set.

> I'm not against doing this per se but it should not be part of the
> default configuration.

I disagree I think it will have to be part of the default
configuration.  The problem is the IP ID is quickly becoming
meaningless.  When you consider that a 40Gb/s link can wrap the IP ID
value nearly 50 times a second using a 1500 MTU the IP ID field should
just be ignored anyway because you cannot guarantee that it will be
unique without limiting the Tx window size.  That was the whole point
of RFC6864.  Basically the IP ID field is so small that as we push
into the higher speeds you cannot guarantee that the field will have
any meaning so for any case where you don't need to use it you
shouldn't because it will likely not provide enough useful data.

- Alex

^ permalink raw reply

* Re: [PATCH net 1/4] lib/test_bpf: Fix JMP_JSET tests
From: Alexei Starovoitov @ 2016-04-05 15:57 UTC (permalink / raw)
  To: Naveen N. Rao, linux-kernel, linuxppc-dev, netdev
  Cc: Daniel Borkmann, Paul Mackerras, Michael Holzheu, David S. Miller
In-Reply-To: <5e3cf7c4a971e6d2ff7a2d50bbec2e6e26883b84.1459850410.git.naveen.n.rao@linux.vnet.ibm.com>

On 4/5/16 3:02 AM, Naveen N. Rao wrote:
> JMP_JSET tests incorrectly used BPF_JNE. Fix the same.
>
> Cc: Alexei Starovoitov <ast@fb.com>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: "David S. Miller" <davem@davemloft.net>
> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
> Cc: Michael Ellerman <mpe@ellerman.id.au>
> Cc: Paul Mackerras <paulus@samba.org>
> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>

Good catch.
Fixes: cffc642d93f9 ("test_bpf: add 173 new testcases for eBPF")
Acked-by: Alexei Starovoitov <ast@kernel.org>

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

^ permalink raw reply

* RE: [PATCH] mwifiex: add __GFP_REPEAT to skb allocation call
From: David Laight @ 2016-04-05 16:05 UTC (permalink / raw)
  To: 'Amitkumar Karwar', Eric Dumazet, Wei-Ning Huang
  Cc: Kalle Valo, Linux Wireless, LKML, Nishant Sarmukadam,
	Sameer Nanda, netdev@vger.kernel.org, Sonny Rao, Douglas Anderson
In-Reply-To: <4fa3762986eb4b848dbe7daf6871d7a8@SC-EXCH04.marvell.com>

From: Amitkumar Karwar
> Sent: 05 April 2016 06:48
...
> Our one time allocated 64k buffer read from firmware contains multiple data chunks. We have a feature
> called single port aggregation in which firmware attaches an aggregated buffer to single port. So
> sometimes a single data chunk can exceed 32k. dev_kfree_skb_any() is called to free those data chunks.

Ah yes, which particular problem does aggregating data into a single buffer solve?

	David


^ permalink raw reply

* Re: [net-next 03/16] fm10k: Avoid crashing the kernel
From: David Miller @ 2016-04-05 16:12 UTC (permalink / raw)
  To: jeffrey.t.kirsher; +Cc: bruce.w.allan, netdev, nhorman, sassmann, jogreene
In-Reply-To: <1459843288-40623-4-git-send-email-jeffrey.t.kirsher@intel.com>

From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Tue,  5 Apr 2016 01:01:15 -0700

> diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c b/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
> index 28837ae..6a9f988 100644
> --- a/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
> +++ b/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
> @@ -398,7 +398,7 @@ static void fm10k_get_reg_q(struct fm10k_hw *hw, u32 *buff, int i)
>  	buff[idx++] = fm10k_read_reg(hw, FM10K_TX_SGLORT(i));
>  	buff[idx++] = fm10k_read_reg(hw, FM10K_PFVTCTL(i));
>  
> -	BUG_ON(idx != FM10K_REGS_LEN_Q);
> +	BUILD_BUG_ON(idx != FM10K_REGS_LEN_Q);
>  }
>  
>  /* If function above adds more registers this define needs to be updated */

As Joe suggested, it is not reasonable to expect all compilers to be able to figure
out the result of all of the index increments in this function lead to a specific
constant value.

Your only option is to either keep the code as-is, or add proper error reporting to
this function and to all callers, in order to handle the situation at run time which
I realize is exactly what you are trying to avoid.

If this crashes at run time with the BUG_ON(), it's going to happen really quickly
when you bring the interface up.  So I don't see the run time check as so tragic.

^ permalink raw reply

* [net PATCH v3] GRE: Disable segmentation offloads w/ CSUM and we are encapsulated via FOU
From: Alexander Duyck @ 2016-04-05 16:13 UTC (permalink / raw)
  To: jesse, netdev, davem, alexander.duyck, tom

This patch fixes an issue I found in which we were dropping frames if we
had enabled checksums on GRE headers that were encapsulated by either FOU
or GUE.  Without this patch I was barely able to get 1 Gb/s of throughput.
With this patch applied I am now at least getting around 6 Gb/s.

The issue is due to the fact that with FOU or GUE applied we do not provide
a transport offset pointing to the GRE header, nor do we offload it in
software as the GRE header is completely skipped by GSO and treated like a
VXLAN or GENEVE type header.  As such we need to prevent the stack from
generating it and also prevent GRE from generating it via any interface we
create.

Fixes: c3483384ee511 ("gro: Allow tunnel stacking in the case of FOU/GUE")
Signed-off-by: Alexander Duyck <aduyck@mirantis.com>
---

v3: Basically the same patch as v1 and v2, but I am cutting it loose from
    the IPv4 ID patch as that one will likely need to be resolved in
    net-next.

 include/linux/netdevice.h |    5 ++++-
 net/core/dev.c            |    1 +
 net/ipv4/fou.c            |    6 ++++++
 net/ipv4/gre_offload.c    |    8 ++++++++
 net/ipv4/ip_gre.c         |   13 ++++++++++---
 5 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index cb0d5d09c2e4..8395308a2445 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2120,7 +2120,10 @@ struct napi_gro_cb {
 	/* Used in foo-over-udp, set in udp[46]_gro_receive */
 	u8	is_ipv6:1;
 
-	/* 7 bit hole */
+	/* Used in GRE, set in fou/gue_gro_receive */
+	u8	is_fou:1;
+
+	/* 6 bit hole */
 
 	/* used to support CHECKSUM_COMPLETE for tunneling protocols */
 	__wsum	csum;
diff --git a/net/core/dev.c b/net/core/dev.c
index b9bcbe77d913..77a71cd68535 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4439,6 +4439,7 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff
 		NAPI_GRO_CB(skb)->flush = 0;
 		NAPI_GRO_CB(skb)->free = 0;
 		NAPI_GRO_CB(skb)->encap_mark = 0;
+		NAPI_GRO_CB(skb)->is_fou = 0;
 		NAPI_GRO_CB(skb)->gro_remcsum_start = 0;
 
 		/* Setup for GRO checksum validation */
diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c
index 5a94aea280d3..a39068b4a4d9 100644
--- a/net/ipv4/fou.c
+++ b/net/ipv4/fou.c
@@ -203,6 +203,9 @@ static struct sk_buff **fou_gro_receive(struct sk_buff **head,
 	 */
 	NAPI_GRO_CB(skb)->encap_mark = 0;
 
+	/* Flag this frame as already having an outer encap header */
+	NAPI_GRO_CB(skb)->is_fou = 1;
+
 	rcu_read_lock();
 	offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
 	ops = rcu_dereference(offloads[proto]);
@@ -368,6 +371,9 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head,
 	 */
 	NAPI_GRO_CB(skb)->encap_mark = 0;
 
+	/* Flag this frame as already having an outer encap header */
+	NAPI_GRO_CB(skb)->is_fou = 1;
+
 	rcu_read_lock();
 	offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
 	ops = rcu_dereference(offloads[guehdr->proto_ctype]);
diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c
index c47539d04b88..6a5bd4317866 100644
--- a/net/ipv4/gre_offload.c
+++ b/net/ipv4/gre_offload.c
@@ -150,6 +150,14 @@ static struct sk_buff **gre_gro_receive(struct sk_buff **head,
 	if ((greh->flags & ~(GRE_KEY|GRE_CSUM)) != 0)
 		goto out;
 
+	/* We can only support GRE_CSUM if we can track the location of
+	 * the GRE header.  In the case of FOU/GUE we cannot because the
+	 * outer UDP header displaces the GRE header leaving us in a state
+	 * of limbo.
+	 */
+	if ((greh->flags & GRE_CSUM) && NAPI_GRO_CB(skb)->is_fou)
+		goto out;
+
 	type = greh->protocol;
 
 	rcu_read_lock();
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 31936d387cfd..af5d1f38217f 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -862,9 +862,16 @@ static void __gre_tunnel_init(struct net_device *dev)
 	dev->hw_features	|= GRE_FEATURES;
 
 	if (!(tunnel->parms.o_flags & TUNNEL_SEQ)) {
-		/* TCP offload with GRE SEQ is not supported. */
-		dev->features    |= NETIF_F_GSO_SOFTWARE;
-		dev->hw_features |= NETIF_F_GSO_SOFTWARE;
+		/* TCP offload with GRE SEQ is not supported, nor
+		 * can we support 2 levels of outer headers requiring
+		 * an update.
+		 */
+		if (!(tunnel->parms.o_flags & TUNNEL_CSUM) ||
+		    (tunnel->encap.type == TUNNEL_ENCAP_NONE)) {
+			dev->features    |= NETIF_F_GSO_SOFTWARE;
+			dev->hw_features |= NETIF_F_GSO_SOFTWARE;
+		}
+
 		/* Can use a lockless transmit, unless we generate
 		 * output sequences
 		 */

^ permalink raw reply related

* Re: [PATCH net 2/4] lib/test_bpf: Add tests for unsigned BPF_JGT
From: Alexei Starovoitov @ 2016-04-05 16:20 UTC (permalink / raw)
  To: Naveen N. Rao, linux-kernel, linuxppc-dev, netdev
  Cc: Daniel Borkmann, David S. Miller, Ananth N Mavinakayanahalli,
	Michael Ellerman, Paul Mackerras
In-Reply-To: <6b946d54d20d96052ce4f4baec308cdb20ace39a.1459850410.git.naveen.n.rao@linux.vnet.ibm.com>

On 4/5/16 3:02 AM, Naveen N. Rao wrote:
> Unsigned Jump-if-Greater-Than.
>
> Cc: Alexei Starovoitov <ast@fb.com>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: "David S. Miller" <davem@davemloft.net>
> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
> Cc: Michael Ellerman <mpe@ellerman.id.au>
> Cc: Paul Mackerras <paulus@samba.org>
> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>

I think some of the tests already cover it, but extra tests are
always great.
Acked-by: Alexei Starovoitov <ast@kernel.org>

I think the whole set belongs in net-next.
Next time you submit the patches please say [PATCH net-next] in subject.
[PATCH net] is for bugfixes only.
Thanks a bunch!

^ permalink raw reply

* [PATCH net-next 0/3] tipc: some small fixes
From: Jon Maloy @ 2016-04-05 16:20 UTC (permalink / raw)
  To: davem; +Cc: Jon Maloy, netdev, Paul Gortmaker, tipc-discussion

When running TIPC in large clusters we experience behavior that
may potentially become problematic in the future. This series
picks some low-hanging fruit in this regard, and also fixes a
couple of other minor issues.

Jon Maloy (3):
  tipc: eliminate buffer leak in bearer layer
  tipc: stricter filtering of packets in bearer layer
  tipc: reduce transmission rate of reset messages when link is down

 net/tipc/bearer.c   | 101 ++++++++++++++++++++++++++++++----------------------
 net/tipc/discover.c |   7 ++--
 net/tipc/discover.h |   2 +-
 net/tipc/link.c     |  10 +++---
 net/tipc/msg.h      |   5 +++
 5 files changed, 73 insertions(+), 52 deletions(-)

-- 
1.9.1


------------------------------------------------------------------------------

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox