* Re: [net PATCH v2 2/2] ipv4/GRO: Make GRO conform to RFC 6864
From: Eric Dumazet @ 2016-04-05 16:30 UTC (permalink / raw)
To: Alexander Duyck
Cc: Herbert Xu, Alexander Duyck, Tom Herbert, Jesse Gross,
Eric Dumazet, Netdev, David Miller
In-Reply-To: <CAKgT0Uc=9MMzSHWgZib5+EwPCQokjSSnC9vfOtWKULvmwUQpdQ@mail.gmail.com>
On Tue, 2016-04-05 at 08:52 -0700, Alexander Duyck wrote:
>
> 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.
Just because a few flows reach 40Gbit , we should remind that vast
majority of the Internet runs with < 50Mbits flows.
I prefer the argument of IPv6 not having ID ;)
We should do our best to keep interoperability, this is the selling
point.
And quite frankly your last patch makes perfect sense to me :
The aggregation is done only if the TCP headers of consecutive packets
matches. So who cares of IPv4 ID really ?
This is a very minor detail. The possible gains outperform the
theoretical 'problem'
GRO already reorder flows, it never had a guarantee of being 'ínvisible'
as Herbert claims.
^ permalink raw reply
* Re: [PATCH net 4/4] lib/test_bpf: Add additional BPF_ADD tests
From: Alexei Starovoitov @ 2016-04-05 16:28 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: <9b71e280481a9f84cd7dbb9e767fd08e6f4c0aef.1459850410.git.naveen.n.rao@linux.vnet.ibm.com>
On 4/5/16 3:02 AM, Naveen N. Rao wrote:
> Some of these tests proved useful with the powerpc eBPF JIT port due to
> sign-extended 16-bit immediate loads. Though some of these aspects get
> covered in other tests, it is better to have explicit tests so as to
> quickly tag the precise problem.
>
> 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>
Makes sense. Looks like ppc jit will be using quite a bit of
available ppc instructions. Nice.
I'm assuming all these new tests passed with x64 jit?
Acked-by: Alexei Starovoitov <ast@kernel.org>
^ permalink raw reply
* Re: [PATCH net 3/4] lib/test_bpf: Add test to check for result of 32-bit add that overflows
From: Alexei Starovoitov @ 2016-04-05 16:21 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: <9c799e59e71c022271c6287769d45a32f29de4bd.1459850410.git.naveen.n.rao@linux.vnet.ibm.com>
On 4/5/16 3:02 AM, Naveen N. Rao wrote:
> BPF_ALU32 and BPF_ALU64 tests for adding two 32-bit values that results in
> 32-bit overflow.
>
> 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>
Acked-by: Alexei Starovoitov <ast@kernel.org>
^ permalink raw reply
* [PATCH net-next 3/3] tipc: reduce transmission rate of reset messages when link is down
From: Jon Maloy @ 2016-04-05 16:20 UTC (permalink / raw)
To: davem; +Cc: Jon Maloy, netdev, Paul Gortmaker, tipc-discussion
In-Reply-To: <1459873255-32354-1-git-send-email-jon.maloy@ericsson.com>
When a link is down, it will continuously try to re-establish contact
with the peer by sending out a RESET or and ACTIVATE message at each
timeout interval. The default value for this interval is currently
375 ms. This is wasteful, and may become a problem in very large
clusters with dozens or hundereds of nodes being down simultaneously.
We now introduce a simple backoff algorithm for these cases. The
first five messages are sent at default rate; thereafter a message
is sent only each 16't timer interval.
This will cover the vast majority of link recyling cases, since the
endpoint starting last will transmit at the higher speed, and the link
should normally be established well be before the rate needs to be
reduced.
The only case where we will see a degradation of link re-establishment
is when the endpoins remain intact, and a glitch in the transmission
media is causing the link reset. We will then experience a worst-case
re-establishing time of 6 seconds, something we deem acceptable.
Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
---
net/tipc/link.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 7d2bb3e..42cdbd1 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -140,6 +140,7 @@ struct tipc_link {
char if_name[TIPC_MAX_IF_NAME];
u32 priority;
char net_plane;
+ u16 rst_cnt;
/* Failover/synch */
u16 drop_point;
@@ -701,8 +702,6 @@ static void link_profile_stats(struct tipc_link *l)
/* tipc_link_timeout - perform periodic task as instructed from node timeout
*/
-/* tipc_link_timeout - perform periodic task as instructed from node timeout
- */
int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq)
{
int rc = 0;
@@ -730,11 +729,13 @@ int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq)
l->silent_intv_cnt++;
break;
case LINK_RESET:
- xmit = true;
+ if ((l->rst_cnt++ <= 4) || !(l->rst_cnt % 16))
+ xmit = true;
mtyp = RESET_MSG;
break;
case LINK_ESTABLISHING:
- xmit = true;
+ if ((l->rst_cnt++ <= 4) || !(l->rst_cnt % 16))
+ xmit = true;
mtyp = ACTIVATE_MSG;
break;
case LINK_PEER_RESET:
@@ -833,6 +834,7 @@ void tipc_link_reset(struct tipc_link *l)
l->rcv_nxt = 1;
l->acked = 0;
l->silent_intv_cnt = 0;
+ l->rst_cnt = 0;
l->stats.recv_info = 0;
l->stale_count = 0;
l->bc_peer_is_up = false;
--
1.9.1
------------------------------------------------------------------------------
^ permalink raw reply related
* [PATCH net-next 2/3] tipc: stricter filtering of packets in bearer layer
From: Jon Maloy @ 2016-04-05 16:20 UTC (permalink / raw)
To: davem; +Cc: Jon Maloy, netdev, Paul Gortmaker, tipc-discussion
In-Reply-To: <1459873255-32354-1-git-send-email-jon.maloy@ericsson.com>
Resetting a bearer/interface, with the consequence of resetting all its
pertaining links, is not an atomic action. This becomes particularly
evident in very large clusters, where a lot of traffic may happen on the
remaining links while we are busy shutting them down. In extreme cases,
we may even see links being re-created and re-established before we are
finished with the job.
To solve this, we now introduce a solution where we temporarily detach
the bearer from the interface when the bearer is reset. This inhibits
all packet reception, while sending still is possible. For the latter,
we use the fact that the device's user pointer now is zero to filter out
which packets can be sent during this situation; i.e., outgoing RESET
messages only. This filtering serves to speed up the neighbors'
detection of the loss event, and saves us from unnecessary probing.
Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
---
net/tipc/bearer.c | 50 +++++++++++++++++++++++++++++++++-----------------
net/tipc/msg.h | 5 +++++
2 files changed, 38 insertions(+), 17 deletions(-)
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index 20566e9..6f11c62 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -337,23 +337,16 @@ static int tipc_reset_bearer(struct net *net, struct tipc_bearer *b)
*/
static void bearer_disable(struct net *net, struct tipc_bearer *b)
{
- struct tipc_net *tn = net_generic(net, tipc_net_id);
- u32 i;
+ struct tipc_net *tn = tipc_net(net);
+ int bearer_id = b->identity;
pr_info("Disabling bearer <%s>\n", b->name);
b->media->disable_media(b);
-
- tipc_node_delete_links(net, b->identity);
+ tipc_node_delete_links(net, bearer_id);
RCU_INIT_POINTER(b->media_ptr, NULL);
if (b->link_req)
tipc_disc_delete(b->link_req);
-
- for (i = 0; i < MAX_BEARERS; i++) {
- if (b == rtnl_dereference(tn->bearer_list[i])) {
- RCU_INIT_POINTER(tn->bearer_list[i], NULL);
- break;
- }
- }
+ RCU_INIT_POINTER(tn->bearer_list[bearer_id], NULL);
kfree_rcu(b, rcu);
}
@@ -396,7 +389,7 @@ void tipc_disable_l2_media(struct tipc_bearer *b)
/**
* tipc_l2_send_msg - send a TIPC packet out over an L2 interface
- * @buf: the packet to be sent
+ * @skb: the packet to be sent
* @b: the bearer through which the packet is to be sent
* @dest: peer destination address
*/
@@ -405,17 +398,21 @@ int tipc_l2_send_msg(struct net *net, struct sk_buff *skb,
{
struct net_device *dev;
int delta;
+ void *tipc_ptr;
dev = (struct net_device *)rcu_dereference_rtnl(b->media_ptr);
if (!dev)
return 0;
+ /* Send RESET message even if bearer is detached from device */
+ tipc_ptr = rtnl_dereference(dev->tipc_ptr);
+ if (unlikely(!tipc_ptr && !msg_is_reset(buf_msg(skb))))
+ goto drop;
+
delta = dev->hard_header_len - skb_headroom(skb);
if ((delta > 0) &&
- pskb_expand_head(skb, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) {
- kfree_skb(skb);
- return 0;
- }
+ pskb_expand_head(skb, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC))
+ goto drop;
skb_reset_network_header(skb);
skb->dev = dev;
@@ -424,6 +421,9 @@ int tipc_l2_send_msg(struct net *net, struct sk_buff *skb,
dev->dev_addr, skb->len);
dev_queue_xmit(skb);
return 0;
+drop:
+ kfree_skb(skb);
+ return 0;
}
int tipc_bearer_mtu(struct net *net, u32 bearer_id)
@@ -549,9 +549,18 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt,
{
struct net_device *dev = netdev_notifier_info_to_dev(ptr);
struct net *net = dev_net(dev);
+ struct tipc_net *tn = tipc_net(net);
struct tipc_bearer *b;
+ int i;
b = rtnl_dereference(dev->tipc_ptr);
+ if (!b) {
+ for (i = 0; i < MAX_BEARERS; b = NULL, i++) {
+ b = rtnl_dereference(tn->bearer_list[i]);
+ if (b && (b->media_ptr == dev))
+ break;
+ }
+ }
if (!b)
return NOTIFY_DONE;
@@ -561,13 +570,20 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt,
case NETDEV_CHANGE:
if (netif_carrier_ok(dev))
break;
+ case NETDEV_UP:
+ rcu_assign_pointer(dev->tipc_ptr, b);
+ break;
case NETDEV_GOING_DOWN:
+ RCU_INIT_POINTER(dev->tipc_ptr, NULL);
+ synchronize_net();
+ tipc_reset_bearer(net, b);
+ break;
case NETDEV_CHANGEMTU:
tipc_reset_bearer(net, b);
break;
case NETDEV_CHANGEADDR:
b->media->raw2addr(b, &b->addr,
- (char *)dev->dev_addr);
+ (char *)dev->dev_addr);
tipc_reset_bearer(net, b);
break;
case NETDEV_UNREGISTER:
diff --git a/net/tipc/msg.h b/net/tipc/msg.h
index 55778a0..f34f639 100644
--- a/net/tipc/msg.h
+++ b/net/tipc/msg.h
@@ -779,6 +779,11 @@ static inline bool msg_peer_node_is_up(struct tipc_msg *m)
return msg_redundant_link(m);
}
+static inline bool msg_is_reset(struct tipc_msg *hdr)
+{
+ return (msg_user(hdr) == LINK_PROTOCOL) && (msg_type(hdr) == RESET_MSG);
+}
+
struct sk_buff *tipc_buf_acquire(u32 size);
bool tipc_msg_validate(struct sk_buff *skb);
bool tipc_msg_reverse(u32 own_addr, struct sk_buff **skb, int err);
--
1.9.1
------------------------------------------------------------------------------
^ permalink raw reply related
* [PATCH net-next 1/3] tipc: eliminate buffer leak in bearer layer
From: Jon Maloy @ 2016-04-05 16:20 UTC (permalink / raw)
To: davem; +Cc: Jon Maloy, netdev, Paul Gortmaker, tipc-discussion
In-Reply-To: <1459873255-32354-1-git-send-email-jon.maloy@ericsson.com>
When enabling a bearer we create a 'neigbor discoverer' instance by
calling the function tipc_disc_create() before the bearer is actually
registered in the list of enabled bearers. Because of this, the very
first discovery broadcast message, created by the mentioned function,
is lost, since it cannot find any valid bearer to use. Furthermore,
the used send function, tipc_bearer_xmit_skb() does not free the given
buffer when it cannot find a bearer, resulting in the leak of exactly
one send buffer each time a bearer is enabled.
This commit fixes this problem by introducing two changes:
1) Instead of attemting to send the discovery message directly, we let
tipc_disc_create() return the discovery buffer to the calling
function, tipc_enable_bearer(), so that the latter can send it
when the enabling sequence is finished.
2) In tipc_bearer_xmit_skb(), as well as in the two other transmit
functions at the bearer layer, we now free the indicated buffer or
buffer chain when a valid bearer cannot be found.
Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
---
net/tipc/bearer.c | 51 ++++++++++++++++++++++++++-------------------------
net/tipc/discover.c | 7 ++-----
net/tipc/discover.h | 2 +-
3 files changed, 29 insertions(+), 31 deletions(-)
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index 27a5406..20566e9 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -205,6 +205,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
struct tipc_bearer *b;
struct tipc_media *m;
struct tipc_bearer_names b_names;
+ struct sk_buff *skb;
char addr_string[16];
u32 bearer_id;
u32 with_this_prio;
@@ -301,7 +302,7 @@ restart:
b->net_plane = bearer_id + 'A';
b->priority = priority;
- res = tipc_disc_create(net, b, &b->bcast_addr);
+ res = tipc_disc_create(net, b, &b->bcast_addr, &skb);
if (res) {
bearer_disable(net, b);
pr_warn("Bearer <%s> rejected, discovery object creation failed\n",
@@ -310,7 +311,8 @@ restart:
}
rcu_assign_pointer(tn->bearer_list[bearer_id], b);
-
+ if (skb)
+ tipc_bearer_xmit_skb(net, bearer_id, skb, &b->bcast_addr);
pr_info("Enabled bearer <%s>, discovery domain %s, priority %u\n",
name,
tipc_addr_string_fill(addr_string, disc_domain), priority);
@@ -450,6 +452,8 @@ void tipc_bearer_xmit_skb(struct net *net, u32 bearer_id,
b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
if (likely(b))
b->media->send_msg(net, skb, b, dest);
+ else
+ kfree_skb(skb);
rcu_read_unlock();
}
@@ -468,11 +472,11 @@ void tipc_bearer_xmit(struct net *net, u32 bearer_id,
rcu_read_lock();
b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
- if (likely(b)) {
- skb_queue_walk_safe(xmitq, skb, tmp) {
- __skb_dequeue(xmitq);
- b->media->send_msg(net, skb, b, dst);
- }
+ if (unlikely(!b))
+ __skb_queue_purge(xmitq);
+ skb_queue_walk_safe(xmitq, skb, tmp) {
+ __skb_dequeue(xmitq);
+ b->media->send_msg(net, skb, b, dst);
}
rcu_read_unlock();
}
@@ -490,14 +494,14 @@ void tipc_bearer_bc_xmit(struct net *net, u32 bearer_id,
rcu_read_lock();
b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
- if (likely(b)) {
- skb_queue_walk_safe(xmitq, skb, tmp) {
- hdr = buf_msg(skb);
- msg_set_non_seq(hdr, 1);
- msg_set_mc_netid(hdr, net_id);
- __skb_dequeue(xmitq);
- b->media->send_msg(net, skb, b, &b->bcast_addr);
- }
+ if (unlikely(!b))
+ __skb_queue_purge(xmitq);
+ skb_queue_walk_safe(xmitq, skb, tmp) {
+ hdr = buf_msg(skb);
+ msg_set_non_seq(hdr, 1);
+ msg_set_mc_netid(hdr, net_id);
+ __skb_dequeue(xmitq);
+ b->media->send_msg(net, skb, b, &b->bcast_addr);
}
rcu_read_unlock();
}
@@ -513,24 +517,21 @@ void tipc_bearer_bc_xmit(struct net *net, u32 bearer_id,
* ignores packets sent using interface multicast, and traffic sent to other
* nodes (which can happen if interface is running in promiscuous mode).
*/
-static int tipc_l2_rcv_msg(struct sk_buff *buf, struct net_device *dev,
+static int tipc_l2_rcv_msg(struct sk_buff *skb, struct net_device *dev,
struct packet_type *pt, struct net_device *orig_dev)
{
struct tipc_bearer *b;
rcu_read_lock();
b = rcu_dereference_rtnl(dev->tipc_ptr);
- if (likely(b)) {
- if (likely(buf->pkt_type <= PACKET_BROADCAST)) {
- buf->next = NULL;
- tipc_rcv(dev_net(dev), buf, b);
- rcu_read_unlock();
- return NET_RX_SUCCESS;
- }
+ if (likely(b && (skb->pkt_type <= PACKET_BROADCAST))) {
+ skb->next = NULL;
+ tipc_rcv(dev_net(dev), skb, b);
+ rcu_read_unlock();
+ return NET_RX_SUCCESS;
}
rcu_read_unlock();
-
- kfree_skb(buf);
+ kfree_skb(skb);
return NET_RX_DROP;
}
diff --git a/net/tipc/discover.c b/net/tipc/discover.c
index f1e738e..ad9d477 100644
--- a/net/tipc/discover.c
+++ b/net/tipc/discover.c
@@ -268,10 +268,9 @@ exit:
* Returns 0 if successful, otherwise -errno.
*/
int tipc_disc_create(struct net *net, struct tipc_bearer *b,
- struct tipc_media_addr *dest)
+ struct tipc_media_addr *dest, struct sk_buff **skb)
{
struct tipc_link_req *req;
- struct sk_buff *skb;
req = kmalloc(sizeof(*req), GFP_ATOMIC);
if (!req)
@@ -293,9 +292,7 @@ int tipc_disc_create(struct net *net, struct tipc_bearer *b,
setup_timer(&req->timer, disc_timeout, (unsigned long)req);
mod_timer(&req->timer, jiffies + req->timer_intv);
b->link_req = req;
- skb = skb_clone(req->buf, GFP_ATOMIC);
- if (skb)
- tipc_bearer_xmit_skb(net, req->bearer_id, skb, &req->dest);
+ *skb = skb_clone(req->buf, GFP_ATOMIC);
return 0;
}
diff --git a/net/tipc/discover.h b/net/tipc/discover.h
index c9b1277..b80a335 100644
--- a/net/tipc/discover.h
+++ b/net/tipc/discover.h
@@ -40,7 +40,7 @@
struct tipc_link_req;
int tipc_disc_create(struct net *net, struct tipc_bearer *b_ptr,
- struct tipc_media_addr *dest);
+ struct tipc_media_addr *dest, struct sk_buff **skb);
void tipc_disc_delete(struct tipc_link_req *req);
void tipc_disc_reset(struct net *net, struct tipc_bearer *b_ptr);
void tipc_disc_add_dest(struct tipc_link_req *req);
--
1.9.1
------------------------------------------------------------------------------
^ permalink raw reply related
* [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
* 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
* [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: [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
* 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: [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: [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: 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: [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: [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: [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: [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: [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
* [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
* [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 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 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 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 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
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox