* [PATCH] ipv4: Optimize flow initialization in fib_validate_source().
From: David Miller @ 2011-03-10 4:58 UTC (permalink / raw)
To: netdev
Like in commit 44713b67db10c774f14280c129b0d5fd13c70cf2
("ipv4: Optimize flow initialization in output route lookup."
we can optimize the on-stack flow setup to only initialize
the members which are actually used.
Otherwise we bzero the entire structure, then initialize
explicitly the first half of it.
Signed-off-by: David S. Miller <davem@davemloft.net>
---
net/ipv4/fib_frontend.c | 16 +++++++++-------
1 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index 1d2233c..fe10bcd 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -193,19 +193,21 @@ int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
u32 *itag, u32 mark)
{
struct in_device *in_dev;
- struct flowi fl = {
- .fl4_dst = src,
- .fl4_src = dst,
- .fl4_tos = tos,
- .mark = mark,
- .iif = oif
- };
+ struct flowi fl;
struct fib_result res;
int no_addr, rpf, accept_local;
bool dev_match;
int ret;
struct net *net;
+ fl.oif = 0;
+ fl.iif = oif;
+ fl.mark = mark;
+ fl.fl4_dst = src;
+ fl.fl4_src = dst;
+ fl.fl4_tos = tos;
+ fl.fl4_scope = RT_SCOPE_UNIVERSE;
+
no_addr = rpf = accept_local = 0;
in_dev = __in_dev_get_rcu(dev);
if (in_dev) {
--
1.7.4.1
^ permalink raw reply related
* Re: [PATCH] Make CUBIC Hystart more robust to RTT variations
From: Bill Fink @ 2011-03-10 5:24 UTC (permalink / raw)
To: Lucas Nussbaum
Cc: Injong Rhee, Stephen Hemminger, David Miller, xiyou.wangcong,
netdev, sangtae.ha
In-Reply-To: <20110309065319.GA23740@xanadu.blop.info>
On Wed, 9 Mar 2011, Lucas Nussbaum wrote:
> On 08/03/11 at 20:30 -0500, Injong Rhee wrote:
> > Now, both tools can be wrong. But that is not catastrophic since
> > congestion avoidance can kick in to save the day. In a pipe where no
> > other flows are competing, then exiting slow start too early can
> > slow things down as the window can be still too small. But that is
> > in fact when delays are most reliable. So those tests that say bad
> > performance with hystart are in fact, where hystart is supposed to
> > perform well.
>
> Hi,
>
> In my setup, there is no congestion at all (except the buffer bloat).
> Without Hystart, transferring 8 Gb of data takes 9s, with CUBIC exiting
> slow start at ~2000 packets.
> With Hystart, transferring 8 Gb of data takes 19s, with CUBIC exiting
> slow start at ~20 packets.
> I don't think that this is "hystart performing well". We could just as
> well remove slow start completely, and only do congestion avoidance,
> then.
>
> While I see the value in Hystart, it's clear that there are some flaws
> in the current implementation. It probably makes sense to disable
> hystart by default until those problems are fixed.
Here are some tests I performed across real networks, where
congestion is generally not an issue, with a 2.6.35 kernel on
the transmit side.
8 GB transfer across an 18 ms RTT path with autotuning and hystart:
i7test7% nuttcp -n8g -i1 192.168.1.23
517.9375 MB / 1.00 sec = 4344.6096 Mbps 0 retrans
688.4375 MB / 1.00 sec = 5775.1998 Mbps 0 retrans
692.9375 MB / 1.00 sec = 5812.7462 Mbps 0 retrans
698.0625 MB / 1.00 sec = 5855.8078 Mbps 0 retrans
699.8750 MB / 1.00 sec = 5871.0123 Mbps 0 retrans
710.5625 MB / 1.00 sec = 5960.5707 Mbps 0 retrans
728.8125 MB / 1.00 sec = 6113.7652 Mbps 0 retrans
751.3750 MB / 1.00 sec = 6302.9210 Mbps 0 retrans
783.8750 MB / 1.00 sec = 6575.6201 Mbps 0 retrans
825.1875 MB / 1.00 sec = 6921.8145 Mbps 0 retrans
875.4375 MB / 1.00 sec = 7343.9811 Mbps 0 retrans
8192.0000 MB / 11.26 sec = 6102.4718 Mbps 11 %TX 28 %RX 0 retrans 18.92 msRTT
Ramps up quickly to a little under 6 Gbps, then increases more
slowly to 7+ Gbps, with no TCP retransmissions.
8 GB transfer across an 18 ms RTT path with 40 MB socket buffer and hystart:
i7test7% nuttcp -n8g -w40m -i1 192.168.1.23
970.0625 MB / 1.00 sec = 8136.8475 Mbps 0 retrans
1181.1875 MB / 1.00 sec = 9909.0045 Mbps 0 retrans
1181.2500 MB / 1.00 sec = 9908.6369 Mbps 0 retrans
1181.3125 MB / 1.00 sec = 9909.8747 Mbps 0 retrans
1181.2500 MB / 1.00 sec = 9909.0531 Mbps 0 retrans
1181.2500 MB / 1.00 sec = 9908.8153 Mbps 0 retrans
1181.2500 MB / 1.00 sec = 9909.0729 Mbps 0 retrans
8192.0000 MB / 7.13 sec = 9633.5814 Mbps 17 %TX 42 %RX 0 retrans 18.91 msRTT
Quickly ramps up to full 10-GigE line rate, with no TCP retrans.
8 GB transfer across an 18 ms RTT path with autotuning and no hystart:
i7test7% nuttcp -n8g -i1 192.168.1.23
845.4375 MB / 1.00 sec = 7091.5828 Mbps 0 retrans
1181.3125 MB / 1.00 sec = 9910.0134 Mbps 0 retrans
1181.0625 MB / 1.00 sec = 9907.1830 Mbps 0 retrans
1181.4375 MB / 1.00 sec = 9910.8936 Mbps 0 retrans
1181.1875 MB / 1.00 sec = 9908.1721 Mbps 0 retrans
1181.3125 MB / 1.00 sec = 9909.5774 Mbps 0 retrans
1181.1875 MB / 1.00 sec = 9908.6874 Mbps 0 retrans
8192.0000 MB / 7.25 sec = 9484.4524 Mbps 18 %TX 41 %RX 0 retrans 18.92 msRTT
Also quickly ramps up to full 10-GigE line rate, with no TCP retrans.
8 GB transfer across an 18 ms RTT path with 40 MB socket buffer and no hystart:
i7test7% nuttcp -n8g -w40m -i1 192.168.1.23
969.8750 MB / 1.00 sec = 8135.6571 Mbps 0 retrans
1181.3125 MB / 1.00 sec = 9909.3990 Mbps 0 retrans
1181.2500 MB / 1.00 sec = 9908.9342 Mbps 0 retrans
1181.2500 MB / 1.00 sec = 9909.4098 Mbps 0 retrans
1181.2500 MB / 1.00 sec = 9908.8252 Mbps 0 retrans
1181.2500 MB / 1.00 sec = 9909.0630 Mbps 0 retrans
1181.2500 MB / 1.00 sec = 9909.3504 Mbps 0 retrans
8192.0000 MB / 7.15 sec = 9611.8053 Mbps 18 %TX 42 %RX 0 retrans 18.95 msRTT
Basically the same as the case with 40 MB socket buffer and hystart enabled.
Now trying the same type of tests across an 80 ms RTT path.
8 GB transfer across an 80 ms RTT path with autotuning and hystart:
i7test7% nuttcp -n8g -i1 192.168.1.18
11.3125 MB / 1.00 sec = 94.8954 Mbps 0 retrans
441.5625 MB / 1.00 sec = 3704.1021 Mbps 0 retrans
687.3750 MB / 1.00 sec = 5765.8657 Mbps 0 retrans
715.5625 MB / 1.00 sec = 6002.6273 Mbps 0 retrans
709.9375 MB / 1.00 sec = 5955.5958 Mbps 0 retrans
691.3125 MB / 1.00 sec = 5799.0626 Mbps 0 retrans
718.6250 MB / 1.00 sec = 6028.3538 Mbps 0 retrans
718.0000 MB / 1.00 sec = 6023.0205 Mbps 0 retrans
704.0000 MB / 1.00 sec = 5905.5387 Mbps 0 retrans
733.3125 MB / 1.00 sec = 6151.4096 Mbps 0 retrans
738.8750 MB / 1.00 sec = 6198.2381 Mbps 0 retrans
731.8750 MB / 1.00 sec = 6139.3695 Mbps 0 retrans
8192.0000 MB / 12.85 sec = 5348.9677 Mbps 10 %TX 23 %RX 0 retrans 80.81 msRTT
Similar to the 20 ms RTT path, but achieving somewhat lower
performance levels, presumably due to the larger RTT. Ramps
up fairly quickly to a little under 6 Gbps, then increases
more slowly to 6+ Gbps, with no TCP retransmissions.
8 GB transfer across an 80 ms RTT path with 100 MB socket buffer and hystart:
i7test7% nuttcp -n8g -w100m -i1 192.168.1.18
103.9375 MB / 1.00 sec = 871.8378 Mbps 0 retrans
1086.5625 MB / 1.00 sec = 9114.6102 Mbps 0 retrans
1106.6875 MB / 1.00 sec = 9283.5583 Mbps 0 retrans
1109.3125 MB / 1.00 sec = 9305.5226 Mbps 0 retrans
1111.1875 MB / 1.00 sec = 9321.9596 Mbps 0 retrans
1112.8125 MB / 1.00 sec = 9334.8452 Mbps 0 retrans
1113.6875 MB / 1.00 sec = 9341.6620 Mbps 0 retrans
1120.2500 MB / 1.00 sec = 9398.0054 Mbps 0 retrans
8192.0000 MB / 8.37 sec = 8207.2049 Mbps 16 %TX 38 %RX 0 retrans 80.81 msRTT
Quickly ramps up to 9+ Gbps and then slowly increases further,
with no TCP retrans.
8 GB transfer across an 80 ms RTT path with autotuning and no hystart:
i7test7% nuttcp -n8g -i1 192.168.1.18
11.2500 MB / 1.00 sec = 94.3703 Mbps 0 retrans
519.0625 MB / 1.00 sec = 4354.1596 Mbps 0 retrans
861.2500 MB / 1.00 sec = 7224.7970 Mbps 0 retrans
871.0000 MB / 1.00 sec = 7306.4191 Mbps 0 retrans
860.7500 MB / 1.00 sec = 7220.4438 Mbps 0 retrans
869.0625 MB / 1.00 sec = 7290.3340 Mbps 0 retrans
863.4375 MB / 1.00 sec = 7242.7707 Mbps 0 retrans
860.4375 MB / 1.00 sec = 7218.0606 Mbps 0 retrans
875.5000 MB / 1.00 sec = 7344.3071 Mbps 0 retrans
863.1875 MB / 1.00 sec = 7240.8257 Mbps 0 retrans
8192.0000 MB / 10.98 sec = 6259.4379 Mbps 12 %TX 27 %RX 0 retrans 80.81 msRTT
Ramps up quickly to 7+ Gbps, then appears to stabilize at that
level, with no TCP retransmissions. Performance is somewhat
better than with autotuning enabled, but less than using a
manually set 100 MB socket buffer.
8 GB transfer across an 80 ms RTT path with 100 MB socket buffer and no hystart:
i7test7% nuttcp -n8g -w100m -i1 192.168.1.18
102.8750 MB / 1.00 sec = 862.9487 Mbps 0 retrans
522.8750 MB / 1.00 sec = 4386.2811 Mbps 414 retrans
881.5625 MB / 1.00 sec = 7394.6534 Mbps 0 retrans
1164.3125 MB / 1.00 sec = 9766.6682 Mbps 0 retrans
1170.5625 MB / 1.00 sec = 9819.7042 Mbps 0 retrans
1166.8125 MB / 1.00 sec = 9788.2067 Mbps 0 retrans
1159.8750 MB / 1.00 sec = 9729.1530 Mbps 0 retrans
811.1250 MB / 1.00 sec = 6804.8017 Mbps 21 retrans
73.2500 MB / 1.00 sec = 614.4674 Mbps 0 retrans
884.6250 MB / 1.00 sec = 7420.2900 Mbps 0 retrans
8192.0000 MB / 10.34 sec = 6647.9394 Mbps 13 %TX 31 %RX 435 retrans 80.81 msRTT
Disabling hystart on a large RTT path does not seem to play nice with
a manually specified socket buffer, resulting in TCP retransmissions
that limit the effective network performance.
This is a repeatable but extremely variable phenomenon.
i7test7% nuttcp -n8g -w100m -i1 192.168.1.18
103.7500 MB / 1.00 sec = 870.3015 Mbps 0 retrans
1146.3750 MB / 1.00 sec = 9616.4520 Mbps 0 retrans
1175.9375 MB / 1.00 sec = 9864.6070 Mbps 0 retrans
615.6875 MB / 1.00 sec = 5164.7353 Mbps 21 retrans
139.2500 MB / 1.00 sec = 1168.1253 Mbps 0 retrans
1090.0625 MB / 1.00 sec = 9143.8053 Mbps 0 retrans
1170.4375 MB / 1.00 sec = 9818.6654 Mbps 0 retrans
1174.5625 MB / 1.00 sec = 9852.8754 Mbps 0 retrans
1174.8750 MB / 1.00 sec = 9855.6052 Mbps 0 retrans
8192.0000 MB / 9.42 sec = 7292.9879 Mbps 14 %TX 34 %RX 21 retrans 80.81 msRTT
And:
i7test7% nuttcp -n8g -w100m -i1 192.168.1.18
102.8125 MB / 1.00 sec = 862.4227 Mbps 0 retrans
1148.4375 MB / 1.00 sec = 9633.6860 Mbps 0 retrans
1177.4375 MB / 1.00 sec = 9877.3086 Mbps 0 retrans
1168.1250 MB / 1.00 sec = 9798.9133 Mbps 11 retrans
133.1250 MB / 1.00 sec = 1116.7457 Mbps 0 retrans
479.8750 MB / 1.00 sec = 4025.4631 Mbps 0 retrans
1150.6875 MB / 1.00 sec = 9652.4830 Mbps 0 retrans
1177.3125 MB / 1.00 sec = 9876.0624 Mbps 0 retrans
1177.3750 MB / 1.00 sec = 9876.0139 Mbps 0 retrans
320.2500 MB / 1.00 sec = 2686.6452 Mbps 19 retrans
64.9375 MB / 1.00 sec = 544.7363 Mbps 0 retrans
73.6250 MB / 1.00 sec = 617.6113 Mbps 0 retrans
8192.0000 MB / 12.39 sec = 5545.7570 Mbps 12 %TX 26 %RX 30 retrans 80.80 msRTT
Re-enabling hystart immediately gives a clean test with no TCP retrans.
i7test7% nuttcp -n8g -w100m -i1 192.168.1.18
103.8750 MB / 1.00 sec = 871.3353 Mbps 0 retrans
1086.7500 MB / 1.00 sec = 9116.4474 Mbps 0 retrans
1105.8125 MB / 1.00 sec = 9276.2276 Mbps 0 retrans
1109.4375 MB / 1.00 sec = 9306.5339 Mbps 0 retrans
1111.3125 MB / 1.00 sec = 9322.5327 Mbps 0 retrans
1111.3750 MB / 1.00 sec = 9322.8053 Mbps 0 retrans
1113.7500 MB / 1.00 sec = 9342.8962 Mbps 0 retrans
1120.3125 MB / 1.00 sec = 9397.5711 Mbps 0 retrans
8192.0000 MB / 8.38 sec = 8204.8394 Mbps 16 %TX 39 %RX 0 retrans 80.80 msRTT
-Bill
^ permalink raw reply
* [PATCH net-next-2.6] ipv4: Fix PMTU update.
From: Hiroaki SHIMODA @ 2011-03-10 6:09 UTC (permalink / raw)
To: davem; +Cc: netdev
On current net-next-2.6, when Linux receives ICMP Type: 3, Code: 4
(Destination unreachable (Fragmentation needed)),
icmp_unreach
-> ip_rt_frag_needed
(peer->pmtu_expires is set here)
-> tcp_v4_err
-> do_pmtu_discovery
-> ip_rt_update_pmtu
(peer->pmtu_expires is already set,
so check_peer_pmtu is skipped.)
-> check_peer_pmtu
check_peer_pmtu is skipped and MTU is not updated.
To fix this, let check_peer_pmtu execute unconditionally.
And some minor fixes
1) Avoid potential peer->pmtu_expires set to be zero.
2) In check_peer_pmtu, argument of time_before is reversed.
3) check_peer_pmtu expects peer->pmtu_orig is initialized as zero,
but not initialized.
Signed-off-by: Hiroaki SHIMODA <shimoda.hiroaki@gmail.com>
---
net/ipv4/inetpeer.c | 1 +
net/ipv4/route.c | 22 +++++++++++++++++-----
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c
index 6442c35..86b1d08 100644
--- a/net/ipv4/inetpeer.c
+++ b/net/ipv4/inetpeer.c
@@ -511,6 +511,7 @@ struct inet_peer *inet_getpeer(struct inetpeer_addr *daddr, int create)
p->rate_tokens = 0;
p->rate_last = 0;
p->pmtu_expires = 0;
+ p->pmtu_orig = 0;
memset(&p->redirect_learned, 0, sizeof(p->redirect_learned));
INIT_LIST_HEAD(&p->unused);
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 92a24ea..3cf8001 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1533,9 +1533,15 @@ unsigned short ip_rt_frag_needed(struct net *net, struct iphdr *iph,
if (mtu < ip_rt_min_pmtu)
mtu = ip_rt_min_pmtu;
if (!peer->pmtu_expires || mtu < peer->pmtu_learned) {
+ unsigned long pmtu_expires;
+
+ pmtu_expires = jiffies + ip_rt_mtu_expires;
+ if (!pmtu_expires)
+ pmtu_expires = 1UL;
+
est_mtu = mtu;
peer->pmtu_learned = mtu;
- peer->pmtu_expires = jiffies + ip_rt_mtu_expires;
+ peer->pmtu_expires = pmtu_expires;
}
inet_putpeer(peer);
@@ -1549,7 +1555,7 @@ static void check_peer_pmtu(struct dst_entry *dst, struct inet_peer *peer)
{
unsigned long expires = peer->pmtu_expires;
- if (time_before(expires, jiffies)) {
+ if (time_before(jiffies, expires)) {
u32 orig_dst_mtu = dst_mtu(dst);
if (peer->pmtu_learned < orig_dst_mtu) {
if (!peer->pmtu_orig)
@@ -1574,14 +1580,20 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu)
if (mtu < ip_rt_min_pmtu)
mtu = ip_rt_min_pmtu;
if (!peer->pmtu_expires || mtu < peer->pmtu_learned) {
+ unsigned long pmtu_expires;
+
+ pmtu_expires = jiffies + ip_rt_mtu_expires;
+ if (!pmtu_expires)
+ pmtu_expires = 1UL;
+
peer->pmtu_learned = mtu;
- peer->pmtu_expires = jiffies + ip_rt_mtu_expires;
+ peer->pmtu_expires = pmtu_expires;
atomic_inc(&__rt_peer_genid);
rt->rt_peer_genid = rt_peer_genid();
-
- check_peer_pmtu(dst, peer);
}
+ check_peer_pmtu(dst, peer);
+
inet_putpeer(peer);
}
}
^ permalink raw reply related
* Re: [PATCH] Make CUBIC Hystart more robust to RTT variations
From: Stephen Hemminger @ 2011-03-10 6:17 UTC (permalink / raw)
To: Bill Fink
Cc: Injong Rhee, David Miller, xiyou wangcong, netdev, sangtae ha,
Lucas Nussbaum
In-Reply-To: <20110310002458.5a94f563.billfink@mindspring.com>
Bill what is the HZ in your kernel config.
I am concerned hystart doesn't work well with HZ=100
^ permalink raw reply
* Re: [patch net-next-2.6] net: reinject arps into bonding slave instead of master
From: Jiri Pirko @ 2011-03-10 6:48 UTC (permalink / raw)
To: Nicolas de Pesloüan
Cc: Andy Gospodarek, netdev, davem, shemminger, kaber, fubar,
eric.dumazet
In-Reply-To: <4D77FCC1.5050904@gmail.com>
>But for all others setups, where there exist some net_devices before
>the "untagging" one, you would face some troubles. For example, with
>eth0+eth1 -> br0 -> br0.100, you cannot untag before entering
>__netif_receive_skb. If you do so, the bridge would receive untagged
>frame and if the frame is not for the local host, the bridge would
>forward an untagged frame while it is expected to forward a tagged
>one. Even if the bridge is in a position to know the frame *was*
>tagged, we cannot expect the bridge to do special processing to
>handle this situation. Doing so would break layering.
I disagree.
eth0 -> untag on early __netif_receive_skb (sets up skb->vlan_tci)
->rx_handler of bridge
->br0 -> tag is detected by vlan_tx_tag_present()
-> reinject to __netif_receive_skb with skb->dev == br0.100
This way the flow would be very similar to vlan-hw-accel, am I right?
I have following patch in mind. Note it's raw DRAFT.
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
---
include/linux/if_vlan.h | 5 ++
net/8021q/vlan.c | 8 --
net/8021q/vlan_core.c | 106 +++++++++++++++++++++++++++++
net/8021q/vlan_dev.c | 172 -----------------------------------------------
net/core/dev.c | 18 ++++-
5 files changed, 125 insertions(+), 184 deletions(-)
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
index 635e1fa..dd914e2 100644
--- a/include/linux/if_vlan.h
+++ b/include/linux/if_vlan.h
@@ -133,6 +133,7 @@ extern u16 vlan_dev_vlan_id(const struct net_device *dev);
extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
u16 vlan_tci, int polling);
extern bool vlan_hwaccel_do_receive(struct sk_buff **skb);
+extern void vlan_emulate_hwaccel(struct sk_buff **skbp);
extern gro_result_t
vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
unsigned int vlan_tci, struct sk_buff *skb);
@@ -173,6 +174,10 @@ static inline bool vlan_hwaccel_do_receive(struct sk_buff **skb)
return false;
}
+void vlan_emulate_hwaccel(struct sk_buff **skbp)
+{
+}
+
static inline gro_result_t
vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp,
unsigned int vlan_tci, struct sk_buff *skb)
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 7850412..59f0a9d 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -49,11 +49,6 @@ const char vlan_version[] = DRV_VERSION;
static const char vlan_copyright[] = "Ben Greear <greearb@candelatech.com>";
static const char vlan_buggyright[] = "David S. Miller <davem@redhat.com>";
-static struct packet_type vlan_packet_type __read_mostly = {
- .type = cpu_to_be16(ETH_P_8021Q),
- .func = vlan_skb_recv, /* VLAN receive method */
-};
-
/* End of global variables definitions. */
static void vlan_group_free(struct vlan_group *grp)
@@ -688,7 +683,6 @@ static int __init vlan_proto_init(void)
if (err < 0)
goto err4;
- dev_add_pack(&vlan_packet_type);
vlan_ioctl_set(vlan_ioctl_handler);
return 0;
@@ -709,8 +703,6 @@ static void __exit vlan_cleanup_module(void)
unregister_netdevice_notifier(&vlan_notifier_block);
- dev_remove_pack(&vlan_packet_type);
-
unregister_pernet_subsys(&vlan_net_ops);
rcu_barrier(); /* Wait for completion of call_rcu()'s */
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
index ce8e3ab..c324e4d 100644
--- a/net/8021q/vlan_core.c
+++ b/net/8021q/vlan_core.c
@@ -88,3 +88,109 @@ gro_result_t vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
return napi_gro_frags(napi);
}
EXPORT_SYMBOL(vlan_gro_frags);
+
+static inline struct sk_buff *vlan_check_reorder_header(struct sk_buff *skb)
+{
+ if (vlan_dev_info(skb->dev)->flags & VLAN_FLAG_REORDER_HDR) {
+ if (skb_cow(skb, skb_headroom(skb)) < 0)
+ skb = NULL;
+ if (skb) {
+ /* Lifted from Gleb's VLAN code... */
+ memmove(skb->data - ETH_HLEN,
+ skb->data - VLAN_ETH_HLEN, 12);
+ skb->mac_header += VLAN_HLEN;
+ }
+ }
+
+ return skb;
+}
+
+static inline void vlan_set_encap_proto(struct sk_buff *skb,
+ struct vlan_hdr *vhdr)
+{
+ __be16 proto;
+ unsigned char *rawp;
+
+ /*
+ * Was a VLAN packet, grab the encapsulated protocol, which the layer
+ * three protocols care about.
+ */
+
+ proto = vhdr->h_vlan_encapsulated_proto;
+ if (ntohs(proto) >= 1536) {
+ skb->protocol = proto;
+ return;
+ }
+
+ rawp = skb->data;
+ if (*(unsigned short *)rawp == 0xFFFF)
+ /*
+ * This is a magic hack to spot IPX packets. Older Novell
+ * breaks the protocol design and runs IPX over 802.3 without
+ * an 802.2 LLC layer. We look for FFFF which isn't a used
+ * 802.2 SSAP/DSAP. This won't work for fault tolerant netware
+ * but does for the rest.
+ */
+ skb->protocol = htons(ETH_P_802_3);
+ else
+ /*
+ * Real 802.2 LLC
+ */
+ skb->protocol = htons(ETH_P_802_2);
+}
+
+/*
+ * Determine the packet's protocol ID. The rule here is that we
+ * assume 802.3 if the type field is short enough to be a length.
+ * This is normal practice and works for any 'now in use' protocol.
+ *
+ * Also, at this point we assume that we ARE dealing exclusively with
+ * VLAN packets, or packets that should be made into VLAN packets based
+ * on a default VLAN ID.
+ *
+ * NOTE: Should be similar to ethernet/eth.c.
+ *
+ * SANITY NOTE: This method is called when a packet is moving up the stack
+ * towards userland. To get here, it would have already passed
+ * through the ethernet/eth.c eth_type_trans() method.
+ * SANITY NOTE 2: We are referencing to the VLAN_HDR frields, which MAY be
+ * stored UNALIGNED in the memory. RISC systems don't like
+ * such cases very much...
+ * SANITY NOTE 2a: According to Dave Miller & Alexey, it will always be
+ * aligned, so there doesn't need to be any of the unaligned
+ * stuff. It has been commented out now... --Ben
+ *
+ */
+void vlan_emulate_hwaccel(struct sk_buff **skbp)
+{
+ struct sk_buff *skb = *skbp;
+ struct vlan_hdr *vhdr;
+ u16 vlan_tci;
+
+ *skbp = skb = skb_share_check(skb, GFP_ATOMIC);
+ if (unlikely(!skb))
+ goto err_free;
+
+ if (unlikely(!pskb_may_pull(skb, VLAN_HLEN)))
+ goto err_free;
+
+ vhdr = (struct vlan_hdr *) skb->data;
+ vlan_tci = ntohs(vhdr->h_vlan_TCI);
+ __vlan_hwaccel_put_tag(skb, vlan_tci);
+
+ skb_pull_rcsum(skb, VLAN_HLEN);
+ vlan_set_encap_proto(skb, vhdr);
+
+ skb = vlan_check_reorder_header(skb);
+ if (unlikely(!skb)) {
+ goto err_free;
+ }
+
+ return;
+
+err_free:
+ kfree_skb(skb);
+ *skbp = NULL;
+ return;
+}
+
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
index ae610f0..57d2f40 100644
--- a/net/8021q/vlan_dev.c
+++ b/net/8021q/vlan_dev.c
@@ -65,178 +65,6 @@ static int vlan_dev_rebuild_header(struct sk_buff *skb)
return 0;
}
-static inline struct sk_buff *vlan_check_reorder_header(struct sk_buff *skb)
-{
- if (vlan_dev_info(skb->dev)->flags & VLAN_FLAG_REORDER_HDR) {
- if (skb_cow(skb, skb_headroom(skb)) < 0)
- skb = NULL;
- if (skb) {
- /* Lifted from Gleb's VLAN code... */
- memmove(skb->data - ETH_HLEN,
- skb->data - VLAN_ETH_HLEN, 12);
- skb->mac_header += VLAN_HLEN;
- }
- }
-
- return skb;
-}
-
-static inline void vlan_set_encap_proto(struct sk_buff *skb,
- struct vlan_hdr *vhdr)
-{
- __be16 proto;
- unsigned char *rawp;
-
- /*
- * Was a VLAN packet, grab the encapsulated protocol, which the layer
- * three protocols care about.
- */
-
- proto = vhdr->h_vlan_encapsulated_proto;
- if (ntohs(proto) >= 1536) {
- skb->protocol = proto;
- return;
- }
-
- rawp = skb->data;
- if (*(unsigned short *)rawp == 0xFFFF)
- /*
- * This is a magic hack to spot IPX packets. Older Novell
- * breaks the protocol design and runs IPX over 802.3 without
- * an 802.2 LLC layer. We look for FFFF which isn't a used
- * 802.2 SSAP/DSAP. This won't work for fault tolerant netware
- * but does for the rest.
- */
- skb->protocol = htons(ETH_P_802_3);
- else
- /*
- * Real 802.2 LLC
- */
- skb->protocol = htons(ETH_P_802_2);
-}
-
-/*
- * Determine the packet's protocol ID. The rule here is that we
- * assume 802.3 if the type field is short enough to be a length.
- * This is normal practice and works for any 'now in use' protocol.
- *
- * Also, at this point we assume that we ARE dealing exclusively with
- * VLAN packets, or packets that should be made into VLAN packets based
- * on a default VLAN ID.
- *
- * NOTE: Should be similar to ethernet/eth.c.
- *
- * SANITY NOTE: This method is called when a packet is moving up the stack
- * towards userland. To get here, it would have already passed
- * through the ethernet/eth.c eth_type_trans() method.
- * SANITY NOTE 2: We are referencing to the VLAN_HDR frields, which MAY be
- * stored UNALIGNED in the memory. RISC systems don't like
- * such cases very much...
- * SANITY NOTE 2a: According to Dave Miller & Alexey, it will always be
- * aligned, so there doesn't need to be any of the unaligned
- * stuff. It has been commented out now... --Ben
- *
- */
-int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
- struct packet_type *ptype, struct net_device *orig_dev)
-{
- struct vlan_hdr *vhdr;
- struct vlan_pcpu_stats *rx_stats;
- struct net_device *vlan_dev;
- u16 vlan_id;
- u16 vlan_tci;
-
- skb = skb_share_check(skb, GFP_ATOMIC);
- if (skb == NULL)
- goto err_free;
-
- if (unlikely(!pskb_may_pull(skb, VLAN_HLEN)))
- goto err_free;
-
- vhdr = (struct vlan_hdr *)skb->data;
- vlan_tci = ntohs(vhdr->h_vlan_TCI);
- vlan_id = vlan_tci & VLAN_VID_MASK;
-
- rcu_read_lock();
- vlan_dev = vlan_find_dev(dev, vlan_id);
-
- /* If the VLAN device is defined, we use it.
- * If not, and the VID is 0, it is a 802.1p packet (not
- * really a VLAN), so we will just netif_rx it later to the
- * original interface, but with the skb->proto set to the
- * wrapped proto: we do nothing here.
- */
-
- if (!vlan_dev) {
- if (vlan_id) {
- pr_debug("%s: ERROR: No net_device for VID: %u on dev: %s\n",
- __func__, vlan_id, dev->name);
- goto err_unlock;
- }
- rx_stats = NULL;
- } else {
- skb->dev = vlan_dev;
-
- rx_stats = this_cpu_ptr(vlan_dev_info(skb->dev)->vlan_pcpu_stats);
-
- u64_stats_update_begin(&rx_stats->syncp);
- rx_stats->rx_packets++;
- rx_stats->rx_bytes += skb->len;
-
- skb->priority = vlan_get_ingress_priority(skb->dev, vlan_tci);
-
- pr_debug("%s: priority: %u for TCI: %hu\n",
- __func__, skb->priority, vlan_tci);
-
- switch (skb->pkt_type) {
- case PACKET_BROADCAST:
- /* Yeah, stats collect these together.. */
- /* stats->broadcast ++; // no such counter :-( */
- break;
-
- case PACKET_MULTICAST:
- rx_stats->rx_multicast++;
- break;
-
- case PACKET_OTHERHOST:
- /* Our lower layer thinks this is not local, let's make
- * sure.
- * This allows the VLAN to have a different MAC than the
- * underlying device, and still route correctly.
- */
- if (!compare_ether_addr(eth_hdr(skb)->h_dest,
- skb->dev->dev_addr))
- skb->pkt_type = PACKET_HOST;
- break;
- default:
- break;
- }
- u64_stats_update_end(&rx_stats->syncp);
- }
-
- skb_pull_rcsum(skb, VLAN_HLEN);
- vlan_set_encap_proto(skb, vhdr);
-
- if (vlan_dev) {
- skb = vlan_check_reorder_header(skb);
- if (!skb) {
- rx_stats->rx_errors++;
- goto err_unlock;
- }
- }
-
- netif_rx(skb);
-
- rcu_read_unlock();
- return NET_RX_SUCCESS;
-
-err_unlock:
- rcu_read_unlock();
-err_free:
- atomic_long_inc(&dev->rx_dropped);
- kfree_skb(skb);
- return NET_RX_DROP;
-}
static inline u16
vlan_dev_get_egress_qos_mask(struct net_device *dev, struct sk_buff *skb)
diff --git a/net/core/dev.c b/net/core/dev.c
index 9f66de9..f3315ef 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3133,10 +3133,6 @@ static int __netif_receive_skb(struct sk_buff *skb)
if (netpoll_receive_skb(skb))
return NET_RX_DROP;
- if (!skb->skb_iif)
- skb->skb_iif = skb->dev->ifindex;
- orig_dev = skb->dev;
-
skb_reset_network_header(skb);
skb_reset_transport_header(skb);
skb->mac_len = skb->network_header - skb->mac_header;
@@ -3145,6 +3141,20 @@ static int __netif_receive_skb(struct sk_buff *skb)
rcu_read_lock();
+ if (!skb->skb_iif) {
+ skb->skb_iif = skb->dev->ifindex;
+ /*
+ * frame is here for the first time so lets check if it's vlan
+ * one and emulate vlan hwaccel in that case
+ */
+ if (skb->protocol == cpu_to_be16(ETH_P_8021Q)) {
+ vlan_emulate_hwaccel(&skb);
+ if (!skb)
+ goto out;
+ }
+ }
+ orig_dev = skb->dev;
+
another_round:
__this_cpu_inc(softnet_data.processed);
--
1.7.4
^ permalink raw reply related
* Re: Network performance with small packets - continued
From: Michael S. Tsirkin @ 2011-03-10 6:54 UTC (permalink / raw)
To: Tom Lendacky
Cc: Shirley Ma, Rusty Russell, Krishna Kumar2, David Miller, kvm,
netdev, steved
In-Reply-To: <201103091725.12992.tahm@linux.vnet.ibm.com>
On Wed, Mar 09, 2011 at 05:25:11PM -0600, Tom Lendacky wrote:
> As for which CPU the interrupt gets pinned to, that doesn't matter - see
> below.
So what hurts us the most is that the IRQ jumps between the VCPUs?
^ permalink raw reply
* Re: [PATCH] Make CUBIC Hystart more robust to RTT variations
From: Bill Fink @ 2011-03-10 7:17 UTC (permalink / raw)
To: Stephen Hemminger
Cc: Injong Rhee, David Miller, xiyou wangcong, netdev, sangtae ha,
Lucas Nussbaum
In-Reply-To: <2049243270.17294.1299737824096.JavaMail.root@tahiti.vyatta.com>
On Wed, 9 Mar 2011, Stephen Hemminger wrote:
> Bill what is the HZ in your kernel config.
> I am concerned hystart doesn't work well with HZ=100
HZ=1000
But I did have tcp_timestamps disabled. Should I re-run
the tests with tcp_timestamps enabled?
-Bill
^ permalink raw reply
* [PATCH 1/3 V2] slub: automatically reserve bytes at the end of slab
From: Lai Jiangshan @ 2011-03-10 7:21 UTC (permalink / raw)
To: Ingo Molnar, Pekka Enberg
Cc: Paul E. McKenney, Christoph Lameter, Eric Dumazet,
David S. Miller, Matt Mackall, linux-mm, linux-kernel, netdev
In-Reply-To: <4D6CA843.3090103@cn.fujitsu.com>
There is no "struct" for slub's slab, it shares with struct page.
But struct page is very small, it is insufficient when we need
to add some metadata for slab.
So we add a field "reserved" to struct kmem_cache, when a slab
is allocated, kmem_cache->reserved bytes are automatically reserved
at the end of the slab for slab's metadata.
Changed from v1:
Export the reserved field via sysfs
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
---
include/linux/slub_def.h | 1 +
mm/slub.c | 47 +++++++++++++++++++++++++++++----------------
2 files changed, 31 insertions(+), 17 deletions(-)
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
index 8b6e8ae..ae0093c 100644
--- a/include/linux/slub_def.h
+++ b/include/linux/slub_def.h
@@ -83,6 +83,7 @@ struct kmem_cache {
void (*ctor)(void *);
int inuse; /* Offset to metadata */
int align; /* Alignment */
+ int reserved; /* Reserved bytes at the end of slabs */
unsigned long min_partial;
const char *name; /* Name (only for display!) */
struct list_head list; /* List of slab caches */
diff --git a/mm/slub.c b/mm/slub.c
index e15aa7f..d3d1767 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -281,11 +281,16 @@ static inline int slab_index(void *p, struct kmem_cache *s, void *addr)
return (p - addr) / s->size;
}
+static inline int order_objects(int order, unsigned long size, int reserved)
+{
+ return ((PAGE_SIZE << order) - reserved) / size;
+}
+
static inline struct kmem_cache_order_objects oo_make(int order,
- unsigned long size)
+ unsigned long size, int reserved)
{
struct kmem_cache_order_objects x = {
- (order << OO_SHIFT) + (PAGE_SIZE << order) / size
+ (order << OO_SHIFT) + order_objects(order, size, reserved)
};
return x;
@@ -617,7 +622,7 @@ static int slab_pad_check(struct kmem_cache *s, struct page *page)
return 1;
start = page_address(page);
- length = (PAGE_SIZE << compound_order(page));
+ length = (PAGE_SIZE << compound_order(page)) - s->reserved;
end = start + length;
remainder = length % s->size;
if (!remainder)
@@ -698,7 +703,7 @@ static int check_slab(struct kmem_cache *s, struct page *page)
return 0;
}
- maxobj = (PAGE_SIZE << compound_order(page)) / s->size;
+ maxobj = order_objects(compound_order(page), s->size, s->reserved);
if (page->objects > maxobj) {
slab_err(s, page, "objects %u > max %u",
s->name, page->objects, maxobj);
@@ -748,7 +753,7 @@ static int on_freelist(struct kmem_cache *s, struct page *page, void *search)
nr++;
}
- max_objects = (PAGE_SIZE << compound_order(page)) / s->size;
+ max_objects = order_objects(compound_order(page), s->size, s->reserved);
if (max_objects > MAX_OBJS_PER_PAGE)
max_objects = MAX_OBJS_PER_PAGE;
@@ -1988,13 +1993,13 @@ static int slub_nomerge;
* the smallest order which will fit the object.
*/
static inline int slab_order(int size, int min_objects,
- int max_order, int fract_leftover)
+ int max_order, int fract_leftover, int reserved)
{
int order;
int rem;
int min_order = slub_min_order;
- if ((PAGE_SIZE << min_order) / size > MAX_OBJS_PER_PAGE)
+ if (order_objects(min_order, size, reserved) > MAX_OBJS_PER_PAGE)
return get_order(size * MAX_OBJS_PER_PAGE) - 1;
for (order = max(min_order,
@@ -2003,10 +2008,10 @@ static inline int slab_order(int size, int min_objects,
unsigned long slab_size = PAGE_SIZE << order;
- if (slab_size < min_objects * size)
+ if (slab_size < min_objects * size + reserved)
continue;
- rem = slab_size % size;
+ rem = (slab_size - reserved) % size;
if (rem <= slab_size / fract_leftover)
break;
@@ -2016,7 +2021,7 @@ static inline int slab_order(int size, int min_objects,
return order;
}
-static inline int calculate_order(int size)
+static inline int calculate_order(int size, int reserved)
{
int order;
int min_objects;
@@ -2034,14 +2039,14 @@ static inline int calculate_order(int size)
min_objects = slub_min_objects;
if (!min_objects)
min_objects = 4 * (fls(nr_cpu_ids) + 1);
- max_objects = (PAGE_SIZE << slub_max_order)/size;
+ max_objects = order_objects(slub_max_order, size, reserved);
min_objects = min(min_objects, max_objects);
while (min_objects > 1) {
fraction = 16;
while (fraction >= 4) {
order = slab_order(size, min_objects,
- slub_max_order, fraction);
+ slub_max_order, fraction, reserved);
if (order <= slub_max_order)
return order;
fraction /= 2;
@@ -2053,14 +2058,14 @@ static inline int calculate_order(int size)
* We were unable to place multiple objects in a slab. Now
* lets see if we can place a single object there.
*/
- order = slab_order(size, 1, slub_max_order, 1);
+ order = slab_order(size, 1, slub_max_order, 1, reserved);
if (order <= slub_max_order)
return order;
/*
* Doh this slab cannot be placed using slub_max_order.
*/
- order = slab_order(size, 1, MAX_ORDER, 1);
+ order = slab_order(size, 1, MAX_ORDER, 1, reserved);
if (order < MAX_ORDER)
return order;
return -ENOSYS;
@@ -2311,7 +2316,7 @@ static int calculate_sizes(struct kmem_cache *s, int forced_order)
if (forced_order >= 0)
order = forced_order;
else
- order = calculate_order(size);
+ order = calculate_order(size, s->reserved);
if (order < 0)
return 0;
@@ -2329,8 +2334,8 @@ static int calculate_sizes(struct kmem_cache *s, int forced_order)
/*
* Determine the number of objects per slab
*/
- s->oo = oo_make(order, size);
- s->min = oo_make(get_order(size), size);
+ s->oo = oo_make(order, size, s->reserved);
+ s->min = oo_make(get_order(size), size, s->reserved);
if (oo_objects(s->oo) > oo_objects(s->max))
s->max = s->oo;
@@ -2349,6 +2354,7 @@ static int kmem_cache_open(struct kmem_cache *s,
s->objsize = size;
s->align = align;
s->flags = kmem_cache_flags(size, flags, name, ctor);
+ s->reserved = 0;
if (!calculate_sizes(s, -1))
goto error;
@@ -4017,6 +4023,12 @@ static ssize_t destroy_by_rcu_show(struct kmem_cache *s, char *buf)
}
SLAB_ATTR_RO(destroy_by_rcu);
+static ssize_t reserved_show(struct kmem_cache *s, char *buf)
+{
+ return sprintf(buf, "%d\n", s->reserved);
+}
+SLAB_ATTR_RO(reserved);
+
#ifdef CONFIG_SLUB_DEBUG
static ssize_t slabs_show(struct kmem_cache *s, char *buf)
{
@@ -4303,6 +4315,7 @@ static struct attribute *slab_attrs[] = {
&reclaim_account_attr.attr,
&destroy_by_rcu_attr.attr,
&shrink_attr.attr,
+ &reserved_attr.attr,
#ifdef CONFIG_SLUB_DEBUG
&total_objects_attr.attr,
&slabs_attr.attr,
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply related
* [PATCH 2/3 V2] slub,rcu: don't assume the size of struct rcu_head
From: Lai Jiangshan @ 2011-03-10 7:22 UTC (permalink / raw)
To: Ingo Molnar, Pekka Enberg
Cc: Paul E. McKenney, Christoph Lameter, Eric Dumazet,
David S. Miller, Matt Mackall, linux-mm, linux-kernel, netdev
In-Reply-To: <4D6CA843.3090103@cn.fujitsu.com>
The size of struct rcu_head may be changed. When it becomes larger,
it will pollute the page array.
We reserve some some bytes for struct rcu_head when a slab
is allocated in this situation.
Changed from V1:
use VM_BUG_ON instead BUG_ON
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Acked-by: Christoph Lameter <cl@linux.com>
---
mm/slub.c | 30 +++++++++++++++++++++++++-----
1 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/mm/slub.c b/mm/slub.c
index d3d1767..ebba3eb 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1254,21 +1254,38 @@ static void __free_slab(struct kmem_cache *s, struct page *page)
__free_pages(page, order);
}
+#define need_reserve_slab_rcu \
+ (sizeof(((struct page *)NULL)->lru) < sizeof(struct rcu_head))
+
static void rcu_free_slab(struct rcu_head *h)
{
struct page *page;
- page = container_of((struct list_head *)h, struct page, lru);
+ if (need_reserve_slab_rcu)
+ page = virt_to_head_page(h);
+ else
+ page = container_of((struct list_head *)h, struct page, lru);
+
__free_slab(page->slab, page);
}
static void free_slab(struct kmem_cache *s, struct page *page)
{
if (unlikely(s->flags & SLAB_DESTROY_BY_RCU)) {
- /*
- * RCU free overloads the RCU head over the LRU
- */
- struct rcu_head *head = (void *)&page->lru;
+ struct rcu_head *head;
+
+ if (need_reserve_slab_rcu) {
+ int order = compound_order(page);
+ int offset = (PAGE_SIZE << order) - s->reserved;
+
+ VM_BUG_ON(s->reserved != sizeof(*head));
+ head = page_address(page) + offset;
+ } else {
+ /*
+ * RCU free overloads the RCU head over the LRU
+ */
+ head = (void *)&page->lru;
+ }
call_rcu(head, rcu_free_slab);
} else
@@ -2356,6 +2373,9 @@ static int kmem_cache_open(struct kmem_cache *s,
s->flags = kmem_cache_flags(size, flags, name, ctor);
s->reserved = 0;
+ if (need_reserve_slab_rcu && (s->flags & SLAB_DESTROY_BY_RCU))
+ s->reserved = sizeof(struct rcu_head);
+
if (!calculate_sizes(s, -1))
goto error;
if (disable_higher_order_debug) {
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply related
* [PATCH 3/3 V2] slab,rcu: don't assume the size of struct rcu_head
From: Lai Jiangshan @ 2011-03-10 7:22 UTC (permalink / raw)
To: Pekka Enberg
Cc: Ingo Molnar, Paul E. McKenney, Christoph Lameter, Eric Dumazet,
David S. Miller, Matt Mackall, linux-mm, linux-kernel, netdev
In-Reply-To: <4D6CA843.3090103@cn.fujitsu.com>
The size of struct rcu_head may be changed. When it becomes larger,
it may pollute the data after struct slab.
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
---
diff --git a/mm/slab.c b/mm/slab.c
index 37961d1..52cf0b4 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -191,22 +191,6 @@ typedef unsigned int kmem_bufctl_t;
#define SLAB_LIMIT (((kmem_bufctl_t)(~0U))-3)
/*
- * struct slab
- *
- * Manages the objs in a slab. Placed either at the beginning of mem allocated
- * for a slab, or allocated from an general cache.
- * Slabs are chained into three list: fully used, partial, fully free slabs.
- */
-struct slab {
- struct list_head list;
- unsigned long colouroff;
- void *s_mem; /* including colour offset */
- unsigned int inuse; /* num of objs active in slab */
- kmem_bufctl_t free;
- unsigned short nodeid;
-};
-
-/*
* struct slab_rcu
*
* slab_destroy on a SLAB_DESTROY_BY_RCU cache uses this structure to
@@ -219,8 +203,6 @@ struct slab {
*
* rcu_read_lock before reading the address, then rcu_read_unlock after
* taking the spinlock within the structure expected at that address.
- *
- * We assume struct slab_rcu can overlay struct slab when destroying.
*/
struct slab_rcu {
struct rcu_head head;
@@ -229,6 +211,27 @@ struct slab_rcu {
};
/*
+ * struct slab
+ *
+ * Manages the objs in a slab. Placed either at the beginning of mem allocated
+ * for a slab, or allocated from an general cache.
+ * Slabs are chained into three list: fully used, partial, fully free slabs.
+ */
+struct slab {
+ union {
+ struct {
+ struct list_head list;
+ unsigned long colouroff;
+ void *s_mem; /* including colour offset */
+ unsigned int inuse; /* num of objs active in slab */
+ kmem_bufctl_t free;
+ unsigned short nodeid;
+ };
+ struct slab_rcu __slab_cover_slab_rcu;
+ };
+};
+
+/*
* struct array_cache
*
* Purpose:
--
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply related
* [PATCH] net: add Faraday FTGMAC100 Gigabit Ethernet driver
From: Po-Yu Chuang @ 2011-03-10 8:08 UTC (permalink / raw)
To: netdev; +Cc: linux-kernel, Po-Yu Chuang
From: Po-Yu Chuang <ratbert@faraday-tech.com>
FTGMAC100 Ethernet Media Access Controller supports 10/100/1000 Mbps
and MII/GMII. This driver has been working on some ARM/NDS32 SoC's
including Faraday A369 and Andes AG102.
Signed-off-by: Po-Yu Chuang <ratbert@faraday-tech.com>
---
drivers/net/Kconfig | 9 +
drivers/net/Makefile | 1 +
drivers/net/ftgmac100.c | 1365 +++++++++++++++++++++++++++++++++++++++++++++++
drivers/net/ftgmac100.h | 246 +++++++++
4 files changed, 1621 insertions(+), 0 deletions(-)
create mode 100644 drivers/net/ftgmac100.c
create mode 100644 drivers/net/ftgmac100.h
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 6b12274..b9da914 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -2560,6 +2560,15 @@ config PCH_GBE
to Gigabit Ethernet.
This driver enables Gigabit Ethernet function.
+config FTGMAC100
+ tristate "Faraday FTGMAC100 Gigabit Ethernet support"
+ depends on ARM
+ select PHYLIB
+ help
+ This driver supports the FTGMAC100 Gigabit Ethernet controller
+ from Faraday. It is used on Faraday A369, Andes AG102 and some
+ other ARM/NDS32 SoC's.
+
endif # NETDEV_1000
#
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 7c21711..a349b26 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -147,6 +147,7 @@ obj-$(CONFIG_FORCEDETH) += forcedeth.o
obj-$(CONFIG_NE_H8300) += ne-h8300.o 8390.o
obj-$(CONFIG_AX88796) += ax88796.o
obj-$(CONFIG_BCM63XX_ENET) += bcm63xx_enet.o
+obj-$(CONFIG_FTGMAC100) += ftgmac100.o
obj-$(CONFIG_FTMAC100) += ftmac100.o
obj-$(CONFIG_TSI108_ETH) += tsi108_eth.o
diff --git a/drivers/net/ftgmac100.c b/drivers/net/ftgmac100.c
new file mode 100644
index 0000000..44699a3
--- /dev/null
+++ b/drivers/net/ftgmac100.c
@@ -0,0 +1,1365 @@
+/*
+ * Faraday FTGMAC100 Gigabit Ethernet
+ *
+ * (C) Copyright 2009-2011 Faraday Technology
+ * Po-Yu Chuang <ratbert@faraday-tech.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/dma-mapping.h>
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/phy.h>
+#include <linux/platform_device.h>
+#include <net/ip.h>
+
+#include "ftgmac100.h"
+
+#define DRV_NAME "ftgmac100"
+#define DRV_VERSION "0.6"
+
+#define RX_QUEUE_ENTRIES 256 /* must be power of 2 */
+#define TX_QUEUE_ENTRIES 512 /* must be power of 2 */
+
+#define MAX_PKT_SIZE 1518
+#define RX_BUF_SIZE PAGE_SIZE /* must be smaller than 0x3fff */
+
+/******************************************************************************
+ * private data
+ *****************************************************************************/
+struct ftgmac100_descs {
+ struct ftgmac100_rxdes rxdes[RX_QUEUE_ENTRIES];
+ struct ftgmac100_txdes txdes[TX_QUEUE_ENTRIES];
+};
+
+struct ftgmac100 {
+ struct resource *res;
+ void __iomem *base;
+ int irq;
+
+ struct ftgmac100_descs *descs;
+ dma_addr_t descs_dma_addr;
+
+ unsigned int rx_pointer;
+ unsigned int tx_clean_pointer;
+ unsigned int tx_pointer;
+ unsigned int tx_pending;
+
+ spinlock_t tx_lock;
+
+ struct net_device *netdev;
+ struct device *dev;
+ struct napi_struct napi;
+
+ struct mii_bus *mii_bus;
+ int phy_irq[PHY_MAX_ADDR];
+ struct phy_device *phydev;
+ int old_speed;
+};
+
+static int ftgmac100_alloc_rx_page(struct ftgmac100 *priv,
+ struct ftgmac100_rxdes *rxdes);
+
+/******************************************************************************
+ * internal functions (hardware register access)
+ *****************************************************************************/
+#define INT_MASK_ALL_ENABLED (FTGMAC100_INT_RPKT_LOST | \
+ FTGMAC100_INT_XPKT_ETH | \
+ FTGMAC100_INT_XPKT_LOST | \
+ FTGMAC100_INT_AHB_ERR | \
+ FTGMAC100_INT_PHYSTS_CHG | \
+ FTGMAC100_INT_RPKT_BUF | \
+ FTGMAC100_INT_NO_RXBUF)
+
+static void ftgmac100_set_rx_ring_base(struct ftgmac100 *priv, dma_addr_t addr)
+{
+ iowrite32(addr, priv->base + FTGMAC100_OFFSET_RXR_BADR);
+}
+
+static void ftgmac100_set_rx_buffer_size(struct ftgmac100 *priv,
+ unsigned int size)
+{
+ size = FTGMAC100_RBSR_SIZE(size);
+ iowrite32(size, priv->base + FTGMAC100_OFFSET_RBSR);
+}
+
+static void ftgmac100_set_normal_prio_tx_ring_base(struct ftgmac100 *priv,
+ dma_addr_t addr)
+{
+ iowrite32(addr, priv->base + FTGMAC100_OFFSET_NPTXR_BADR);
+}
+
+static void ftgmac100_txdma_normal_prio_start_polling(struct ftgmac100 *priv)
+{
+ iowrite32(1, priv->base + FTGMAC100_OFFSET_NPTXPD);
+}
+
+static int ftgmac100_reset_hw(struct ftgmac100 *priv)
+{
+ struct net_device *netdev = priv->netdev;
+ int i;
+
+ /* NOTE: reset clears all registers */
+ iowrite32(FTGMAC100_MACCR_SW_RST, priv->base + FTGMAC100_OFFSET_MACCR);
+ for (i = 0; i < 5; i++) {
+ unsigned int maccr;
+
+ maccr = ioread32(priv->base + FTGMAC100_OFFSET_MACCR);
+ if (!(maccr & FTGMAC100_MACCR_SW_RST))
+ return 0;
+
+ usleep_range(1000, 10000);
+ }
+
+ netdev_err(netdev, "software reset failed\n");
+ return -EIO;
+}
+
+static void ftgmac100_set_mac(struct ftgmac100 *priv, const unsigned char *mac)
+{
+ unsigned int maddr = mac[0] << 8 | mac[1];
+ unsigned int laddr = mac[2] << 24 | mac[3] << 16 | mac[4] << 8 | mac[5];
+
+ iowrite32(maddr, priv->base + FTGMAC100_OFFSET_MAC_MADR);
+ iowrite32(laddr, priv->base + FTGMAC100_OFFSET_MAC_LADR);
+}
+
+static void ftgmac100_init_hw(struct ftgmac100 *priv)
+{
+ /* setup ring buffer base registers */
+ ftgmac100_set_rx_ring_base(priv,
+ priv->descs_dma_addr +
+ offsetof(struct ftgmac100_descs, rxdes));
+ ftgmac100_set_normal_prio_tx_ring_base(priv,
+ priv->descs_dma_addr +
+ offsetof(struct ftgmac100_descs, txdes));
+
+ ftgmac100_set_rx_buffer_size(priv, RX_BUF_SIZE);
+
+ iowrite32(FTGMAC100_APTC_RXPOLL_CNT(1), priv->base + FTGMAC100_OFFSET_APTC);
+
+ ftgmac100_set_mac(priv, priv->netdev->dev_addr);
+}
+
+#define MACCR_ENABLE_ALL (FTGMAC100_MACCR_TXDMA_EN | \
+ FTGMAC100_MACCR_RXDMA_EN | \
+ FTGMAC100_MACCR_TXMAC_EN | \
+ FTGMAC100_MACCR_RXMAC_EN | \
+ FTGMAC100_MACCR_FULLDUP | \
+ FTGMAC100_MACCR_CRC_APD | \
+ FTGMAC100_MACCR_RX_RUNT | \
+ FTGMAC100_MACCR_RX_BROADPKT)
+
+static void ftgmac100_start_hw(struct ftgmac100 *priv, int speed)
+{
+ int maccr = MACCR_ENABLE_ALL;
+
+ switch (speed) {
+ default:
+ case 10:
+ break;
+
+ case 100:
+ maccr |= FTGMAC100_MACCR_FAST_MODE;
+ break;
+
+ case 1000:
+ maccr |= FTGMAC100_MACCR_GIGA_MODE;
+ break;
+ }
+
+ iowrite32(maccr, priv->base + FTGMAC100_OFFSET_MACCR);
+}
+
+static void ftgmac100_stop_hw(struct ftgmac100 *priv)
+{
+ iowrite32(0, priv->base + FTGMAC100_OFFSET_MACCR);
+}
+
+/******************************************************************************
+ * internal functions (receive descriptor)
+ *****************************************************************************/
+static bool ftgmac100_rxdes_first_segment(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_FRS);
+}
+
+static bool ftgmac100_rxdes_last_segment(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_LRS);
+}
+
+static bool ftgmac100_rxdes_packet_ready(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RXPKT_RDY);
+}
+
+static void ftgmac100_rxdes_set_dma_own(struct ftgmac100_rxdes *rxdes)
+{
+ /* clear status bits */
+ rxdes->rxdes0 &= cpu_to_le32(FTGMAC100_RXDES0_EDORR);
+}
+
+static bool ftgmac100_rxdes_rx_error(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RX_ERR);
+}
+
+static bool ftgmac100_rxdes_crc_error(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_CRC_ERR);
+}
+
+static bool ftgmac100_rxdes_frame_too_long(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_FTL);
+}
+
+static bool ftgmac100_rxdes_runt(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RUNT);
+}
+
+static bool ftgmac100_rxdes_odd_nibble(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RX_ODD_NB);
+}
+
+static unsigned int ftgmac100_rxdes_data_length(struct ftgmac100_rxdes *rxdes)
+{
+ return le32_to_cpu(rxdes->rxdes0) & FTGMAC100_RXDES0_VDBC;
+}
+
+static bool ftgmac100_rxdes_multicast(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_MULTICAST);
+}
+
+static void ftgmac100_rxdes_set_end_of_ring(struct ftgmac100_rxdes *rxdes)
+{
+ rxdes->rxdes0 |= cpu_to_le32(FTGMAC100_RXDES0_EDORR);
+}
+
+static void ftgmac100_rxdes_set_dma_addr(struct ftgmac100_rxdes *rxdes,
+ dma_addr_t addr)
+{
+ rxdes->rxdes3 = cpu_to_le32(addr);
+}
+
+static dma_addr_t ftgmac100_rxdes_get_dma_addr(struct ftgmac100_rxdes *rxdes)
+{
+ return le32_to_cpu(rxdes->rxdes3);
+}
+
+static bool ftgmac100_rxdes_is_tcp(struct ftgmac100_rxdes *rxdes)
+{
+ return (rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_PROT_MASK)) ==
+ cpu_to_le32(FTGMAC100_RXDES1_PROT_TCPIP);
+}
+
+static bool ftgmac100_rxdes_is_udp(struct ftgmac100_rxdes *rxdes)
+{
+ return (rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_PROT_MASK)) ==
+ cpu_to_le32(FTGMAC100_RXDES1_PROT_UDPIP);
+}
+
+static bool ftgmac100_rxdes_tcpcs_err(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_TCP_CHKSUM_ERR);
+}
+
+static bool ftgmac100_rxdes_udpcs_err(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_UDP_CHKSUM_ERR);
+}
+
+static bool ftgmac100_rxdes_ipcs_err(struct ftgmac100_rxdes *rxdes)
+{
+ return rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_IP_CHKSUM_ERR);
+}
+
+/*
+ * rxdes2 is not used by hardware. We use it to keep track of page.
+ * Since hardware does not touch it, we can skip cpu_to_le32()/le32_to_cpu().
+ */
+static void ftgmac100_rxdes_set_page(struct ftgmac100_rxdes *rxdes, struct page *page)
+{
+ rxdes->rxdes2 = (unsigned int)page;
+}
+
+static struct page *ftgmac100_rxdes_get_page(struct ftgmac100_rxdes *rxdes)
+{
+ return (struct page*)rxdes->rxdes2;
+}
+
+/******************************************************************************
+ * internal functions (receive)
+ *****************************************************************************/
+static int ftgmac100_next_rx_pointer(int pointer)
+{
+ return (pointer + 1) & (RX_QUEUE_ENTRIES - 1);
+}
+
+static void ftgmac100_rx_pointer_advance(struct ftgmac100 *priv)
+{
+ priv->rx_pointer = ftgmac100_next_rx_pointer(priv->rx_pointer);
+}
+
+static struct ftgmac100_rxdes *ftgmac100_current_rxdes(struct ftgmac100 *priv)
+{
+ return &priv->descs->rxdes[priv->rx_pointer];
+}
+
+static struct ftgmac100_rxdes *
+ftgmac100_rx_locate_first_segment(struct ftgmac100 *priv)
+{
+ struct ftgmac100_rxdes *rxdes = ftgmac100_current_rxdes(priv);
+
+ while (ftgmac100_rxdes_packet_ready(rxdes)) {
+ if (ftgmac100_rxdes_first_segment(rxdes))
+ return rxdes;
+
+ ftgmac100_rxdes_set_dma_own(rxdes);
+ ftgmac100_rx_pointer_advance(priv);
+ rxdes = ftgmac100_current_rxdes(priv);
+ }
+
+ return NULL;
+}
+
+static bool ftgmac100_rx_packet_error(struct ftgmac100 *priv,
+ struct ftgmac100_rxdes *rxdes)
+{
+ struct net_device *netdev = priv->netdev;
+ bool error = false;
+
+ if (unlikely(ftgmac100_rxdes_rx_error(rxdes))) {
+ if (net_ratelimit())
+ netdev_info(netdev, "rx err\n");
+
+ netdev->stats.rx_errors++;
+ error = true;
+ }
+
+ if (unlikely(ftgmac100_rxdes_crc_error(rxdes))) {
+ if (net_ratelimit())
+ netdev_info(netdev, "rx crc err\n");
+
+ netdev->stats.rx_crc_errors++;
+ error = true;
+ } else if (unlikely(ftgmac100_rxdes_ipcs_err(rxdes))) {
+ if (net_ratelimit())
+ netdev_info(netdev, "rx IP checksum err\n");
+
+ error = true;
+ }
+
+ if (unlikely(ftgmac100_rxdes_frame_too_long(rxdes))) {
+ if (net_ratelimit())
+ netdev_info(netdev, "rx frame too long\n");
+
+ netdev->stats.rx_length_errors++;
+ error = true;
+ } else if (unlikely(ftgmac100_rxdes_runt(rxdes))) {
+ if (net_ratelimit())
+ netdev_info(netdev, "rx runt\n");
+
+ netdev->stats.rx_length_errors++;
+ error = true;
+ } else if (unlikely(ftgmac100_rxdes_odd_nibble(rxdes))) {
+ if (net_ratelimit())
+ netdev_info(netdev, "rx odd nibble\n");
+
+ netdev->stats.rx_length_errors++;
+ error = true;
+ }
+
+ return error;
+}
+
+static void ftgmac100_rx_drop_packet(struct ftgmac100 *priv)
+{
+ struct net_device *netdev = priv->netdev;
+ struct ftgmac100_rxdes *rxdes = ftgmac100_current_rxdes(priv);
+ bool done = false;
+
+ if (net_ratelimit())
+ netdev_dbg(netdev, "drop packet %p\n", rxdes);
+
+ do {
+ if (ftgmac100_rxdes_last_segment(rxdes))
+ done = true;
+
+ ftgmac100_rxdes_set_dma_own(rxdes);
+ ftgmac100_rx_pointer_advance(priv);
+ rxdes = ftgmac100_current_rxdes(priv);
+ } while (!done && ftgmac100_rxdes_packet_ready(rxdes));
+
+ netdev->stats.rx_dropped++;
+}
+
+static bool ftgmac100_rx_packet(struct ftgmac100 *priv, int *processed)
+{
+ struct net_device *netdev = priv->netdev;
+ struct ftgmac100_rxdes *rxdes;
+ struct sk_buff *skb;
+ bool done = false;
+
+ rxdes = ftgmac100_rx_locate_first_segment(priv);
+ if (!rxdes)
+ return false;
+
+ if (unlikely(ftgmac100_rx_packet_error(priv, rxdes))) {
+ ftgmac100_rx_drop_packet(priv);
+ return true;
+ }
+
+ /* start processing */
+ skb = netdev_alloc_skb_ip_align(netdev, 128);
+ if (unlikely(!skb)) {
+ if (net_ratelimit())
+ netdev_err(netdev, "rx skb alloc failed\n");
+
+ ftgmac100_rx_drop_packet(priv);
+ return true;
+ }
+
+ if (unlikely(ftgmac100_rxdes_multicast(rxdes)))
+ netdev->stats.multicast++;
+
+ /*
+ * It seems that HW does checksum incorrectly with fragmented packets,
+ * so we are conservatively here - if HW checksum error, let software
+ * do the checksum again.
+ */
+ if ((ftgmac100_rxdes_is_tcp(rxdes) && !ftgmac100_rxdes_tcpcs_err(rxdes)) ||
+ (ftgmac100_rxdes_is_udp(rxdes) && !ftgmac100_rxdes_udpcs_err(rxdes)))
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
+
+ do {
+ dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes);
+ struct page *page = ftgmac100_rxdes_get_page(rxdes);
+ unsigned int size;
+
+ dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
+
+ size = ftgmac100_rxdes_data_length(rxdes);
+ skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page, 0, size);
+
+ skb->len += size;
+ skb->data_len += size;
+ skb->truesize += size;
+
+ if (ftgmac100_rxdes_last_segment(rxdes))
+ done = true;
+
+ ftgmac100_alloc_rx_page(priv, rxdes);
+
+ ftgmac100_rx_pointer_advance(priv);
+ rxdes = ftgmac100_current_rxdes(priv);
+ } while (!done);
+
+ __pskb_pull_tail(skb, min(skb->len, 64U));
+ skb->protocol = eth_type_trans(skb, netdev);
+
+ netdev->stats.rx_packets++;
+ netdev->stats.rx_bytes += skb->len;
+
+ /* push packet to protocol stack */
+ netif_receive_skb(skb);
+
+ (*processed)++;
+ return true;
+}
+
+/******************************************************************************
+ * internal functions (transmit descriptor)
+ *****************************************************************************/
+static void ftgmac100_txdes_reset(struct ftgmac100_txdes *txdes)
+{
+ /* clear all except end of ring bit */
+ txdes->txdes0 &= cpu_to_le32(FTGMAC100_TXDES0_EDOTR);
+ txdes->txdes1 = 0;
+ txdes->txdes2 = 0;
+ txdes->txdes3 = 0;
+}
+
+static bool ftgmac100_txdes_owned_by_dma(struct ftgmac100_txdes *txdes)
+{
+ return txdes->txdes0 & cpu_to_le32(FTGMAC100_TXDES0_TXDMA_OWN);
+}
+
+static void ftgmac100_txdes_set_dma_own(struct ftgmac100_txdes *txdes)
+{
+ /*
+ * Make sure dma own bit will not be set before any other
+ * descriptor fields.
+ */
+ wmb();
+ txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_TXDMA_OWN);
+}
+
+static void ftgmac100_txdes_set_end_of_ring(struct ftgmac100_txdes *txdes)
+{
+ txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_EDOTR);
+}
+
+static void ftgmac100_txdes_set_first_segment(struct ftgmac100_txdes *txdes)
+{
+ txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_FTS);
+}
+
+static void ftgmac100_txdes_set_last_segment(struct ftgmac100_txdes *txdes)
+{
+ txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_LTS);
+}
+
+static void ftgmac100_txdes_set_buffer_size(struct ftgmac100_txdes *txdes,
+ unsigned int len)
+{
+ txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_TXBUF_SIZE(len));
+}
+
+static void ftgmac100_txdes_set_txint(struct ftgmac100_txdes *txdes)
+{
+ txdes->txdes1 |= cpu_to_le32(FTGMAC100_TXDES1_TXIC);
+}
+
+static void ftgmac100_txdes_set_tcpcs(struct ftgmac100_txdes *txdes)
+{
+ txdes->txdes1 |= cpu_to_le32(FTGMAC100_TXDES1_TCP_CHKSUM);
+}
+
+static void ftgmac100_txdes_set_udpcs(struct ftgmac100_txdes *txdes)
+{
+ txdes->txdes1 |= cpu_to_le32(FTGMAC100_TXDES1_UDP_CHKSUM);
+}
+
+static void ftgmac100_txdes_set_ipcs(struct ftgmac100_txdes *txdes)
+{
+ txdes->txdes1 |= cpu_to_le32(FTGMAC100_TXDES1_IP_CHKSUM);
+}
+
+static void ftgmac100_txdes_set_dma_addr(struct ftgmac100_txdes *txdes,
+ dma_addr_t addr)
+{
+ txdes->txdes3 = cpu_to_le32(addr);
+}
+
+static dma_addr_t ftgmac100_txdes_get_dma_addr(struct ftgmac100_txdes *txdes)
+{
+ return le32_to_cpu(txdes->txdes3);
+}
+
+/*
+ * txdes2 is not used by hardware. We use it to keep track of socket buffer.
+ * Since hardware does not touch it, we can skip cpu_to_le32()/le32_to_cpu().
+ */
+static void ftgmac100_txdes_set_skb(struct ftgmac100_txdes *txdes,
+ struct sk_buff *skb)
+{
+ txdes->txdes2 = (unsigned int)skb;
+}
+
+static struct sk_buff *ftgmac100_txdes_get_skb(struct ftgmac100_txdes *txdes)
+{
+ return (struct sk_buff *)txdes->txdes2;
+}
+
+/******************************************************************************
+ * internal functions (transmit)
+ *****************************************************************************/
+static int ftgmac100_next_tx_pointer(int pointer)
+{
+ return (pointer + 1) & (TX_QUEUE_ENTRIES - 1);
+}
+
+static void ftgmac100_tx_pointer_advance(struct ftgmac100 *priv)
+{
+ priv->tx_pointer = ftgmac100_next_tx_pointer(priv->tx_pointer);
+}
+
+static void ftgmac100_tx_clean_pointer_advance(struct ftgmac100 *priv)
+{
+ priv->tx_clean_pointer = ftgmac100_next_tx_pointer(priv->tx_clean_pointer);
+}
+
+static struct ftgmac100_txdes *ftgmac100_current_txdes(struct ftgmac100 *priv)
+{
+ return &priv->descs->txdes[priv->tx_pointer];
+}
+
+static struct ftgmac100_txdes *
+ftgmac100_current_clean_txdes(struct ftgmac100 *priv)
+{
+ return &priv->descs->txdes[priv->tx_clean_pointer];
+}
+
+static bool ftgmac100_tx_complete_packet(struct ftgmac100 *priv)
+{
+ struct net_device *netdev = priv->netdev;
+ struct ftgmac100_txdes *txdes;
+ struct sk_buff *skb;
+ dma_addr_t map;
+
+ if (priv->tx_pending == 0)
+ return false;
+
+ txdes = ftgmac100_current_clean_txdes(priv);
+
+ if (ftgmac100_txdes_owned_by_dma(txdes))
+ return false;
+
+ skb = ftgmac100_txdes_get_skb(txdes);
+ map = ftgmac100_txdes_get_dma_addr(txdes);
+
+ netdev->stats.tx_packets++;
+ netdev->stats.tx_bytes += skb->len;
+
+ dma_unmap_single(priv->dev, map, skb_headlen(skb), DMA_TO_DEVICE);
+
+ dev_kfree_skb(skb);
+
+ ftgmac100_txdes_reset(txdes);
+
+ ftgmac100_tx_clean_pointer_advance(priv);
+
+ spin_lock(&priv->tx_lock);
+ priv->tx_pending--;
+ spin_unlock(&priv->tx_lock);
+ netif_wake_queue(netdev);
+
+ return true;
+}
+
+static void ftgmac100_tx_complete(struct ftgmac100 *priv)
+{
+ while (ftgmac100_tx_complete_packet(priv))
+ ;
+}
+
+static int ftgmac100_xmit(struct ftgmac100 *priv, struct sk_buff *skb,
+ dma_addr_t map)
+{
+ struct net_device *netdev = priv->netdev;
+ struct ftgmac100_txdes *txdes;
+ unsigned int len = (skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
+
+ txdes = ftgmac100_current_txdes(priv);
+ ftgmac100_tx_pointer_advance(priv);
+
+ /* setup TX descriptor */
+ ftgmac100_txdes_set_skb(txdes, skb);
+ ftgmac100_txdes_set_dma_addr(txdes, map);
+ ftgmac100_txdes_set_buffer_size(txdes, len);
+
+ ftgmac100_txdes_set_first_segment(txdes);
+ ftgmac100_txdes_set_last_segment(txdes);
+ ftgmac100_txdes_set_txint(txdes);
+ if (skb->ip_summed == CHECKSUM_PARTIAL) {
+ __be16 protocol = skb->protocol;
+
+ if (protocol == cpu_to_be16(ETH_P_IP)) {
+ u8 ip_proto = ip_hdr(skb)->protocol;
+
+ ftgmac100_txdes_set_ipcs(txdes);
+ if (ip_proto == IPPROTO_TCP)
+ ftgmac100_txdes_set_tcpcs(txdes);
+ else if (ip_proto == IPPROTO_UDP)
+ ftgmac100_txdes_set_udpcs(txdes);
+ }
+ }
+
+ spin_lock(&priv->tx_lock);
+ priv->tx_pending++;
+ if (priv->tx_pending == TX_QUEUE_ENTRIES)
+ netif_stop_queue(netdev);
+
+ /* start transmit */
+ ftgmac100_txdes_set_dma_own(txdes);
+ spin_unlock(&priv->tx_lock);
+
+ ftgmac100_txdma_normal_prio_start_polling(priv);
+
+ return NETDEV_TX_OK;
+}
+
+/******************************************************************************
+ * internal functions (buffer)
+ *****************************************************************************/
+static int ftgmac100_alloc_rx_page(struct ftgmac100 *priv,
+ struct ftgmac100_rxdes *rxdes)
+{
+ struct net_device *netdev = priv->netdev;
+ struct page *page;
+ dma_addr_t map;
+
+ page = alloc_page(GFP_KERNEL);
+ if (!page) {
+ if (net_ratelimit())
+ netdev_err(netdev, "failed to allocate rx page\n");
+ return -ENOMEM;
+ }
+
+ map = dma_map_page(priv->dev, page, 0, RX_BUF_SIZE, DMA_FROM_DEVICE);
+ if (unlikely(dma_mapping_error(priv->dev, map))) {
+ if (net_ratelimit())
+ netdev_err(netdev, "failed to map rx page\n");
+ __free_page(page);
+ return -ENOMEM;
+ }
+
+ ftgmac100_rxdes_set_page(rxdes, page);
+ ftgmac100_rxdes_set_dma_addr(rxdes, map);
+ ftgmac100_rxdes_set_dma_own(rxdes);
+ return 0;
+}
+
+static void ftgmac100_free_buffers(struct ftgmac100 *priv)
+{
+ int i;
+
+ for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
+ struct ftgmac100_rxdes *rxdes = &priv->descs->rxdes[i];
+ struct page *page = ftgmac100_rxdes_get_page(rxdes);
+ dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes);
+
+ if (!page)
+ continue;
+
+ dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
+ __free_page(page);
+ }
+
+ for (i = 0; i < TX_QUEUE_ENTRIES; i++) {
+ struct ftgmac100_txdes *txdes = &priv->descs->txdes[i];
+ struct sk_buff *skb = ftgmac100_txdes_get_skb(txdes);
+ dma_addr_t map = ftgmac100_txdes_get_dma_addr(txdes);
+
+ if (!skb)
+ continue;
+
+ dma_unmap_single(priv->dev, map, skb_headlen(skb), DMA_TO_DEVICE);
+ dev_kfree_skb(skb);
+ }
+
+ dma_free_coherent(priv->dev, sizeof(struct ftgmac100_descs),
+ priv->descs, priv->descs_dma_addr);
+}
+
+static int ftgmac100_alloc_buffers(struct ftgmac100 *priv)
+{
+ int i;
+
+ priv->descs = dma_alloc_coherent(priv->dev,
+ sizeof(struct ftgmac100_descs),
+ &priv->descs_dma_addr, GFP_KERNEL);
+ if (!priv->descs)
+ return -ENOMEM;
+
+ memset(priv->descs, 0, sizeof(struct ftgmac100_descs));
+
+ /* initialize RX ring */
+ ftgmac100_rxdes_set_end_of_ring(&priv->descs->rxdes[RX_QUEUE_ENTRIES - 1]);
+
+ for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
+ struct ftgmac100_rxdes *rxdes = &priv->descs->rxdes[i];
+
+ if (ftgmac100_alloc_rx_page(priv, rxdes))
+ goto err;
+ }
+
+ /* initialize TX ring */
+ ftgmac100_txdes_set_end_of_ring(&priv->descs->txdes[TX_QUEUE_ENTRIES - 1]);
+ return 0;
+
+err:
+ ftgmac100_free_buffers(priv);
+ return -ENOMEM;
+}
+
+/******************************************************************************
+ * internal functions (mdio)
+ *****************************************************************************/
+static void ftgmac100_adjust_link(struct net_device *netdev)
+{
+ struct ftgmac100 *priv = netdev_priv(netdev);
+ struct phy_device *phydev = priv->phydev;
+ int ier;
+
+ if (phydev->speed == priv->old_speed)
+ return;
+
+ priv->old_speed = phydev->speed;
+
+ ier = ioread32(priv->base + FTGMAC100_OFFSET_IER);
+
+ /* disable all interrupts */
+ iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
+
+ netif_stop_queue(netdev);
+ ftgmac100_stop_hw(priv);
+
+ netif_start_queue(netdev);
+ ftgmac100_init_hw(priv);
+ ftgmac100_start_hw(priv, phydev->speed);
+
+ /* re-enable interrupts */
+ iowrite32(ier, priv->base + FTGMAC100_OFFSET_IER);
+}
+
+static int ftgmac100_mii_probe(struct ftgmac100 *priv)
+{
+ struct net_device *netdev = priv->netdev;
+ struct phy_device *phydev = NULL;
+ int i;
+
+ /* search for connect PHY device */
+ for (i = 0; i < PHY_MAX_ADDR; i++) {
+ struct phy_device *tmp = priv->mii_bus->phy_map[i];
+
+ if (tmp) {
+ phydev = tmp;
+ break;
+ }
+ }
+
+ /* now we are supposed to have a proper phydev, to attach to... */
+ if (!phydev) {
+ netdev_info(netdev, "%s: no PHY found\n", netdev->name);
+ return -ENODEV;
+ }
+
+ phydev = phy_connect(netdev, dev_name(&phydev->dev),
+ &ftgmac100_adjust_link, 0,
+ PHY_INTERFACE_MODE_GMII);
+
+ if (IS_ERR(phydev)) {
+ netdev_err(netdev, "%s: Could not attach to PHY\n", netdev->name);
+ return PTR_ERR(phydev);
+ }
+
+ priv->phydev = phydev;
+ return 0;
+}
+
+/******************************************************************************
+ * struct mii_bus functions
+ *****************************************************************************/
+static int ftgmac100_mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum)
+{
+ struct net_device *netdev = bus->priv;
+ struct ftgmac100 *priv = netdev_priv(netdev);
+ unsigned int phycr;
+ int i;
+
+ phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
+
+ /* preserve MDC cycle threshold */
+ phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
+
+ phycr |= FTGMAC100_PHYCR_PHYAD(phy_addr) |
+ FTGMAC100_PHYCR_REGAD(regnum) |
+ FTGMAC100_PHYCR_MIIRD;
+
+ iowrite32(phycr, priv->base + FTGMAC100_OFFSET_PHYCR);
+
+ for (i = 0; i < 10; i++) {
+ phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
+
+ if ((phycr & FTGMAC100_PHYCR_MIIRD) == 0) {
+ int data;
+
+ data = ioread32(priv->base + FTGMAC100_OFFSET_PHYDATA);
+ return FTGMAC100_PHYDATA_MIIRDATA(data);
+ }
+
+ usleep_range(100, 1000);
+ }
+
+ netdev_err(netdev, "mdio read timed out\n");
+ return -EIO;
+}
+
+static int ftgmac100_mdiobus_write(struct mii_bus *bus, int phy_addr,
+ int regnum, u16 value)
+{
+ struct net_device *netdev = bus->priv;
+ struct ftgmac100 *priv = netdev_priv(netdev);
+ unsigned int phycr;
+ int data;
+ int i;
+
+ phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
+
+ /* preserve MDC cycle threshold */
+ phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
+
+ phycr |= FTGMAC100_PHYCR_PHYAD(phy_addr) |
+ FTGMAC100_PHYCR_REGAD(regnum) |
+ FTGMAC100_PHYCR_MIIWR;
+
+ data = FTGMAC100_PHYDATA_MIIWDATA(value);
+
+ iowrite32(data, priv->base + FTGMAC100_OFFSET_PHYDATA);
+ iowrite32(phycr, priv->base + FTGMAC100_OFFSET_PHYCR);
+
+ for (i = 0; i < 10; i++) {
+ phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR);
+
+ if ((phycr & FTGMAC100_PHYCR_MIIWR) == 0)
+ return 0;
+
+ usleep_range(100, 1000);
+ }
+
+ netdev_err(netdev, "mdio write timed out\n");
+ return -EIO;
+}
+
+static int ftgmac100_mdiobus_reset(struct mii_bus *bus)
+{
+ return 0;
+}
+
+/******************************************************************************
+ * struct ethtool_ops functions
+ *****************************************************************************/
+static void ftgmac100_get_drvinfo(struct net_device *netdev,
+ struct ethtool_drvinfo *info)
+{
+ strcpy(info->driver, DRV_NAME);
+ strcpy(info->version, DRV_VERSION);
+ strcpy(info->bus_info, dev_name(&netdev->dev));
+}
+
+static int ftgmac100_get_settings(struct net_device *netdev,
+ struct ethtool_cmd *cmd)
+{
+ struct ftgmac100 *priv = netdev_priv(netdev);
+
+ return phy_ethtool_gset(priv->phydev, cmd);
+}
+
+static int ftgmac100_set_settings(struct net_device *netdev,
+ struct ethtool_cmd *cmd)
+{
+ struct ftgmac100 *priv = netdev_priv(netdev);
+
+ return phy_ethtool_sset(priv->phydev, cmd);
+}
+
+static const struct ethtool_ops ftgmac100_ethtool_ops = {
+ .set_settings = ftgmac100_set_settings,
+ .get_settings = ftgmac100_get_settings,
+ .get_drvinfo = ftgmac100_get_drvinfo,
+ .get_link = ethtool_op_get_link,
+};
+
+/******************************************************************************
+ * interrupt handler
+ *****************************************************************************/
+static irqreturn_t ftgmac100_interrupt(int irq, void *dev_id)
+{
+ struct net_device *netdev = dev_id;
+ struct ftgmac100 *priv = netdev_priv(netdev);
+
+ if (likely(netif_running(netdev))) {
+ /* Disable interrupts for polling */
+ iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
+ napi_schedule(&priv->napi);
+ }
+
+ return IRQ_HANDLED;
+}
+
+/******************************************************************************
+ * struct napi_struct functions
+ *****************************************************************************/
+static int ftgmac100_poll(struct napi_struct *napi, int budget)
+{
+ struct ftgmac100 *priv = container_of(napi, struct ftgmac100, napi);
+ struct net_device *netdev = priv->netdev;
+ unsigned int status;
+ bool completed = true;
+ int rx = 0;
+
+ status = ioread32(priv->base + FTGMAC100_OFFSET_ISR);
+ iowrite32(status, priv->base + FTGMAC100_OFFSET_ISR);
+
+ if (status & (FTGMAC100_INT_RPKT_BUF | FTGMAC100_INT_NO_RXBUF)) {
+ /*
+ * FTGMAC100_INT_RPKT_BUF:
+ * RX DMA has received packets into RX buffer successfully
+ *
+ * FTGMAC100_INT_NO_RXBUF:
+ * RX buffer unavailable
+ */
+ bool retry;
+
+ do {
+ retry = ftgmac100_rx_packet(priv, &rx);
+ } while (retry && rx < budget);
+
+ if (retry && rx == budget)
+ completed = false;
+ }
+
+ if (status & (FTGMAC100_INT_XPKT_ETH | FTGMAC100_INT_XPKT_LOST)) {
+ /*
+ * FTGMAC100_INT_XPKT_ETH:
+ * packet transmitted to ethernet successfully
+ *
+ * FTGMAC100_INT_XPKT_LOST:
+ * packet transmitted to ethernet lost due to late
+ * collision or excessive collision
+ */
+ ftgmac100_tx_complete(priv);
+ }
+
+ if (status & (FTGMAC100_INT_NO_RXBUF | FTGMAC100_INT_RPKT_LOST |
+ FTGMAC100_INT_AHB_ERR | FTGMAC100_INT_PHYSTS_CHG)) {
+ if (net_ratelimit())
+ netdev_info(netdev, "[ISR] = 0x%x: %s%s%s%s\n", status,
+ status & FTGMAC100_INT_NO_RXBUF ? "NO_RXBUF " : "",
+ status & FTGMAC100_INT_RPKT_LOST ? "RPKT_LOST " : "",
+ status & FTGMAC100_INT_AHB_ERR ? "AHB_ERR " : "",
+ status & FTGMAC100_INT_PHYSTS_CHG ? "PHYSTS_CHG" : "");
+
+ if (status & FTGMAC100_INT_NO_RXBUF) {
+ /* RX buffer unavailable */
+ netdev->stats.rx_over_errors++;
+ }
+
+ if (status & FTGMAC100_INT_RPKT_LOST) {
+ /* received packet lost due to RX FIFO full */
+ netdev->stats.rx_fifo_errors++;
+ }
+ }
+
+ if (completed) {
+ napi_complete(napi);
+
+ /* enable all interrupts */
+ iowrite32(INT_MASK_ALL_ENABLED, priv->base + FTGMAC100_OFFSET_IER);
+ }
+
+ return rx;
+}
+
+/******************************************************************************
+ * struct net_device_ops functions
+ *****************************************************************************/
+static int ftgmac100_open(struct net_device *netdev)
+{
+ struct ftgmac100 *priv = netdev_priv(netdev);
+ int err;
+
+ err = ftgmac100_alloc_buffers(priv);
+ if (err) {
+ netdev_err(netdev, "failed to allocate buffers\n");
+ goto err_alloc;
+ }
+
+ err = request_irq(priv->irq, ftgmac100_interrupt, 0, netdev->name, netdev);
+ if (err) {
+ netdev_err(netdev, "failed to request irq %d\n", priv->irq);
+ goto err_irq;
+ }
+
+ priv->rx_pointer = 0;
+ priv->tx_clean_pointer = 0;
+ priv->tx_pointer = 0;
+ priv->tx_pending = 0;
+
+ err = ftgmac100_reset_hw(priv);
+ if (err)
+ goto err_hw;
+
+ ftgmac100_init_hw(priv);
+ ftgmac100_start_hw(priv, 10);
+
+ phy_start(priv->phydev);
+
+ napi_enable(&priv->napi);
+ netif_start_queue(netdev);
+
+ /* enable all interrupts */
+ iowrite32(INT_MASK_ALL_ENABLED, priv->base + FTGMAC100_OFFSET_IER);
+ return 0;
+
+err_hw:
+ free_irq(priv->irq, netdev);
+err_irq:
+ ftgmac100_free_buffers(priv);
+err_alloc:
+ return err;
+}
+
+static int ftgmac100_stop(struct net_device *netdev)
+{
+ struct ftgmac100 *priv = netdev_priv(netdev);
+
+ /* disable all interrupts */
+ iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);
+
+ netif_stop_queue(netdev);
+ napi_disable(&priv->napi);
+ phy_stop(priv->phydev);
+
+ ftgmac100_stop_hw(priv);
+ free_irq(priv->irq, netdev);
+ ftgmac100_free_buffers(priv);
+
+ return 0;
+}
+
+static int ftgmac100_hard_start_xmit(struct sk_buff *skb,
+ struct net_device *netdev)
+{
+ struct ftgmac100 *priv = netdev_priv(netdev);
+ dma_addr_t map;
+
+ if (unlikely(skb->len > MAX_PKT_SIZE)) {
+ if (net_ratelimit())
+ netdev_dbg(netdev, "tx packet too big\n");
+
+ netdev->stats.tx_dropped++;
+ dev_kfree_skb(skb);
+ return NETDEV_TX_OK;
+ }
+
+ map = dma_map_single(priv->dev, skb->data, skb_headlen(skb), DMA_TO_DEVICE);
+ if (unlikely(dma_mapping_error(priv->dev, map))) {
+ /* drop packet */
+ if (net_ratelimit())
+ netdev_err(netdev, "map socket buffer failed\n");
+
+ netdev->stats.tx_dropped++;
+ dev_kfree_skb(skb);
+ return NETDEV_TX_OK;
+ }
+
+ return ftgmac100_xmit(priv, skb, map);
+}
+
+/* optional */
+static int ftgmac100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
+{
+ struct ftgmac100 *priv = netdev_priv(netdev);
+
+ return phy_mii_ioctl(priv->phydev, ifr, cmd);
+}
+
+static const struct net_device_ops ftgmac100_netdev_ops = {
+ .ndo_open = ftgmac100_open,
+ .ndo_stop = ftgmac100_stop,
+ .ndo_start_xmit = ftgmac100_hard_start_xmit,
+ .ndo_set_mac_address = eth_mac_addr,
+ .ndo_validate_addr = eth_validate_addr,
+ .ndo_do_ioctl = ftgmac100_do_ioctl,
+};
+
+/******************************************************************************
+ * struct platform_driver functions
+ *****************************************************************************/
+static int ftgmac100_probe(struct platform_device *pdev)
+{
+ struct resource *res;
+ int irq;
+ struct net_device *netdev;
+ struct ftgmac100 *priv;
+ int err;
+ int i;
+
+ if (!pdev)
+ return -ENODEV;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENXIO;
+
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0)
+ return irq;
+
+ /* setup net_device */
+ netdev = alloc_etherdev(sizeof(*priv));
+ if (!netdev) {
+ err = -ENOMEM;
+ goto err_alloc_etherdev;
+ }
+
+ SET_NETDEV_DEV(netdev, &pdev->dev);
+
+ SET_ETHTOOL_OPS(netdev, &ftgmac100_ethtool_ops);
+ netdev->netdev_ops = &ftgmac100_netdev_ops;
+ netdev->features = NETIF_F_IP_CSUM;
+
+ platform_set_drvdata(pdev, netdev);
+
+ /* setup private data */
+ priv = netdev_priv(netdev);
+ priv->netdev = netdev;
+ priv->dev = &pdev->dev;
+
+ spin_lock_init(&priv->tx_lock);
+
+ /* initialize NAPI */
+ netif_napi_add(netdev, &priv->napi, ftgmac100_poll, 64);
+
+ /* map io memory */
+ priv->res = request_mem_region(res->start, resource_size(res),
+ dev_name(&pdev->dev));
+ if (!priv->res) {
+ dev_err(&pdev->dev, "Could not reserve memory region\n");
+ err = -ENOMEM;
+ goto err_req_mem;
+ }
+
+ priv->base = ioremap(res->start, res->end - res->start);
+ if (!priv->base) {
+ dev_err(&pdev->dev, "Failed to ioremap ethernet registers\n");
+ err = -EIO;
+ goto err_ioremap;
+ }
+
+ priv->irq = irq;
+
+ /* initialize mdio bus */
+ priv->mii_bus = mdiobus_alloc();
+ if (!priv->mii_bus) {
+ err = -EIO;
+ goto err_alloc_mdiobus;
+ }
+
+ priv->mii_bus->name = "ftgmac100_mdio";
+ snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "ftgmac100_mii");
+
+ priv->mii_bus->priv = netdev;
+ priv->mii_bus->read = ftgmac100_mdiobus_read;
+ priv->mii_bus->write = ftgmac100_mdiobus_write;
+ priv->mii_bus->reset = ftgmac100_mdiobus_reset;
+ priv->mii_bus->irq = priv->phy_irq;
+
+ for (i = 0; i < PHY_MAX_ADDR; i++)
+ priv->mii_bus->irq[i] = PHY_POLL;
+
+ err = mdiobus_register(priv->mii_bus);
+ if (err) {
+ dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
+ goto err_register_mdiobus;
+ }
+
+ err = ftgmac100_mii_probe(priv);
+ if (err) {
+ dev_err(&pdev->dev, "MII Probe failed!\n");
+ goto err_mii_probe;
+ }
+
+ /* register network device */
+ err = register_netdev(netdev);
+ if (err) {
+ dev_err(&pdev->dev, "Failed to register netdev\n");
+ goto err_register_netdev;
+ }
+
+ netdev_info(netdev, "irq %d, mapped at %p\n", priv->irq, priv->base);
+
+ if (!is_valid_ether_addr(netdev->dev_addr)) {
+ random_ether_addr(netdev->dev_addr);
+ netdev_info(netdev, "generated random MAC address %pM\n",
+ netdev->dev_addr);
+ }
+
+ return 0;
+
+err_register_netdev:
+ phy_disconnect(priv->phydev);
+err_mii_probe:
+ mdiobus_unregister(priv->mii_bus);
+err_register_mdiobus:
+ mdiobus_free(priv->mii_bus);
+err_alloc_mdiobus:
+ iounmap(priv->base);
+err_ioremap:
+ release_resource(priv->res);
+err_req_mem:
+ netif_napi_del(&priv->napi);
+ platform_set_drvdata(pdev, NULL);
+ free_netdev(netdev);
+err_alloc_etherdev:
+ return err;
+}
+
+static int __exit ftgmac100_remove(struct platform_device *pdev)
+{
+ struct net_device *netdev;
+ struct ftgmac100 *priv;
+
+ netdev = platform_get_drvdata(pdev);
+ priv = netdev_priv(netdev);
+
+ unregister_netdev(netdev);
+
+ phy_disconnect(priv->phydev);
+ mdiobus_unregister(priv->mii_bus);
+ mdiobus_free(priv->mii_bus);
+
+ iounmap(priv->base);
+ release_resource(priv->res);
+
+ netif_napi_del(&priv->napi);
+ platform_set_drvdata(pdev, NULL);
+ free_netdev(netdev);
+ return 0;
+}
+
+static struct platform_driver ftgmac100_driver = {
+ .probe = ftgmac100_probe,
+ .remove = __exit_p(ftgmac100_remove),
+ .driver = {
+ .name = DRV_NAME,
+ .owner = THIS_MODULE,
+ },
+};
+
+/******************************************************************************
+ * initialization / finalization
+ *****************************************************************************/
+static int __init ftgmac100_init(void)
+{
+ pr_info("Loading version " DRV_VERSION " ...\n");
+ return platform_driver_register(&ftgmac100_driver);
+}
+
+static void __exit ftgmac100_exit(void)
+{
+ platform_driver_unregister(&ftgmac100_driver);
+}
+
+module_init(ftgmac100_init);
+module_exit(ftgmac100_exit);
+
+MODULE_AUTHOR("Po-Yu Chuang <ratbert@faraday-tech.com>");
+MODULE_DESCRIPTION("FTGMAC100 driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/net/ftgmac100.h b/drivers/net/ftgmac100.h
new file mode 100644
index 0000000..13408d4
--- /dev/null
+++ b/drivers/net/ftgmac100.h
@@ -0,0 +1,246 @@
+/*
+ * Faraday FTGMAC100 Gigabit Ethernet
+ *
+ * (C) Copyright 2009-2011 Faraday Technology
+ * Po-Yu Chuang <ratbert@faraday-tech.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __FTGMAC100_H
+#define __FTGMAC100_H
+
+#define FTGMAC100_OFFSET_ISR 0x00
+#define FTGMAC100_OFFSET_IER 0x04
+#define FTGMAC100_OFFSET_MAC_MADR 0x08
+#define FTGMAC100_OFFSET_MAC_LADR 0x0c
+#define FTGMAC100_OFFSET_MAHT0 0x10
+#define FTGMAC100_OFFSET_MAHT1 0x14
+#define FTGMAC100_OFFSET_NPTXPD 0x18
+#define FTGMAC100_OFFSET_RXPD 0x1c
+#define FTGMAC100_OFFSET_NPTXR_BADR 0x20
+#define FTGMAC100_OFFSET_RXR_BADR 0x24
+#define FTGMAC100_OFFSET_HPTXPD 0x28
+#define FTGMAC100_OFFSET_HPTXR_BADR 0x2c
+#define FTGMAC100_OFFSET_ITC 0x30
+#define FTGMAC100_OFFSET_APTC 0x34
+#define FTGMAC100_OFFSET_DBLAC 0x38
+#define FTGMAC100_OFFSET_DMAFIFOS 0x3c
+#define FTGMAC100_OFFSET_REVR 0x40
+#define FTGMAC100_OFFSET_FEAR 0x44
+#define FTGMAC100_OFFSET_TPAFCR 0x48
+#define FTGMAC100_OFFSET_RBSR 0x4c
+#define FTGMAC100_OFFSET_MACCR 0x50
+#define FTGMAC100_OFFSET_MACSR 0x54
+#define FTGMAC100_OFFSET_TM 0x58
+#define FTGMAC100_OFFSET_PHYCR 0x60
+#define FTGMAC100_OFFSET_PHYDATA 0x64
+#define FTGMAC100_OFFSET_FCR 0x68
+#define FTGMAC100_OFFSET_BPR 0x6c
+#define FTGMAC100_OFFSET_WOLCR 0x70
+#define FTGMAC100_OFFSET_WOLSR 0x74
+#define FTGMAC100_OFFSET_WFCRC 0x78
+#define FTGMAC100_OFFSET_WFBM1 0x80
+#define FTGMAC100_OFFSET_WFBM2 0x84
+#define FTGMAC100_OFFSET_WFBM3 0x88
+#define FTGMAC100_OFFSET_WFBM4 0x8c
+#define FTGMAC100_OFFSET_NPTXR_PTR 0x90
+#define FTGMAC100_OFFSET_HPTXR_PTR 0x94
+#define FTGMAC100_OFFSET_RXR_PTR 0x98
+#define FTGMAC100_OFFSET_TX 0xa0
+#define FTGMAC100_OFFSET_TX_MCOL_SCOL 0xa4
+#define FTGMAC100_OFFSET_TX_ECOL_FAIL 0xa8
+#define FTGMAC100_OFFSET_TX_LCOL_UND 0xac
+#define FTGMAC100_OFFSET_RX 0xb0
+#define FTGMAC100_OFFSET_RX_BC 0xb4
+#define FTGMAC100_OFFSET_RX_MC 0xb8
+#define FTGMAC100_OFFSET_RX_PF_AEP 0xbc
+#define FTGMAC100_OFFSET_RX_RUNT 0xc0
+#define FTGMAC100_OFFSET_RX_CRCER_FTL 0xc4
+#define FTGMAC100_OFFSET_RX_COL_LOST 0xc8
+
+/*
+ * Interrupt status register & interrupt enable register
+ */
+#define FTGMAC100_INT_RPKT_BUF (1 << 0)
+#define FTGMAC100_INT_RPKT_FIFO (1 << 1)
+#define FTGMAC100_INT_NO_RXBUF (1 << 2)
+#define FTGMAC100_INT_RPKT_LOST (1 << 3)
+#define FTGMAC100_INT_XPKT_ETH (1 << 4)
+#define FTGMAC100_INT_XPKT_FIFO (1 << 5)
+#define FTGMAC100_INT_NO_NPTXBUF (1 << 6)
+#define FTGMAC100_INT_XPKT_LOST (1 << 7)
+#define FTGMAC100_INT_AHB_ERR (1 << 8)
+#define FTGMAC100_INT_PHYSTS_CHG (1 << 9)
+#define FTGMAC100_INT_NO_HPTXBUF (1 << 10)
+
+/*
+ * Interrupt timer control register
+ */
+#define FTGMAC100_ITC_RXINT_CNT(x) (((x) & 0xf) << 0)
+#define FTGMAC100_ITC_RXINT_THR(x) (((x) & 0x7) << 4)
+#define FTGMAC100_ITC_RXINT_TIME_SEL (1 << 7)
+#define FTGMAC100_ITC_TXINT_CNT(x) (((x) & 0xf) << 8)
+#define FTGMAC100_ITC_TXINT_THR(x) (((x) & 0x7) << 12)
+#define FTGMAC100_ITC_TXINT_TIME_SEL (1 << 15)
+
+/*
+ * Automatic polling timer control register
+ */
+#define FTGMAC100_APTC_RXPOLL_CNT(x) (((x) & 0xf) << 0)
+#define FTGMAC100_APTC_RXPOLL_TIME_SEL (1 << 4)
+#define FTGMAC100_APTC_TXPOLL_CNT(x) (((x) & 0xf) << 8)
+#define FTGMAC100_APTC_TXPOLL_TIME_SEL (1 << 12)
+
+/*
+ * DMA burst length and arbitration control register
+ */
+#define FTGMAC100_DBLAC_RXFIFO_LTHR(x) (((x) & 0x7) << 0)
+#define FTGMAC100_DBLAC_RXFIFO_HTHR(x) (((x) & 0x7) << 3)
+#define FTGMAC100_DBLAC_RX_THR_EN (1 << 6)
+#define FTGMAC100_DBLAC_RXBURST_SIZE(x) (((x) & 0x3) << 8)
+#define FTGMAC100_DBLAC_TXBURST_SIZE(x) (((x) & 0x3) << 10)
+#define FTGMAC100_DBLAC_RXDES_SIZE(x) (((x) & 0xf) << 12)
+#define FTGMAC100_DBLAC_TXDES_SIZE(x) (((x) & 0xf) << 16)
+#define FTGMAC100_DBLAC_IFG_CNT(x) (((x) & 0x7) << 20)
+#define FTGMAC100_DBLAC_IFG_INC (1 << 23)
+
+/*
+ * DMA FIFO status register
+ */
+#define FTGMAC100_DMAFIFOS_RXDMA1_SM(dmafifos) ((dmafifos) & 0xf)
+#define FTGMAC100_DMAFIFOS_RXDMA2_SM(dmafifos) (((dmafifos) >> 4) & 0xf)
+#define FTGMAC100_DMAFIFOS_RXDMA3_SM(dmafifos) (((dmafifos) >> 8) & 0x7)
+#define FTGMAC100_DMAFIFOS_TXDMA1_SM(dmafifos) (((dmafifos) >> 12) & 0xf)
+#define FTGMAC100_DMAFIFOS_TXDMA2_SM(dmafifos) (((dmafifos) >> 16) & 0x3)
+#define FTGMAC100_DMAFIFOS_TXDMA3_SM(dmafifos) (((dmafifos) >> 18) & 0xf)
+#define FTGMAC100_DMAFIFOS_RXFIFO_EMPTY (1 << 26)
+#define FTGMAC100_DMAFIFOS_TXFIFO_EMPTY (1 << 27)
+#define FTGMAC100_DMAFIFOS_RXDMA_GRANT (1 << 28)
+#define FTGMAC100_DMAFIFOS_TXDMA_GRANT (1 << 29)
+#define FTGMAC100_DMAFIFOS_RXDMA_REQ (1 << 30)
+#define FTGMAC100_DMAFIFOS_TXDMA_REQ (1 << 31)
+
+/*
+ * Receive buffer size register
+ */
+#define FTGMAC100_RBSR_SIZE(x) ((x) & 0x3fff)
+
+/*
+ * MAC control register
+ */
+#define FTGMAC100_MACCR_TXDMA_EN (1 << 0)
+#define FTGMAC100_MACCR_RXDMA_EN (1 << 1)
+#define FTGMAC100_MACCR_TXMAC_EN (1 << 2)
+#define FTGMAC100_MACCR_RXMAC_EN (1 << 3)
+#define FTGMAC100_MACCR_RM_VLAN (1 << 4)
+#define FTGMAC100_MACCR_HPTXR_EN (1 << 5)
+#define FTGMAC100_MACCR_LOOP_EN (1 << 6)
+#define FTGMAC100_MACCR_ENRX_IN_HALFTX (1 << 7)
+#define FTGMAC100_MACCR_FULLDUP (1 << 8)
+#define FTGMAC100_MACCR_GIGA_MODE (1 << 9)
+#define FTGMAC100_MACCR_CRC_APD (1 << 10)
+#define FTGMAC100_MACCR_RX_RUNT (1 << 12)
+#define FTGMAC100_MACCR_JUMBO_LF (1 << 13)
+#define FTGMAC100_MACCR_RX_ALL (1 << 14)
+#define FTGMAC100_MACCR_HT_MULTI_EN (1 << 15)
+#define FTGMAC100_MACCR_RX_MULTIPKT (1 << 16)
+#define FTGMAC100_MACCR_RX_BROADPKT (1 << 17)
+#define FTGMAC100_MACCR_DISCARD_CRCERR (1 << 18)
+#define FTGMAC100_MACCR_FAST_MODE (1 << 19)
+#define FTGMAC100_MACCR_SW_RST (1 << 31)
+
+/*
+ * PHY control register
+ */
+#define FTGMAC100_PHYCR_MDC_CYCTHR_MASK 0x3f
+#define FTGMAC100_PHYCR_MDC_CYCTHR(x) ((x) & 0x3f)
+#define FTGMAC100_PHYCR_PHYAD(x) (((x) & 0x1f) << 16)
+#define FTGMAC100_PHYCR_REGAD(x) (((x) & 0x1f) << 21)
+#define FTGMAC100_PHYCR_MIIRD (1 << 26)
+#define FTGMAC100_PHYCR_MIIWR (1 << 27)
+
+/*
+ * PHY data register
+ */
+#define FTGMAC100_PHYDATA_MIIWDATA(x) ((x) & 0xffff)
+#define FTGMAC100_PHYDATA_MIIRDATA(phydata) (((phydata) >> 16) & 0xffff)
+
+/*
+ * Transmit descriptor, aligned to 16 bytes
+ */
+struct ftgmac100_txdes {
+ unsigned int txdes0;
+ unsigned int txdes1;
+ unsigned int txdes2; /* not used by HW */
+ unsigned int txdes3; /* TXBUF_BADR */
+} __attribute__ ((aligned(16)));
+
+#define FTGMAC100_TXDES0_TXBUF_SIZE(x) ((x) & 0x3fff)
+#define FTGMAC100_TXDES0_EDOTR (1 << 15)
+#define FTGMAC100_TXDES0_CRC_ERR (1 << 19)
+#define FTGMAC100_TXDES0_LTS (1 << 28)
+#define FTGMAC100_TXDES0_FTS (1 << 29)
+#define FTGMAC100_TXDES0_TXDMA_OWN (1 << 31)
+
+#define FTGMAC100_TXDES1_VLANTAG_CI(x) ((x) & 0xffff)
+#define FTGMAC100_TXDES1_INS_VLANTAG (1 << 16)
+#define FTGMAC100_TXDES1_TCP_CHKSUM (1 << 17)
+#define FTGMAC100_TXDES1_UDP_CHKSUM (1 << 18)
+#define FTGMAC100_TXDES1_IP_CHKSUM (1 << 19)
+#define FTGMAC100_TXDES1_LLC (1 << 22)
+#define FTGMAC100_TXDES1_TX2FIC (1 << 30)
+#define FTGMAC100_TXDES1_TXIC (1 << 31)
+
+/*
+ * Receive descriptor, aligned to 16 bytes
+ */
+struct ftgmac100_rxdes {
+ unsigned int rxdes0;
+ unsigned int rxdes1;
+ unsigned int rxdes2; /* not used by HW */
+ unsigned int rxdes3; /* RXBUF_BADR */
+} __attribute__ ((aligned(16)));
+
+#define FTGMAC100_RXDES0_VDBC 0x3fff
+#define FTGMAC100_RXDES0_EDORR (1 << 15)
+#define FTGMAC100_RXDES0_MULTICAST (1 << 16)
+#define FTGMAC100_RXDES0_BROADCAST (1 << 17)
+#define FTGMAC100_RXDES0_RX_ERR (1 << 18)
+#define FTGMAC100_RXDES0_CRC_ERR (1 << 19)
+#define FTGMAC100_RXDES0_FTL (1 << 20)
+#define FTGMAC100_RXDES0_RUNT (1 << 21)
+#define FTGMAC100_RXDES0_RX_ODD_NB (1 << 22)
+#define FTGMAC100_RXDES0_FIFO_FULL (1 << 23)
+#define FTGMAC100_RXDES0_PAUSE_OPCODE (1 << 24)
+#define FTGMAC100_RXDES0_PAUSE_FRAME (1 << 25)
+#define FTGMAC100_RXDES0_LRS (1 << 28)
+#define FTGMAC100_RXDES0_FRS (1 << 29)
+#define FTGMAC100_RXDES0_RXPKT_RDY (1 << 31)
+
+#define FTGMAC100_RXDES1_VLANTAG_CI 0xffff
+#define FTGMAC100_RXDES1_PROT_MASK (0x3 << 20)
+#define FTGMAC100_RXDES1_PROT_NONIP (0x0 << 20)
+#define FTGMAC100_RXDES1_PROT_IP (0x1 << 20)
+#define FTGMAC100_RXDES1_PROT_TCPIP (0x2 << 20)
+#define FTGMAC100_RXDES1_PROT_UDPIP (0x3 << 20)
+#define FTGMAC100_RXDES1_LLC (1 << 22)
+#define FTGMAC100_RXDES1_DF (1 << 23)
+#define FTGMAC100_RXDES1_VLANTAG_AVAIL (1 << 24)
+#define FTGMAC100_RXDES1_TCP_CHKSUM_ERR (1 << 25)
+#define FTGMAC100_RXDES1_UDP_CHKSUM_ERR (1 << 26)
+#define FTGMAC100_RXDES1_IP_CHKSUM_ERR (1 << 27)
+
+#endif /* __FTGMAC100_H */
--
1.6.3.3
^ permalink raw reply related
* Re: [PATCH] tcp: mark tcp_congestion_ops read_mostly
From: David Miller @ 2011-03-10 8:40 UTC (permalink / raw)
To: shemminger; +Cc: dada1, netdev
In-Reply-To: <20110309160220.1a2db73e@nehalam>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 9 Mar 2011 16:02:20 -0800
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Applied, thanks Stephen.
^ permalink raw reply
* Re: Bug inkvm_set_irq
From: Jean-Philippe Menil @ 2011-03-10 8:42 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: netdev, kvm, virtualization
In-Reply-To: <20110309135918.GA31019@redhat.com>
Le 09/03/2011 14:59, Michael S. Tsirkin a écrit :
> On Wed, Mar 09, 2011 at 02:12:58PM +0100, Jean-Philippe Menil wrote:
>> Le 09/03/2011 14:00, Michael S. Tsirkin a écrit :
>>> On Wed, Mar 09, 2011 at 01:28:43PM +0100, Jean-Philippe Menil wrote:
>>>> Le 08/03/2011 12:13, Michael S. Tsirkin a écrit :
>>>>> On Fri, Mar 04, 2011 at 10:39:05AM +0100, Jean-Philippe Menil wrote:
>>>>>> Yes, it's a 2.6.37.2 kernel.
>>>>> OK, here's a debugging patch.
>>>>> Please run with slab debugging as previously until you see
>>>>> 'eventfd bug detected!' in dmesg or until there is a crash.
>>>>> It might be also useful to enable timestampts on printk with
>>>>> Symbol: PRINTK_TIME [=y]
>>>>> │ Type : boolean
>>>>> │ Prompt: Show timing information on printks
>>>>>
>>>>> once you see the error, please upload the
>>>>> full dmesg output somewhere to we can track what
>>>>> goes on.
>>>>>
>>>>> Hopefully there won't be an oops this time which
>>>>> should make it easier for you to test (no need to
>>>>> reboot).
>>>>>
>>>>>
>>>>> diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
>>>>> index c1f1e3c..3cb679b 100644
>>>>> --- a/virt/kvm/eventfd.c
>>>>> +++ b/virt/kvm/eventfd.c
>>>>> @@ -32,6 +32,7 @@
>>>>> #include<linux/eventfd.h>
>>>>> #include<linux/kernel.h>
>>>>> #include<linux/slab.h>
>>>>> +#include<linux/nmi.h>
>>>>>
>>>>> #include "iodev.h"
>>>>>
>>>>> @@ -43,6 +44,8 @@
>>>>> * --------------------------------------------------------------------
>>>>> */
>>>>>
>>>>> +#define KVM_BAD_PTR ((void*)(long)(0x6b6b6b6b6b6b6b6bull))
>>>>> +
>>>>> struct _irqfd {
>>>>> struct kvm *kvm;
>>>>> struct eventfd_ctx *eventfd;
>>>>> @@ -61,6 +64,13 @@ irqfd_inject(struct work_struct *work)
>>>>> {
>>>>> struct _irqfd *irqfd = container_of(work, struct _irqfd, inject);
>>>>> struct kvm *kvm = irqfd->kvm;
>>>>> + if (kvm == KVM_BAD_PTR) {
>>>>> + printk(KERN_ERR "Eventfd bug detected!\n");
>>>>> + printk(KERN_ERR "%s(work=%p,irqfd=%p,kvm=%p,gsi=%d)\n", __func__,
>>>>> + work, irqfd, kvm, irqfd->gsi);
>>>>> + trigger_all_cpu_backtrace();
>>>>> + return;
>>>>> + }
>>>>>
>>>>> kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, irqfd->gsi, 1);
>>>>> kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, irqfd->gsi, 0);
>>>>> @@ -75,6 +85,8 @@ irqfd_shutdown(struct work_struct *work)
>>>>> struct _irqfd *irqfd = container_of(work, struct _irqfd, shutdown);
>>>>> u64 cnt;
>>>>>
>>>>> + printk(KERN_ERR "%s(work=%p,irqfd=%p,kvm=%p, gsi=%d)\n", __func__,
>>>>> + work, irqfd, irqfd->kvm, irqfd->gsi);
>>>>> /*
>>>>> * Synchronize with the wait-queue and unhook ourselves to prevent
>>>>> * further events.
>>>>> @@ -91,6 +103,8 @@ irqfd_shutdown(struct work_struct *work)
>>>>> * It is now safe to release the object's resources
>>>>> */
>>>>> eventfd_ctx_put(irqfd->eventfd);
>>>>> + printk(KERN_ERR "kfree at %s(work=%p,irqfd=%p)\n", __func__,
>>>>> + work, irqfd);
>>>>> kfree(irqfd);
>>>>> }
>>>>>
>>>>> @@ -111,6 +125,8 @@ static void
>>>>> irqfd_deactivate(struct _irqfd *irqfd)
>>>>> {
>>>>> BUG_ON(!irqfd_is_active(irqfd));
>>>>> + printk(KERN_ERR "%s(irqfd=%p,kvm=%p, gsi=%d)\n", __func__,
>>>>> + irqfd, irqfd->kvm, irqfd->gsi);
>>>>>
>>>>> list_del_init(&irqfd->list);
>>>>>
>>>>> @@ -178,6 +194,8 @@ kvm_irqfd_assign(struct kvm *kvm, int fd, int gsi)
>>>>>
>>>>> irqfd->kvm = kvm;
>>>>> irqfd->gsi = gsi;
>>>>> + printk(KERN_ERR "%s(irqfd=%p,kvm=%p, gsi=%d)\n", __func__,
>>>>> + irqfd, kvm, gsi);
>>>>> INIT_LIST_HEAD(&irqfd->list);
>>>>> INIT_WORK(&irqfd->inject, irqfd_inject);
>>>>> INIT_WORK(&irqfd->shutdown, irqfd_shutdown);
>>>>> @@ -264,6 +282,8 @@ kvm_irqfd_deassign(struct kvm *kvm, int fd, int gsi)
>>>>> struct _irqfd *irqfd, *tmp;
>>>>> struct eventfd_ctx *eventfd;
>>>>>
>>>>> + printk(KERN_ERR "%s(kvm=%p, gsi=%d)\n", __func__,
>>>>> + kvm, gsi);
>>>>> eventfd = eventfd_ctx_fdget(fd);
>>>>> if (IS_ERR(eventfd))
>>>>> return PTR_ERR(eventfd);
>>>>> @@ -305,6 +325,7 @@ void
>>>>> kvm_irqfd_release(struct kvm *kvm)
>>>>> {
>>>>> struct _irqfd *irqfd, *tmp;
>>>>> + printk(KERN_ERR "%s(kvm=%p)\n", __func__, kvm);
>>>>>
>>>>> spin_lock_irq(&kvm->irqfds.lock);
>>>>>
>>>>> --
>>>>> To unsubscribe from this list: send the line "unsubscribe netdev" in
>>>>> the body of a message to majordomo@vger.kernel.org
>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>> Hi,
>>>>
>>>> I boot the host with the patched kernel yesterday.
>>>> No crach until now, but two "Eventfd bug detected!" in the log at
>>>> "Mar 9 02:04:31" and "Mar 9 02:15:17"
>>>> You can find part of the log at the following adress:
>>>> http://filex.univ-nantes.fr/get?k=jL4Fe7yfSMN57toAH7V
>>>>
>>>> It a split file of the kern.log (1,4G), so if you need another part
>>>> of the log, let me know.
>>>>
>>>> Thanks for all.
>>>>
>>>> Regards.
>>> Downloading, it's big :)
>>> What about some 1000 lines before and after Eventfd bug detected! line?
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe kvm" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>> Yes, sorry about that.
>> I could have split my log into a smaller file.
>>
>> I was a little afraid of not transmit enough informations, and i was
>> a bit wide.
>> I hope you can find usefull trace anyway.
>>
>> Regards.
>
> OK, use after free.
>
>
> Mar 9 02:15:17 ayrshire.u06.univ-nantes.prive kernel: [37461.593681]
> kvm_irqfd_assign(irqfd=ffff88045e8d6230,kvm=ffff88085151c000, gsi=26)
> Mar 9 02:15:17 ayrshire.u06.univ-nantes.prive kernel: [37461.605359]
> kvm_irqfd_deassign(kvm=ffff88085151c000, gsi=26)
> Mar 9 02:15:17 ayrshire.u06.univ-nantes.prive kernel: [37461.605388]
> irqfd_deactivate(irqfd=ffff88045e8d6230,kvm=ffff88085151c000, gsi=26)
> Mar 9 02:15:17 ayrshire.u06.univ-nantes.prive kernel: [37461.605461]
> irqfd_shutdown(work=ffff88045e8d62b0,irqfd=ffff88045e8d6230,kvm=ffff88085151c000,
> gsi=26)
> Mar 9 02:15:17 ayrshire.u06.univ-nantes.prive kernel: [37461.605509]
> kfree at irqfd_shutdown(work=ffff88045e8d62b0,irqfd=ffff88045e8d6230)
> Mar 9 02:15:17 ayrshire.u06.univ-nantes.prive kernel: [37461.605588]
> Eventfd bug detected!
> Mar 9 02:15:17 ayrshire.u06.univ-nantes.prive kernel: [37461.605612]
> irqfd_inject(work=ffff88045e8d6290,irqfd=ffff88045e8d6230,kvm=6b6b6b6b6b6b6b6b,gsi=1802201963)
>
>
> and 1802201963 is also 6b6b6b6b.
>
>
> I suspect that somehow, we get an event from eventfd even
> though we did eventfd_ctx_remove_wait_queue.
> Could you please try the following patch on top?
> When you see Eventfd bug or Wakeup bug, paste some
> last lines.
> For the full log file - better compress with xz.
>
>
> diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
> index 3cb679b..63aeba5 100644
> --- a/virt/kvm/eventfd.c
> +++ b/virt/kvm/eventfd.c
> @@ -92,6 +92,8 @@ irqfd_shutdown(struct work_struct *work)
> * further events.
> */
> eventfd_ctx_remove_wait_queue(irqfd->eventfd,&irqfd->wait,&cnt);
> + printk(KERN_ERR "remove wq at %s(work=%p,irqfd=%p)\n", __func__,
> + work, irqfd);
>
> /*
> * We know no new events will be scheduled at this point, so block
> @@ -142,6 +144,13 @@ irqfd_wakeup(wait_queue_t *wait, unsigned mode, int sync, void *key)
> struct _irqfd *irqfd = container_of(wait, struct _irqfd, wait);
> unsigned long flags = (unsigned long)key;
>
> + if (irqfd->kvm == KVM_BAD_PTR) {
> + printk(KERN_ERR "Wakeup bug detected! flags 0x%lx\n", flags);
> + printk(KERN_ERR "%s(work=%p,irqfd=%p,kvm=%p,gsi=%d)\n", __func__,
> + &irqfd->inject, irqfd, irqfd->kvm, irqfd->gsi);
> + trigger_all_cpu_backtrace();
> + return 0;
> + }
> if (flags& POLLIN)
> /* An event has been signaled, inject an interrupt */
> schedule_work(&irqfd->inject);
> @@ -153,6 +162,9 @@ irqfd_wakeup(wait_queue_t *wait, unsigned mode, int sync, void *key)
>
> spin_lock_irqsave(&kvm->irqfds.lock, flags);
>
> + printk(KERN_ERR "%s(work=%p,irqfd=%p,kvm=%p,gsi=%d,active=%d)\n", __func__,
> + &irqfd->inject, irqfd, irqfd->kvm, irqfd->gsi,
> + irqfd_is_active(irqfd));
> /*
> * We must check if someone deactivated the irqfd before
> * we could acquire the irqfds.lock since the item is
>
Hi,
I noted seven "Eventfd bug detected" events during the night, and only
one Wakeup event:
fifth.ah:Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel:
[44867.105868] Eventfd bug detected!
first.ad:Mar 10 01:08:15 ayrshire.u06.univ-nantes.prive kernel:
[34729.771260] Eventfd bug detected!
fourth.ad:Mar 10 02:54:41 ayrshire.u06.univ-nantes.prive kernel:
[41115.140873] Eventfd bug detected!
second.ab:Mar 10 02:41:55 ayrshire.u06.univ-nantes.prive kernel:
[40348.967192] Eventfd bug detected!
seventh.ab:Mar 10 07:52:29 ayrshire.u06.univ-nantes.prive kernel:
[58983.145646] Eventfd bug detected!
sixth.ab:Mar 10 05:19:54 ayrshire.u06.univ-nantes.prive kernel:
[49828.785558] Eventfd bug detected!
third.ae:Mar 10 02:54:07 ayrshire.u06.univ-nantes.prive kernel:
[41081.638633] Eventfd bug detected!
grep -i wakeup *
seventh.ab:Mar 10 07:52:29 ayrshire.u06.univ-nantes.prive kernel:
[58983.154161] [<ffffffffa02cbf96>] vhost_poll_wakeup+0x16/0x20 [vhost_net
Here is a trace, for the thirst event:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.101747]
irqfd_deactivate(irqfd=ffff88042e0b5e00,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.101873]
irqfd_shutdown(work=ffff88042e0b5e80,irqfd=ffff88042e0b5e00,kvm=ffff8804542d0000,
gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.101928]
remove wq at irqfd_shutdown(work=ffff88042e0b5e80,irqfd=ffff88042e0b5e00)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.101990]
kfree at irqfd_shutdown(work=ffff88042e0b5e80,irqfd=ffff88042e0b5e00)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.102381]
kvm_irqfd_assign(irqfd=ffff88080f7aa818,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.103796]
kvm_irqfd_deassign(kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.103833]
irqfd_deactivate(irqfd=ffff88080f7aa818,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.103904]
irqfd_shutdown(work=ffff88080f7aa898,irqfd=ffff88080f7aa818,kvm=ffff8804542d0000,
gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.103958]
remove wq at irqfd_shutdown(work=ffff88080f7aa898,irqfd=ffff88080f7aa818)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.104023]
kfree at irqfd_shutdown(work=ffff88080f7aa898,irqfd=ffff88080f7aa818)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.104311]
kvm_irqfd_assign(irqfd=ffff88081a190b78,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.104511]
kvm_irqfd_deassign(kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.104549]
irqfd_deactivate(irqfd=ffff88081a190b78,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.104614]
irqfd_shutdown(work=ffff88081a190bf8,irqfd=ffff88081a190b78,kvm=ffff8804542d0000,
gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.104667]
remove wq at irqfd_shutdown(work=ffff88081a190bf8,irqfd=ffff88081a190b78)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.104715]
kfree at irqfd_shutdown(work=ffff88081a190bf8,irqfd=ffff88081a190b78)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.104911]
kvm_irqfd_assign(irqfd=ffff880853b8caa0,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.105868]
Eventfd bug detected!
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.105901]
irqfd_inject(work=ffff88042e0b5e60,irqfd=ffff88042e0b5e00,kvm=6b6b6b6b6b6b6b6b,gsi=1802201963)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.105951]
sending NMI to all CPUs:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.105961]
NMI backtrace for cpu 0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.105986] CPU 0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.105992]
Modules linked in: btrfs zlib_deflate crc32c libcrc32c ufs qnx4 hfsplus
hfs minix ntfs vfat msdos fat jfs reiserfs ext4 jbd2 crc16 ext3 jbd
vhost_net macvtap macvlan tun veth powernow_k8 mperf cpufreq_userspace
cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table
cpufreq_conservative fuse xt_physdev ip6t_LOG ip6table_filter ip6_tables
ipt_LOG xt_multiport xt_limit xt_tcpudp xt_state iptable_filter
ip_tables x_tables nf_conntrack_tftp nf_conntrack_ftp nf_conntrack_ipv4
nf_defrag_ipv4 8021q bridge stp ext2 mbcache dm_round_robin dm_multipath
nf_conntrack_ipv6 nf_conntrack nf_defrag_ipv6 ipv6 snd_pcm snd_timer snd
soundcore snd_page_alloc shpchp i2c_nforce2 tpm_tis tpm pci_hotplug
psmouse evdev i2c_core tpm_bios dcdbas pcspkr joydev ghes serio_raw
processor thermal_sys hed button xfs exportfs dm_mod sg sr_mod cdrom
usbhid hid usb_storage ses sd_mod enclosure lpfc scsi_transport_fc
ohci_hcd scsi_tgt megaraid_sas scsi_mod bnx2 ehci_hcd [last unloaded:
scsi_wait_sca
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: n]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106557]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106581]
Pid: 10, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Dell Inc. PowerEdge M605/0K543T
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106644]
RIP: 0010:[<ffffffff8105fa4b>] [<ffffffff8105fa4b>]
default_send_IPI_mask_sequence_phys+0xbb/0xe0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106706]
RSP: 0018:ffff88045fcb1d50 EFLAGS: 00000046
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106735]
RAX: ffff88087fc00000 RBX: 0000000000000002 RCX: 0000000000000008
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106767]
RDX: 0000000000000001 RSI: 0000000000000020 RDI: 0000000000000020
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106799]
RBP: ffff88045fcb1d90 R08: ffffffff8159faf0 R09: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106831]
R10: 0000000000000000 R11: 0000000000000006 R12: 000000000000c620
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106863]
R13: ffffffff8159faf0 R14: 0000000000000400 R15: 0000000000000286
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106896]
FS: 00007f66f7754720(0000) GS:ffff88007f800000(0000) knlGS:0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106944]
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.106973]
CR2: 0000000000e64048 CR3: 000000045ea45000 CR4: 00000000000006f0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.107005]
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.107037]
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.107070]
Process kworker/0:1 (pid: 10, threadinfo ffff88045fcb0000, task
ffff88045fcaae70)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.107117] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.107138]
ffffffff00000000 0000000000000000 ffff88045fcb1d70 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
6b6b6b6b6b6b6b6b ffff88007f814e00 ffffffff81008ba0 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
ffff88045fcb1da0 ffffffff81062c12 ffff88045fcb1dc0 ffffffff8105fb3c
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81008ba0>] ? irqfd_inject+0x0/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81062c12>] physflat_send_IPI_all+0x12/0x20
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff8105fb3c>] arch_trigger_all_cpu_backtrace+0x3c/0x70
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81008c2f>] irqfd_inject+0x8f/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810a971b>] process_one_work+0x11b/0x450
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810a9e97>] worker_thread+0x157/0x410
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81078519>] ? __wake_up_common+0x59/0x90
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810a9d40>] ? worker_thread+0x0/0x410
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810ad8f6>] kthread+0x96/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81041c64>] kernel_thread_helper+0x4/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810ad860>] ? kthread+0x0/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81041c60>] ? kernel_thread_helper+0x0/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
Code: 83 fb 02 44 89 f0 0f 45 c3 89 04 25 00 c3 5f ff eb 9e 4c 89 ff 57
9d 66 66 90 66 90 48 83 c4 18 5b 41 5c 41 5d 41 5e 41 5f c9 c3 <48> 8b
05 4e fb 53 00 48 89 55 c8 89 4d c0 ff 90 58 01 00 00 48
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81008ba0>] ? irqfd_inject+0x0/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81062c12>] physflat_send_IPI_all+0x12/0x20
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff8105fb3c>] arch_trigger_all_cpu_backtrace+0x3c/0x70
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81008c2f>] irqfd_inject+0x8f/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810a971b>] process_one_work+0x11b/0x450
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810a9e97>] worker_thread+0x157/0x410
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81078519>] ? __wake_up_common+0x59/0x90
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810a9d40>] ? worker_thread+0x0/0x410
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810ad8f6>] kthread+0x96/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81041c64>] kernel_thread_helper+0x4/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810ad860>] ? kthread+0x0/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81041c60>] ? kernel_thread_helper+0x0/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
Pid: 10, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
<NMI> [<ffffffff8104a786>] ? show_regs+0x26/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff8105fde1>] nmi_watchdog_tick+0x191/0x1b0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81042ef1>] do_nmi+0x1c1/0x2e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff813be5f0>] nmi+0x20/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff8105fa4b>] ? default_send_IPI_mask_sequence_phys+0xbb/0xe0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
<<EOE>> [<ffffffff81008ba0>] ? irqfd_inject+0x0/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81062c12>] physflat_send_IPI_all+0x12/0x20
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff8105fb3c>] arch_trigger_all_cpu_backtrace+0x3c/0x70
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81008c2f>] irqfd_inject+0x8f/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810a971b>] process_one_work+0x11b/0x450
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810a9e97>] worker_thread+0x157/0x410
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81078519>] ? __wake_up_common+0x59/0x90
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810a9d40>] ? worker_thread+0x0/0x410
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810ad8f6>] kthread+0x96/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81041c64>] kernel_thread_helper+0x4/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff810ad860>] ? kthread+0x0/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108011]
[<ffffffff81041c60>] ? kernel_thread_helper+0x0/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110243]
NMI backtrace for cpu 3
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110272] CPU 3
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110280]
Modules linked in: btrfs zlib_deflate crc32c libcrc32c ufs qnx4 hfsplus
hfs minix ntfs vfat msdos fat jfs reiserfs ext4 jbd2 crc16 ext3 jbd
vhost_net macvtap macvlan tun veth powernow_k8 mperf cpufreq_userspace
cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table
cpufreq_conservative fuse xt_physdev ip6t_LOG ip6table_filter ip6_tables
ipt_LOG xt_multiport xt_limit xt_tcpudp xt_state iptable_filter
ip_tables x_tables nf_conntrack_tftp nf_conntrack_ftp nf_conntrack_ipv4
nf_defrag_ipv4 8021q bridge stp ext2 mbcache dm_round_robin dm_multipath
nf_conntrack_ipv6 nf_conntrack nf_defrag_ipv6 ipv6 snd_pcm snd_timer snd
soundcore snd_page_alloc shpchp i2c_nforce2 tpm_tis tpm pci_hotplug
psmouse evdev i2c_core tpm_bios dcdbas pcspkr joydev ghes serio_raw
processor thermal_sys hed button xfs exportfs dm_mod sg sr_mod cdrom
usbhid hid usb_storage ses sd_mod enclosure lpfc scsi_transport_fc
ohci_hcd scsi_tgt megaraid_sas scsi_mod bnx2 ehci_hcd [last unloaded:
scsi_wait_sca
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: n]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110882]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110906]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Dell Inc. PowerEdge M605/0K543T
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110970]
RIP: 0010:[<ffffffff81066716>] [<ffffffff81066716>]
native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111030]
RSP: 0018:ffff88045fcd3ea8 EFLAGS: 00000246
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111059]
RAX: 0000000000000000 RBX: 0000000000000003 RCX: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111091]
RDX: 0000000000000000 RSI: ffff88045fcd3ee4 RDI: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111123]
RBP: ffff88045fcd3ea8 R08: 0000000000000000 R09: 0000000000000001
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111155]
R10: 0000000000000000 R11: 0000000000000001 R12: ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111186]
R13: 0000000000000003 R14: 0000000000000000 R15: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111220]
FS: 00007fb1eafc6740(0000) GS:ffff88087fc40000(0000) knlGS:0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111268]
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111297]
CR2: 00007ff12a981de0 CR3: 000000045569f000 CR4: 00000000000006e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111329]
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111362]
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111395]
Process kworker/0:1 (pid: 0, threadinfo ffff88045fcd2000, task
ffff88045fcca820)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111442] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111463]
ffff88045fcd3ec8 ffffffff8104a016 ffff88045fcd3ee4 ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111515]
ffff88045fcd3ef8 ffffffff8104a168 ffff88045fcd3ee8 00000000810b3255
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111566]
ffff88045fcd2010 ffffffff8159faf0 ffff88045fcd3f28 ffffffff8104003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111618]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111648]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111680]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111712]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111745]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111774]
Code: 00 00 00 00 00 55 48 89 e5 fa c9 c3 66 0f 1f 84 00 00 00 00 00 55
48 89 e5 fb c9 c3 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 fb f4 <c9> c3
0f 1f 84 00 00 00 00 00 55 48 89 e5 f4 c9 c3 66 0f 1f 84
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111982]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112007]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112038]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112069]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112099]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112131]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112176]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112198]
<NMI> [<ffffffff8104a786>] ? show_regs+0x26/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112238]
[<ffffffff8105fde1>] nmi_watchdog_tick+0x191/0x1b0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112272]
[<ffffffff81042ef1>] do_nmi+0x1c1/0x2e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112303]
[<ffffffff813be5f0>] nmi+0x20/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112332]
[<ffffffff81066716>] ? native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112361]
<<EOE>> [<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112399]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112430]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112460]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112024]
NMI backtrace for cpu 2
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112024] CPU 2
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112024]
Modules linked in: btrfs zlib_deflate crc32c libcrc32c ufs qnx4 hfsplus
hfs minix ntfs vfat msdos fat jfs reiserfs ext4 jbd2 crc16 ext3 jbd
vhost_net macvtap macvlan tun veth powernow_k8 mperf cpufreq_userspace
cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table
cpufreq_conservative fuse xt_physdev ip6t_LOG ip6table_filter ip6_tables
ipt_LOG xt_multiport xt_limit xt_tcpudp xt_state iptable_filter
ip_tables x_tables nf_conntrack_tftp nf_conntrack_ftp nf_conntrack_ipv4
nf_defrag_ipv4 8021q bridge stp ext2 mbcache dm_round_robin dm_multipath
nf_conntrack_ipv6 nf_conntrack nf_defrag_ipv6 ipv6 snd_pcm snd_timer snd
soundcore snd_page_alloc shpchp i2c_nforce2 tpm_tis tpm pci_hotplug
psmouse evdev i2c_core tpm_bios dcdbas pcspkr joydev ghes serio_raw
processor thermal_sys hed button xfs exportfs dm_mod sg sr_mod cdrom
usbhid hid usb_storage ses sd_mod enclosure lpfc scsi_transport_fc
ohci_hcd scsi_tgt megaraid_sas scsi_mod bnx2 ehci_hcd [last unloaded:
scsi_wait_sca
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: n]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Dell Inc. PowerEdge M605/0K543T
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
RIP: 0010:[<ffffffff81066716>] [<ffffffff81066716>]
native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
RSP: 0018:ffff88045fcc5ea8 EFLAGS: 00000246
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
RAX: 0000000000000000 RBX: 0000000000000002 RCX: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
RDX: 0000000000000000 RSI: ffff88045fcc5ee4 RDI: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
RBP: ffff88045fcc5ea8 R08: 0000000000000000 R09: 0000000000000001
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
R10: 0000000000000000 R11: 0000000000000000 R12: ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
R13: 0000000000000002 R14: 0000000000000000 R15: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
FS: 00007f66f7754720(0000) GS:ffff88007f840000(0000) knlGS:0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
CR2: 00007f241ad1f0b8 CR3: 000000045ea45000 CR4: 00000000000006f0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
Process kworker/0:1 (pid: 0, threadinfo ffff88045fcc4000, task
ffff88045fcb87e0)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
ffff88045fcc5ec8 ffffffff8104a016 ffff88045fcc5ee4 ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
ffff88045fcc5ef8 ffffffff8104a168 ffff88045fcc5ee8 00000000810b3255
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
ffff88045fcc4010 ffffffff8159faf0 ffff88045fcc5f28 ffffffff8104003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
Code: 00 00 00 00 00 55 48 89 e5 fa c9 c3 66 0f 1f 84 00 00 00 00 00 55
48 89 e5 fb c9 c3 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 fb f4 <c9> c3
0f 1f 84 00 00 00 00 00 55 48 89 e5 f4 c9 c3 66 0f 1f 84
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
<NMI> [<ffffffff8104a786>] ? show_regs+0x26/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff8105fde1>] nmi_watchdog_tick+0x191/0x1b0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff81042ef1>] do_nmi+0x1c1/0x2e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff813be5f0>] nmi+0x20/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff81066716>] ? native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
<<EOE>> [<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112616]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
NMI backtrace for cpu 1
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285] CPU 1
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
Modules linked in: btrfs zlib_deflate crc32c libcrc32c ufs qnx4 hfsplus
hfs minix ntfs vfat msdos fat jfs reiserfs ext4 jbd2 crc16 ext3 jbd
vhost_net macvtap macvlan tun veth powernow_k8 mperf cpufreq_userspace
cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table
cpufreq_conservative fuse xt_physdev ip6t_LOG ip6table_filter ip6_tables
ipt_LOG xt_multiport xt_limit xt_tcpudp xt_state iptable_filter
ip_tables x_tables nf_conntrack_tftp nf_conntrack_ftp nf_conntrack_ipv4
nf_defrag_ipv4 8021q bridge stp ext2 mbcache dm_round_robin dm_multipath
nf_conntrack_ipv6 nf_conntrack nf_defrag_ipv6 ipv6 snd_pcm snd_timer snd
soundcore snd_page_alloc shpchp i2c_nforce2 tpm_tis tpm pci_hotplug
psmouse evdev i2c_core tpm_bios dcdbas pcspkr joydev ghes serio_raw
processor thermal_sys hed button xfs exportfs dm_mod sg sr_mod cdrom
usbhid hid usb_storage ses sd_mod enclosure lpfc scsi_transport_fc
ohci_hcd scsi_tgt megaraid_sas scsi_mod bnx2 ehci_hcd [last unloaded:
scsi_wait_sca
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: n]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
Pid: 0, comm: kworker/0:0 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Dell Inc. PowerEdge M605/0K543T
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
RIP: 0010:[<ffffffff81066716>] [<ffffffff81066716>]
native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
RSP: 0018:ffff88045fcb3ea8 EFLAGS: 00000246
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
RDX: 0000000000000000 RSI: ffff88045fcb3ee4 RDI: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
RBP: ffff88045fcb3ea8 R08: 0000000000000000 R09: ffff88087fc0e408
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
R10: 000028ce70db0d2f R11: 0000000000000001 R12: ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
R13: 0000000000000001 R14: 0000000000000000 R15: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
FS: 00007fb8e1893710(0000) GS:ffff88087fc00000(0000) knlGS:0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
CR2: 00007f241aca71a0 CR3: 000000045ed50000 CR4: 00000000000006e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
Process kworker/0:0 (pid: 0, threadinfo ffff88045fcb2000, task
ffff88045fcaa7a0)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
ffff88045fcb3ec8 ffffffff8104a016 ffff88045fcb3ee4 ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
ffff88045fcb3ef8 ffffffff8104a168 ffff88045fcb3ee8 00000000810b3255
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
ffff88045fcb2010 ffffffff8159faf0 ffff88045fcb3f28 ffffffff8104003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
Code: 00 00 00 00 00 55 48 89 e5 fa c9 c3 66 0f 1f 84 00 00 00 00 00 55
48 89 e5 fb c9 c3 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 fb f4 <c9> c3
0f 1f 84 00 00 00 00 00 55 48 89 e5 f4 c9 c3 66 0f 1f 84
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
<NMI> [<ffffffff8104a786>] ? show_regs+0x26/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
[<ffffffff8105fde1>] nmi_watchdog_tick+0x191/0x1b0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
[<ffffffff813be5f0>] nmi+0x20/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
<<EOE>> [<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112285]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
Modules linked in: btrfs zlib_deflate crc32c libcrc32c ufs qnx4 hfsplus
hfs minix ntfs vfat msdos fat jfs reiserfs ext4 jbd2 crc16 ext3 jbd
vhost_net macvtap macvlan tun veth powernow_k8 mperf cpufreq_userspace
cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table
cpufreq_conservative fuse xt_physdev ip6t_LOG ip6table_filter ip6_tables
ipt_LOG xt_multiport xt_limit xt_tcpudp xt_state iptable_filter
ip_tables x_tables nf_conntrack_tftp nf_conntrack_ftp nf_conntrack_ipv4
nf_defrag_ipv4 8021q bridge stp ext2 mbcache dm_round_robin dm_multipath
nf_conntrack_ipv6 nf_conntrack nf_defrag_ipv6 ipv6 snd_pcm snd_timer snd
soundcore snd_page_alloc shpchp i2c_nforce2 tpm_tis tpm pci_hotplug
psmouse evdev i2c_core tpm_bios dcdbas pcspkr joydev ghes serio_raw
processor thermal_sys hed button xfs exportfs dm_mod sg sr_mod cdrom
usbhid hid usb_storage ses sd_mod enclosure lpfc scsi_transport_fc
ohci_hcd scsi_tgt megaraid_sas scsi_mod bnx2 ehci_hcd [last unloaded:
scsi_wait_sca
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
RAX: 0000000000000000 RBX: 0000000000000005 RCX: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
RDX: 0000000000000000 RSI: ffff88045fd11ee4 RDI: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
ffff88045fd11ef8 ffffffff8104a168 ffff88045fd11ee8 00000000810b3255
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
ffff88045fd10010 ffffffff8159faf0 ffff88045fd11f28 ffffffff8104003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.110896]
Code: 00 00 00 00 00 55 48 89 e5 fa c9 c3 66 0f 1f 84 00 00 00 00 00 55
48 89 e5 fb c9 c3 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 fb f4 <c9> c3
0f 1f 84 00 00 00 00 00 55 48 89 e5 f4 c9 c3 66 0f 1f 84
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.119695]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.119695]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.119695]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.119695]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.119985]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.119985]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.119985]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.119985]
<NMI> [<ffffffff8104a786>] ? show_regs+0x26/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120119]
[<ffffffff8105fde1>] nmi_watchdog_tick+0x191/0x1b0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120164]
[<ffffffff81042ef1>] do_nmi+0x1c1/0x2e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
CR2: 00007f241ad1f0b8 CR3: 000000045ed50000 CR4: 00000000000006e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
Process kworker/0:1 (pid: 0, threadinfo ffff88045fd00000, task
ffff88045fcd8860)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
ffff88045fd01ec8 ffffffff8104a016 ffff88045fd01ee4 ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
ffff88045fd01ef8 ffffffff8104a168 ffff88045fd01ee8 00000000810b3255
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
ffff88045fd00010 ffffffff8159faf0 ffff88045fd01f28 ffffffff8104003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
[<ffffffff813be5f0>] nmi+0x20/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.112018]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.123585]
NMI backtrace for cpu 7
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: n]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.124502]
RAX: 0000000000000000 RBX: 0000000000000007 RCX: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.125007]
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.125206] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
Modules linked in: btrfs zlib_deflate crc32c libcrc32c ufs qnx4 hfsplus
hfs minix ntfs vfat msdos fat jfs reiserfs ext4 jbd2 crc16 ext3 jbd
vhost_net macvtap macvlan tun veth powernow_k8 mperf cpufreq_userspace
cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table
cpufreq_conservative fuse xt_physdev ip6t_LOG ip6table_filter ip6_tables
ipt_LOG xt_multiport xt_limit xt_tcpudp xt_state iptable_filter
ip_tables x_tables nf_conntrack_tftp nf_conntrack_ftp nf_conntrack_ipv4
nf_defrag_ipv4 8021q bridge stp ext2 mbcache dm_round_robin dm_multipath
nf_conntrack_ipv6 nf_conntrack nf_defrag_ipv6 ipv6 snd_pcm snd_timer snd
soundcore snd_page_alloc shpchp i2c_nforce2 tpm_tis tpm pci_hotplug
psmouse evdev i2c_core tpm_bios dcdbas pcspkr joydev ghes serio_raw
processor thermal_sys hed button xfs exportfs dm_mod sg sr_mod cdrom
usbhid hid usb_storage ses sd_mod enclosure lpfc scsi_transport_fc
ohci_hcd scsi_tgt megaraid_sas scsi_mod bnx2 ehci_hcd [last unloaded:
scsi_wait_sca
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: n]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Dell Inc. PowerEdge M605/0K543T
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
RIP: 0010:[<ffffffff81066716>] [<ffffffff81066716>]
native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
RSP: 0018:ffff88045fd23ea8 EFLAGS: 00000246
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
RAX: 0000000000000000 RBX: 0000000000000006 RCX: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
RDX: 0000000000000000 RSI: ffff88045fd23ee4 RDI: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
RBP: ffff88045fd23ea8 R08: 0000000000000000 R09: ffff88007f8ce408
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
R10: 0000000000000000 R11: 0000000000000001 R12: ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
ffff88045fd23ec8 ffffffff8104a016 ffff88045fd23ee4 ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
[<ffffffff813be5f0>] nmi+0x20/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108015]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
Modules linked in: btrfs zlib_deflate crc32c libcrc32c ufs qnx4 hfsplus
hfs minix ntfs vfat msdos fat jfs reiserfs ext4 jbd2 crc16 ext3 jbd
vhost_net macvtap macvlan tun veth powernow_k8 mperf cpufreq_userspace
cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table
cpufreq_conservative fuse xt_physdev ip6t_LOG ip6table_filter ip6_tables
ipt_LOG xt_multiport xt_limit xt_tcpudp xt_state iptable_filter
ip_tables x_tables nf_conntrack_tftp nf_conntrack_ftp nf_conntrack_ipv4
nf_defrag_ipv4 8021q bridge stp ext2 mbcache dm_round_robin dm_multipath
nf_conntrack_ipv6 nf_conntrack nf_defrag_ipv6 ipv6 snd_pcm snd_timer snd
soundcore snd_page_alloc shpchp i2c_nforce2 tpm_tis tpm pci_hotplug
psmouse evdev i2c_core tpm_bios dcdbas pcspkr joydev ghes serio_raw
processor thermal_sys hed button xfs exportfs dm_mod sg sr_mod cdrom
usbhid hid usb_storage ses sd_mod enclosure lpfc scsi_transport_fc
ohci_hcd scsi_tgt megaraid_sas scsi_mod bnx2 ehci_hcd [last unloaded:
scsi_wait_sca
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: n]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
R10: 000028ce766a74a3 R11: 0000000000000001 R12: ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
R13: 0000000000000009 R14: 0000000000000000 R15: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
FS: 00007fa0cb316710(0000) GS:ffff88087fd00000(0000) knlGS:0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
CR2: 0000000000e64048 CR3: 000000045ea45000 CR4: 00000000000006e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
Process kworker/0:1 (pid: 0, threadinfo ffff88045fd6e000, task
ffff88045fd669a0)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
ffff88045fd6fec8 ffffffff8104a016 ffff88045fd6fee4 ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
ffff88045fd6fef8 ffffffff8104a168 ffff88045fd6fee8 00000000810b3255
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
ffff88045fd6e010 ffffffff8159faf0 ffff88045fd6ff28 ffffffff8104003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
Code: 00 00 00 00 00 55 48 89 e5 fa c9 c3 66 0f 1f 84 00 00 00 00 00 55
48 89 e5 fb c9 c3 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 fb f4 <c9> c3
0f 1f 84 00 00 00 00 00 55 48 89 e5 f4 c9 c3 66 0f 1f 84
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
<NMI> [<ffffffff8104a786>] ? show_regs+0x26/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff8105fde1>] nmi_watchdog_tick+0x191/0x1b0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff81042ef1>] do_nmi+0x1c1/0x2e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff813be5f0>] nmi+0x20/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff81066716>] ? native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
<<EOE>> [<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.126621]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
NMI backtrace for cpu 11
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
CPU 11
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
Modules linked in: btrfs zlib_deflate crc32c libcrc32c ufs qnx4 hfsplus
hfs minix ntfs vfat msdos fat jfs reiserfs ext4 jbd2 crc16 ext3 jbd
vhost_net macvtap macvlan tun veth powernow_k8 mperf cpufreq_userspace
cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table
cpufreq_conservative fuse xt_physdev ip6t_LOG ip6table_filter ip6_tables
ipt_LOG xt_multiport xt_limit xt_tcpudp xt_state iptable_filter
ip_tables x_tables nf_conntrack_tftp nf_conntrack_ftp nf_conntrack_ipv4
nf_defrag_ipv4 8021q bridge stp ext2 mbcache dm_round_robin dm_multipath
nf_conntrack_ipv6 nf_conntrack nf_defrag_ipv6 ipv6 snd_pcm snd_timer snd
soundcore snd_page_alloc shpchp i2c_nforce2 tpm_tis tpm pci_hotplug
psmouse evdev i2c_core tpm_bios dcdbas pcspkr joydev ghes serio_raw
processor thermal_sys hed button xfs exportfs dm_mod sg sr_mod cdrom
usbhid hid usb_storage ses sd_mod enclosure lpfc scsi_transport_fc
ohci_hcd scsi_tgt megaraid_sas scsi_mod bnx2 ehci_hcd [last unloaded:
scsi_wait_sca
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: n]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Dell Inc. PowerEdge M605/0K543T
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
RIP: 0010:[<ffffffff81066716>] [<ffffffff81066716>]
native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
RSP: 0018:ffff88045fd8fea8 EFLAGS: 00000246
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
RAX: 0000000000000000 RBX: 000000000000000b RCX: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
RDX: 0000000000000000 RSI: ffff88045fd8fee4 RDI: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
RBP: ffff88045fd8fea8 R08: 0000000000000000 R09: ffff88087fd4e408
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
R10: 000028ce71c3578e R11: 0000000000000001 R12: ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
R13: 000000000000000b R14: 0000000000000000 R15: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
FS: 00007fa0ce156740(0000) GS:ffff88087fd40000(0000) knlGS:0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
CR2: 00007f2421c3eae0 CR3: 000000045ea45000 CR4: 00000000000006e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
Process kworker/0:1 (pid: 0, threadinfo ffff88045fd8e000, task
ffff88045fd86a20)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
ffff88045fd8fec8 ffffffff8104a016 ffff88045fd8fee4 ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
ffff88045fd8fef8 ffffffff8104a168 ffff88045fd8fee8 00000000810b3255
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
ffff88045fd8e010 ffffffff8159faf0 ffff88045fd8ff28 ffffffff8104003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
Code: 00 00 00 00 00 55 48 89 e5 fa c9 c3 66 0f 1f 84 00 00 00 00 00 55
48 89 e5 fb c9 c3 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 fb f4 <c9> c3
0f 1f 84 00 00 00 00 00 55 48 89 e5 f4 c9 c3 66 0f 1f 84
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
<NMI> [<ffffffff8104a786>] ? show_regs+0x26/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff8105fde1>] nmi_watchdog_tick+0x191/0x1b0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff81042ef1>] do_nmi+0x1c1/0x2e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff813be5f0>] nmi+0x20/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff81066716>] ? native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
<<EOE>> [<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.111333]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
NMI backtrace for cpu 8
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010] CPU 8
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
Modules linked in: btrfs zlib_deflate crc32c libcrc32c ufs qnx4 hfsplus
hfs minix ntfs vfat msdos fat jfs reiserfs ext4 jbd2 crc16 ext3 jbd
vhost_net macvtap macvlan tun veth powernow_k8 mperf cpufreq_userspace
cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table
cpufreq_conservative fuse xt_physdev ip6t_LOG ip6table_filter ip6_tables
ipt_LOG xt_multiport xt_limit xt_tcpudp xt_state iptable_filter
ip_tables x_tables nf_conntrack_tftp nf_conntrack_ftp nf_conntrack_ipv4
nf_defrag_ipv4 8021q bridge stp ext2 mbcache dm_round_robin dm_multipath
nf_conntrack_ipv6 nf_conntrack nf_defrag_ipv6 ipv6 snd_pcm snd_timer snd
soundcore snd_page_alloc shpchp i2c_nforce2 tpm_tis tpm pci_hotplug
psmouse evdev i2c_core tpm_bios dcdbas pcspkr joydev ghes serio_raw
processor thermal_sys hed button xfs exportfs dm_mod sg sr_mod cdrom
usbhid hid usb_storage ses sd_mod enclosure lpfc scsi_transport_fc
ohci_hcd scsi_tgt megaraid_sas scsi_mod bnx2 ehci_hcd [last unloaded:
scsi_wait_sca
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: n]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Dell Inc. PowerEdge M605/0K543T
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
RIP: 0010:[<ffffffff81066716>] [<ffffffff81066716>]
native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
RSP: 0018:ffff88045fd63ea8 EFLAGS: 00000246
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
RAX: 0000000000000000 RBX: 0000000000000008 RCX: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
RDX: 0000000000000000 RSI: ffff88045fd63ee4 RDI: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
RBP: ffff88045fd63ea8 R08: 0000000000000000 R09: ffff88007f90e408
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
R10: 0000000000000000 R11: 0000000000000001 R12: ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
R13: 0000000000000008 R14: 0000000000000000 R15: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
FS: 00007fb8e0891710(0000) GS:ffff88007f900000(0000) knlGS:0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
CR2: 0000000000e63f28 CR3: 000000045ed50000 CR4: 00000000000006e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
Process kworker/0:1 (pid: 0, threadinfo ffff88045fd62000, task
ffff88045fd34960)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
ffff88045fd63ec8 ffffffff8104a016 ffff88045fd63ee4 ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
ffff88045fd63ef8 ffffffff8104a168 ffff88045fd63ee8 00000000810b3255
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
ffff88045fd62010 ffffffff8159faf0 ffff88045fd63f28
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136088]
kvm_irqfd_deassign(kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136098]
irqfd_deactivate(irqfd=ffff880853b8caa0,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
Code: 00 00 00 00 00 55 48 89 e5 fa c9 c3 66 0f 1f 84 00 00 00 00 00 55
48 89 e5 fb c9 c3 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 fb f4 <c9> c3 0f
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136661]
kvm_irqfd_deassign(kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136665]
irqfd_deactivate(irqfd=ffff880810a21e00,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136702]
irqfd_shutdown(work=ffff880810a21e80,irqfd=ffff880810a21e00,kvm=ffff8804542d0000,
gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136709]
remove wq at irqfd_shutdown(work=ffff880810a21e80,irqfd=ffff880810a21e00)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136715]
kfree at irqfd_shutdown(work=ffff880810a21e80,irqfd=ffff880810a21e00)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010] 1f
84 00 00 00
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136910]
kvm_irqfd_assign(irqfd=ffff880853b8caa0,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010] 00
00 55 48 89 e5 f4 c9 c3 66 0f 1f 84
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
[<ffffffff8104a168>] c1e_idle+0x58/0x120
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.108010]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136975]
Pid: 0, comm: kworker/0:1 Not tainted 2.6.37.2-patchjp-110308-c+ #17
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136975]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136975]
<NMI> [<ffffffff8104a786>] ? show_regs+0x26/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136975]
[<ffffffff8105fde1>] nmi_watchdog_tick+0x191/0x1b0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136975]
[<ffffffff813be5f0>] nmi+0x20/0x30
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.136975]
[<ffffffff81066716>] ? native_safe_halt+0x6/0x10
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
FS: 00007f2787814700(0000) GS:ffff88007f940000(0000) knlGS:0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
CR2: 0000000000e63f28 CR3: 000000045ea45000 CR4: 00000000000006e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
Process kworker/0:1 (pid: 0, threadinfo ffff88045fd80000, task
ffff88045fd769e0)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004] Stack:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
ffff88045fd81ec8 ffffffff8104a016 ffff88045fd81ee4 ffffffff8159faf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
ffff88045fd81ef8 ffffffff8104a168 ffff88045fd81ee8 00000000810b3255
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
ffff88045fd80010 ffffffff8159faf0 ffff88045fd81f28 ffffffff8104003b
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
Call Trace:
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
[<ffffffff8104a016>] default_idle+0x46/0xa0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
[<ffffffff8104003b>] cpu_idle+0x6b/0xf0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
[<ffffffff81042ef1>] do_nmi+0x1c1/0x2e0
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.120004]
[<ffffffff813b7247>] start_secondary+0x1b9/0x1be
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.148658]
kvm_irqfd_deassign(kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.148687]
irqfd_deactivate(irqfd=ffff880853b8caa0,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.148759]
irqfd_shutdown(work=ffff880853b8cb20,irqfd=ffff880853b8caa0,kvm=ffff8804542d0000,
gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.148814]
remove wq at irqfd_shutdown(work=ffff880853b8cb20,irqfd=ffff880853b8caa0)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.148862]
kfree at irqfd_shutdown(work=ffff880853b8cb20,irqfd=ffff880853b8caa0)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.149086]
kvm_irqfd_assign(irqfd=ffff88081a190b78,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.149379]
kvm_irqfd_deassign(kvm=ffff8804542d0000, gsi=48)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.149416]
irqfd_deactivate(irqfd=ffff88045efd3740,kvm=ffff8804542d0000, gsi=48)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.149540]
irqfd_shutdown(work=ffff88045efd37c0,irqfd=ffff88045efd3740,kvm=ffff8804542d0000,
gsi=48)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.149594]
remove wq at irqfd_shutdown(work=ffff88045efd37c0,irqfd=ffff88045efd3740)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.149643]
kfree at irqfd_shutdown(work=ffff88045efd37c0,irqfd=ffff88045efd3740)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.149922]
kvm_irqfd_assign(irqfd=ffff88080f7aa818,kvm=ffff8804542d0000, gsi=48)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.171869]
kvm_irqfd_deassign(kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.171907]
irqfd_deactivate(irqfd=ffff88081a190b78,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.171989]
irqfd_shutdown(work=ffff88081a190bf8,irqfd=ffff88081a190b78,kvm=ffff8804542d0000,
gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.172111]
remove wq at irqfd_shutdown(work=ffff88081a190bf8,irqfd=ffff88081a190b78)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.172160]
kfree at irqfd_shutdown(work=ffff88081a190bf8,irqfd=ffff88081a190b78)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.172493]
kvm_irqfd_assign(irqfd=ffff88083b062308,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.172672]
kvm_irqfd_deassign(kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.172710]
irqfd_deactivate(irqfd=ffff88083b062308,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.172782]
irqfd_shutdown(work=ffff88083b062388,irqfd=ffff88083b062308,kvm=ffff8804542d0000,
gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.172836]
remove wq at irqfd_shutdown(work=ffff88083b062388,irqfd=ffff88083b062308)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.172884]
kfree at irqfd_shutdown(work=ffff88083b062388,irqfd=ffff88083b062308)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.173074]
kvm_irqfd_assign(irqfd=ffff88081a190230,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.175303]
kvm_irqfd_deassign(kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.175339]
irqfd_deactivate(irqfd=ffff88081a190230,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.175466]
irqfd_shutdown(work=ffff88081a1902b0,irqfd=ffff88081a190230,kvm=ffff8804542d0000,
gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.175521]
remove wq at irqfd_shutdown(work=ffff88081a1902b0,irqfd=ffff88081a190230)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.175569]
kfree at irqfd_shutdown(work=ffff88081a1902b0,irqfd=ffff88081a190230)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.175769]
kvm_irqfd_assign(irqfd=ffff88045eabb668,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.176002]
kvm_irqfd_deassign(kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.176058]
irqfd_deactivate(irqfd=ffff88045eabb668,kvm=ffff8804542d0000, gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.176122]
irqfd_shutdown(work=ffff88045eabb6e8,irqfd=ffff88045eabb668,kvm=ffff8804542d0000,
gsi=24)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.176177]
remove wq at irqfd_shutdown(work=ffff88045eabb6e8,irqfd=ffff88045eabb668)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.176225]
kfree at irqfd_shutdown(work=ffff88045eabb6e8,irqfd=ffff88045eabb668)
Mar 10 03:57:13 ayrshire.u06.univ-nantes.prive kernel: [44867.176427]
kvm_irqfd_assign(irqfd=ffff88045ed96c50,kvm=ffff8804542d0000, gsi=24
You can find all the trace at the following adress:
http://filex.univ-nantes.fr/get?k=R94kna5sckVmdvCoKsn
It's a tar.gz of seven file, from 100k to 200k each ;)
Again, thanks a lot for the time you spent on this.
Regards.
--
Jean-Philippe Menil - Pôle réseau Service IRTS
DSI Université de Nantes
jean-philippe.menil@univ-nantes.fr
Tel : 02.53.48.49.27 - Fax : 02.53.48.49.09
^ permalink raw reply
* Re: [PATCH] Make CUBIC Hystart more robust to RTT variations
From: Lucas Nussbaum @ 2011-03-10 8:54 UTC (permalink / raw)
To: Bill Fink
Cc: Stephen Hemminger, Injong Rhee, David Miller, xiyou wangcong,
netdev, sangtae ha
In-Reply-To: <20110310021751.2f5fb8bc.billfink@mindspring.com>
On 10/03/11 at 02:17 -0500, Bill Fink wrote:
> On Wed, 9 Mar 2011, Stephen Hemminger wrote:
>
> > Bill what is the HZ in your kernel config.
> > I am concerned hystart doesn't work well with HZ=100
>
> HZ=1000
>
> But I did have tcp_timestamps disabled. Should I re-run
> the tests with tcp_timestamps enabled?
I ran my tests with timestamps enabled and HZ=250. If you have the
opportunity to run tests in the same config, it would be great. The
HZ=250 vs HZ=1000 difference could explain why it's working.
However, enabling or disabling timestamps shouldn't make a difference,
since the hystart code doesn't use TCP_CONG_RTT_STAMP.
--
| Lucas Nussbaum MCF Université Nancy 2 |
| lucas.nussbaum@loria.fr LORIA / AlGorille |
| http://www.loria.fr/~lnussbau/ +33 3 54 95 86 19 |
^ permalink raw reply
* how to utilize multi tx queue to send packet?
From: zhou rui @ 2011-03-10 9:44 UTC (permalink / raw)
To: netdev, johann.baudy
hi
I am doing some test according to the
website:http://wiki.ipxwarzone.com/index.php5?title=Linux_packet_mmap
use packet_mmap tx_ring to send packet.
I modified the sample code "packetmmap.c" to make it send packets have
different outer ip.
so that with the help of RSS, I can achieve higher throughput.
but one thing I saw at the tx side, is that all the packets are sent
via the same tx_queue,which is conflict with what I saw at the rx
side.
any idea to make it sent packets via different tx_queues? (spread
across the tx_queues)
thanks
jon
^ permalink raw reply
* Re: [PATCH v2] net: don't allow CAP_NET_ADMIN to load non-netdev kernel modules
From: Vasiliy Kulikov @ 2011-03-10 9:49 UTC (permalink / raw)
To: James Morris
Cc: David Miller, mjt, linux-kernel, arnd, mirqus, netdev, bhutchings,
kuznet, pekkas, yoshfuji, kaber, eric.dumazet, therbert, xiaosuo,
jesse, kees.cook, eugene, dan.j.rosenberg
In-Reply-To: <alpine.LRH.2.00.1103100953330.4485@tundra.namei.org>
James,
On Thu, Mar 10, 2011 at 09:53 +1100, James Morris wrote:
> I can submit it via my tree.
Thank you!
--
Vasiliy Kulikov
http://www.openwall.com - bringing security into open computing environments
^ permalink raw reply
* Re: [PATCH net-next 0/7] tg3: Cleanups
From: David Miller @ 2011-03-10 9:57 UTC (permalink / raw)
To: mcarlson; +Cc: netdev, stable
In-Reply-To: <1299725905-8498-1-git-send-email-mcarlson@broadcom.com>
From: "Matt Carlson" <mcarlson@broadcom.com>
Date: Wed, 9 Mar 2011 18:58:18 -0800
> This patchset adds a 5719 workaround, VPD RODATA checksum verification,
> and some code cleanups
Looks good, all applied, thanks.
^ permalink raw reply
* [PATCH 0/8] macb: add support for Cadence GEM
From: Jamie Iles @ 2011-03-10 10:10 UTC (permalink / raw)
To: netdev, linux-arm-kernel; +Cc: nicolas.ferre, Jamie Iles
This patch series extends the Atmel MACB driver to support the Cadence
GEM (Gigabit Ethernet MAC) to support 10/100 operation. The GEM is
based on the MACB block but has a few moved registers and bitfields.
This patch series attempts to use the MACB accessors where block
functionallity is identical and only overrides to GEM specific
acccessors when needed.
This has been runtested on a board with a Cadence GEM and compile tested
for all at91 configurations and a number of avr32 configurations.
Jamie Iles (8):
macb: unify at91 and avr32 platform data
macb: detect hclk presence from platform data
macb: convert printk to pr_ and friends
macb: initial support for Cadence GEM
macb: handle HW address registers for GEM devices
macb: support higher rate GEM MDIO clock divisors
macb: support statistics for GEM devices
macb: support data bus widths > 32 bits
arch/arm/mach-at91/at572d940hf_devices.c | 6 +-
arch/arm/mach-at91/at91cap9_devices.c | 6 +-
arch/arm/mach-at91/at91rm9200_devices.c | 6 +-
arch/arm/mach-at91/at91sam9260_devices.c | 6 +-
arch/arm/mach-at91/at91sam9263_devices.c | 6 +-
arch/arm/mach-at91/at91sam9g45_devices.c | 6 +-
arch/arm/mach-at91/board-1arm.c | 2 +-
arch/arm/mach-at91/board-afeb-9260v1.c | 2 +-
arch/arm/mach-at91/board-at572d940hf_ek.c | 2 +-
arch/arm/mach-at91/board-cam60.c | 2 +-
arch/arm/mach-at91/board-cap9adk.c | 2 +-
arch/arm/mach-at91/board-carmeva.c | 2 +-
arch/arm/mach-at91/board-cpu9krea.c | 2 +-
arch/arm/mach-at91/board-cpuat91.c | 2 +-
arch/arm/mach-at91/board-csb337.c | 2 +-
arch/arm/mach-at91/board-csb637.c | 2 +-
arch/arm/mach-at91/board-eb9200.c | 2 +-
arch/arm/mach-at91/board-ecbat91.c | 2 +-
arch/arm/mach-at91/board-eco920.c | 2 +-
arch/arm/mach-at91/board-foxg20.c | 2 +-
arch/arm/mach-at91/board-gsia18s.c | 2 +-
arch/arm/mach-at91/board-kafa.c | 2 +-
arch/arm/mach-at91/board-kb9202.c | 2 +-
arch/arm/mach-at91/board-neocore926.c | 2 +-
arch/arm/mach-at91/board-pcontrol-g20.c | 2 +-
arch/arm/mach-at91/board-picotux200.c | 2 +-
arch/arm/mach-at91/board-qil-a9260.c | 2 +-
arch/arm/mach-at91/board-rm9200dk.c | 2 +-
arch/arm/mach-at91/board-rm9200ek.c | 2 +-
arch/arm/mach-at91/board-sam9-l9260.c | 2 +-
arch/arm/mach-at91/board-sam9260ek.c | 2 +-
arch/arm/mach-at91/board-sam9263ek.c | 2 +-
arch/arm/mach-at91/board-sam9g20ek.c | 2 +-
arch/arm/mach-at91/board-sam9m10g45ek.c | 2 +-
arch/arm/mach-at91/board-snapper9260.c | 2 +-
arch/arm/mach-at91/board-stamp9g20.c | 2 +-
arch/arm/mach-at91/board-usb-a9260.c | 2 +-
arch/arm/mach-at91/board-usb-a9263.c | 2 +-
arch/arm/mach-at91/board-yl-9200.c | 2 +-
arch/arm/mach-at91/include/mach/board.h | 14 +-
arch/avr32/mach-at32ap/at32ap700x.c | 2 +
arch/avr32/mach-at32ap/include/mach/board.h | 5 +-
drivers/net/Kconfig | 8 +-
drivers/net/macb.c | 294 +++++++++++++++++++--------
drivers/net/macb.h | 90 ++++++++-
include/linux/platform_data/macb.h | 17 ++
46 files changed, 381 insertions(+), 151 deletions(-)
create mode 100644 include/linux/platform_data/macb.h
--
1.7.4
^ permalink raw reply
* [PATCH 1/8] macb: unify at91 and avr32 platform data
From: Jamie Iles @ 2011-03-10 10:10 UTC (permalink / raw)
To: netdev, linux-arm-kernel; +Cc: nicolas.ferre, Jamie Iles
In-Reply-To: <1299751843-9743-1-git-send-email-jamie@jamieiles.com>
Both at91 and avr32 defines its own platform data structure for
the macb driver and both share common structures though at91
includes a currently unused phy_irq_pin. Create a common
eth_platform_data for macb that both at91 and avr32 can use. In
future we can use this to support other architectures that use the
same IP block with the macb driver.
Signed-off-by: Jamie Iles <jamie@jamieiles.com>
---
arch/arm/mach-at91/at572d940hf_devices.c | 6 +++---
arch/arm/mach-at91/at91cap9_devices.c | 6 +++---
arch/arm/mach-at91/at91rm9200_devices.c | 6 +++---
arch/arm/mach-at91/at91sam9260_devices.c | 6 +++---
arch/arm/mach-at91/at91sam9263_devices.c | 6 +++---
arch/arm/mach-at91/at91sam9g45_devices.c | 6 +++---
arch/arm/mach-at91/board-1arm.c | 2 +-
arch/arm/mach-at91/board-afeb-9260v1.c | 2 +-
arch/arm/mach-at91/board-at572d940hf_ek.c | 2 +-
arch/arm/mach-at91/board-cam60.c | 2 +-
arch/arm/mach-at91/board-cap9adk.c | 2 +-
arch/arm/mach-at91/board-carmeva.c | 2 +-
arch/arm/mach-at91/board-cpu9krea.c | 2 +-
arch/arm/mach-at91/board-cpuat91.c | 2 +-
arch/arm/mach-at91/board-csb337.c | 2 +-
arch/arm/mach-at91/board-csb637.c | 2 +-
arch/arm/mach-at91/board-eb9200.c | 2 +-
arch/arm/mach-at91/board-ecbat91.c | 2 +-
arch/arm/mach-at91/board-eco920.c | 2 +-
arch/arm/mach-at91/board-foxg20.c | 2 +-
arch/arm/mach-at91/board-gsia18s.c | 2 +-
arch/arm/mach-at91/board-kafa.c | 2 +-
arch/arm/mach-at91/board-kb9202.c | 2 +-
arch/arm/mach-at91/board-neocore926.c | 2 +-
arch/arm/mach-at91/board-pcontrol-g20.c | 2 +-
arch/arm/mach-at91/board-picotux200.c | 2 +-
arch/arm/mach-at91/board-qil-a9260.c | 2 +-
arch/arm/mach-at91/board-rm9200dk.c | 2 +-
arch/arm/mach-at91/board-rm9200ek.c | 2 +-
arch/arm/mach-at91/board-sam9-l9260.c | 2 +-
arch/arm/mach-at91/board-sam9260ek.c | 2 +-
arch/arm/mach-at91/board-sam9263ek.c | 2 +-
arch/arm/mach-at91/board-sam9g20ek.c | 2 +-
arch/arm/mach-at91/board-sam9m10g45ek.c | 2 +-
arch/arm/mach-at91/board-snapper9260.c | 2 +-
arch/arm/mach-at91/board-stamp9g20.c | 2 +-
arch/arm/mach-at91/board-usb-a9260.c | 2 +-
arch/arm/mach-at91/board-usb-a9263.c | 2 +-
arch/arm/mach-at91/board-yl-9200.c | 2 +-
arch/arm/mach-at91/include/mach/board.h | 14 ++------------
arch/avr32/mach-at32ap/include/mach/board.h | 5 +----
drivers/net/macb.c | 4 +---
include/linux/platform_data/macb.h | 10 ++++++++++
43 files changed, 65 insertions(+), 70 deletions(-)
create mode 100644 include/linux/platform_data/macb.h
diff --git a/arch/arm/mach-at91/at572d940hf_devices.c b/arch/arm/mach-at91/at572d940hf_devices.c
index 0fc20a2..6e1b9a3 100644
--- a/arch/arm/mach-at91/at572d940hf_devices.c
+++ b/arch/arm/mach-at91/at572d940hf_devices.c
@@ -140,7 +140,7 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
static u64 eth_dmamask = DMA_BIT_MASK(32);
-static struct at91_eth_data eth_data;
+static struct eth_platform_data eth_data;
static struct resource eth_resources[] = {
[0] = {
@@ -167,7 +167,7 @@ static struct platform_device at572d940hf_eth_device = {
.num_resources = ARRAY_SIZE(eth_resources),
};
-void __init at91_add_device_eth(struct at91_eth_data *data)
+void __init at91_add_device_eth(struct eth_platform_data *data)
{
if (!data)
return;
@@ -196,7 +196,7 @@ void __init at91_add_device_eth(struct at91_eth_data *data)
platform_device_register(&at572d940hf_eth_device);
}
#else
-void __init at91_add_device_eth(struct at91_eth_data *data) {}
+void __init at91_add_device_eth(struct eth_platform_data *data) {}
#endif
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c
index d1f775e..e041743 100644
--- a/arch/arm/mach-at91/at91cap9_devices.c
+++ b/arch/arm/mach-at91/at91cap9_devices.c
@@ -198,7 +198,7 @@ void __init at91_add_device_usba(struct usba_platform_data *data) {}
#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
static u64 eth_dmamask = DMA_BIT_MASK(32);
-static struct at91_eth_data eth_data;
+static struct eth_platform_data eth_data;
static struct resource eth_resources[] = {
[0] = {
@@ -225,7 +225,7 @@ static struct platform_device at91cap9_eth_device = {
.num_resources = ARRAY_SIZE(eth_resources),
};
-void __init at91_add_device_eth(struct at91_eth_data *data)
+void __init at91_add_device_eth(struct eth_platform_data *data)
{
if (!data)
return;
@@ -262,7 +262,7 @@ void __init at91_add_device_eth(struct at91_eth_data *data)
platform_device_register(&at91cap9_eth_device);
}
#else
-void __init at91_add_device_eth(struct at91_eth_data *data) {}
+void __init at91_add_device_eth(struct eth_platform_data *data) {}
#endif
diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c
index 7b53922..5f873d5 100644
--- a/arch/arm/mach-at91/at91rm9200_devices.c
+++ b/arch/arm/mach-at91/at91rm9200_devices.c
@@ -127,7 +127,7 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
#if defined(CONFIG_ARM_AT91_ETHER) || defined(CONFIG_ARM_AT91_ETHER_MODULE)
static u64 eth_dmamask = DMA_BIT_MASK(32);
-static struct at91_eth_data eth_data;
+static struct eth_platform_data eth_data;
static struct resource eth_resources[] = {
[0] = {
@@ -154,7 +154,7 @@ static struct platform_device at91rm9200_eth_device = {
.num_resources = ARRAY_SIZE(eth_resources),
};
-void __init at91_add_device_eth(struct at91_eth_data *data)
+void __init at91_add_device_eth(struct eth_platform_data *data)
{
if (!data)
return;
@@ -191,7 +191,7 @@ void __init at91_add_device_eth(struct at91_eth_data *data)
platform_device_register(&at91rm9200_eth_device);
}
#else
-void __init at91_add_device_eth(struct at91_eth_data *data) {}
+void __init at91_add_device_eth(struct eth_platform_data *data) {}
#endif
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index 07eb7b0..e172b46 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -128,7 +128,7 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
static u64 eth_dmamask = DMA_BIT_MASK(32);
-static struct at91_eth_data eth_data;
+static struct eth_platform_data eth_data;
static struct resource eth_resources[] = {
[0] = {
@@ -155,7 +155,7 @@ static struct platform_device at91sam9260_eth_device = {
.num_resources = ARRAY_SIZE(eth_resources),
};
-void __init at91_add_device_eth(struct at91_eth_data *data)
+void __init at91_add_device_eth(struct eth_platform_data *data)
{
if (!data)
return;
@@ -192,7 +192,7 @@ void __init at91_add_device_eth(struct at91_eth_data *data)
platform_device_register(&at91sam9260_eth_device);
}
#else
-void __init at91_add_device_eth(struct at91_eth_data *data) {}
+void __init at91_add_device_eth(struct eth_platform_data *data) {}
#endif
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
index fb5c23a..416613c 100644
--- a/arch/arm/mach-at91/at91sam9263_devices.c
+++ b/arch/arm/mach-at91/at91sam9263_devices.c
@@ -138,7 +138,7 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
static u64 eth_dmamask = DMA_BIT_MASK(32);
-static struct at91_eth_data eth_data;
+static struct eth_platform_data eth_data;
static struct resource eth_resources[] = {
[0] = {
@@ -165,7 +165,7 @@ static struct platform_device at91sam9263_eth_device = {
.num_resources = ARRAY_SIZE(eth_resources),
};
-void __init at91_add_device_eth(struct at91_eth_data *data)
+void __init at91_add_device_eth(struct eth_platform_data *data)
{
if (!data)
return;
@@ -202,7 +202,7 @@ void __init at91_add_device_eth(struct at91_eth_data *data)
platform_device_register(&at91sam9263_eth_device);
}
#else
-void __init at91_add_device_eth(struct at91_eth_data *data) {}
+void __init at91_add_device_eth(struct eth_platform_data *data) {}
#endif
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
index 1e8f275..0867343 100644
--- a/arch/arm/mach-at91/at91sam9g45_devices.c
+++ b/arch/arm/mach-at91/at91sam9g45_devices.c
@@ -283,7 +283,7 @@ void __init at91_add_device_usba(struct usba_platform_data *data) {}
#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
static u64 eth_dmamask = DMA_BIT_MASK(32);
-static struct at91_eth_data eth_data;
+static struct eth_platform_data eth_data;
static struct resource eth_resources[] = {
[0] = {
@@ -310,7 +310,7 @@ static struct platform_device at91sam9g45_eth_device = {
.num_resources = ARRAY_SIZE(eth_resources),
};
-void __init at91_add_device_eth(struct at91_eth_data *data)
+void __init at91_add_device_eth(struct eth_platform_data *data)
{
if (!data)
return;
@@ -347,7 +347,7 @@ void __init at91_add_device_eth(struct at91_eth_data *data)
platform_device_register(&at91sam9g45_eth_device);
}
#else
-void __init at91_add_device_eth(struct at91_eth_data *data) {}
+void __init at91_add_device_eth(struct eth_platform_data *data) {}
#endif
diff --git a/arch/arm/mach-at91/board-1arm.c b/arch/arm/mach-at91/board-1arm.c
index 8a3fc84..1961d1e 100644
--- a/arch/arm/mach-at91/board-1arm.c
+++ b/arch/arm/mach-at91/board-1arm.c
@@ -64,7 +64,7 @@ static void __init onearm_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata onearm_eth_data = {
+static struct eth_platform_data __initdata onearm_eth_data = {
.phy_irq_pin = AT91_PIN_PC4,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c
index cba7f77..8943ff3 100644
--- a/arch/arm/mach-at91/board-afeb-9260v1.c
+++ b/arch/arm/mach-at91/board-afeb-9260v1.c
@@ -109,7 +109,7 @@ static struct spi_board_info afeb9260_spi_devices[] = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata afeb9260_macb_data = {
+static struct eth_platform_data __initdata afeb9260_macb_data = {
.phy_irq_pin = AT91_PIN_PA9,
.is_rmii = 0,
};
diff --git a/arch/arm/mach-at91/board-at572d940hf_ek.c b/arch/arm/mach-at91/board-at572d940hf_ek.c
index 3929f1c..a17d8e7 100644
--- a/arch/arm/mach-at91/board-at572d940hf_ek.c
+++ b/arch/arm/mach-at91/board-at572d940hf_ek.c
@@ -104,7 +104,7 @@ static struct at91_mmc_data __initdata eb_mmc_data = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata eb_eth_data = {
+static struct eth_platform_data __initdata eb_eth_data = {
.phy_irq_pin = AT91_PIN_PB25,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-cam60.c b/arch/arm/mach-at91/board-cam60.c
index b54e3e6..8cc6bfc 100644
--- a/arch/arm/mach-at91/board-cam60.c
+++ b/arch/arm/mach-at91/board-cam60.c
@@ -121,7 +121,7 @@ static struct spi_board_info cam60_spi_devices[] __initdata = {
/*
* MACB Ethernet device
*/
-static struct __initdata at91_eth_data cam60_macb_data = {
+static struct __initdata eth_platform_data cam60_macb_data = {
.phy_irq_pin = AT91_PIN_PB5,
.is_rmii = 0,
};
diff --git a/arch/arm/mach-at91/board-cap9adk.c b/arch/arm/mach-at91/board-cap9adk.c
index e727444..8f9bc88 100644
--- a/arch/arm/mach-at91/board-cap9adk.c
+++ b/arch/arm/mach-at91/board-cap9adk.c
@@ -158,7 +158,7 @@ static struct at91_mmc_data __initdata cap9adk_mmc_data = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata cap9adk_macb_data = {
+static struct eth_platform_data __initdata cap9adk_macb_data = {
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-carmeva.c b/arch/arm/mach-at91/board-carmeva.c
index 2e74a19..dbc9061 100644
--- a/arch/arm/mach-at91/board-carmeva.c
+++ b/arch/arm/mach-at91/board-carmeva.c
@@ -62,7 +62,7 @@ static void __init carmeva_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata carmeva_eth_data = {
+static struct eth_platform_data __initdata carmeva_eth_data = {
.phy_irq_pin = AT91_PIN_PC4,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c
index 3838594..a7d0843 100644
--- a/arch/arm/mach-at91/board-cpu9krea.c
+++ b/arch/arm/mach-at91/board-cpu9krea.c
@@ -104,7 +104,7 @@ static struct at91_udc_data __initdata cpu9krea_udc_data = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata cpu9krea_macb_data = {
+static struct eth_platform_data __initdata cpu9krea_macb_data = {
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-cpuat91.c b/arch/arm/mach-at91/board-cpuat91.c
index 2f4dd8c..52909f0 100644
--- a/arch/arm/mach-at91/board-cpuat91.c
+++ b/arch/arm/mach-at91/board-cpuat91.c
@@ -83,7 +83,7 @@ static void __init cpuat91_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata cpuat91_eth_data = {
+static struct eth_platform_data __initdata cpuat91_eth_data = {
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-csb337.c b/arch/arm/mach-at91/board-csb337.c
index 464839d..7e062fa 100644
--- a/arch/arm/mach-at91/board-csb337.c
+++ b/arch/arm/mach-at91/board-csb337.c
@@ -63,7 +63,7 @@ static void __init csb337_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata csb337_eth_data = {
+static struct eth_platform_data __initdata csb337_eth_data = {
.phy_irq_pin = AT91_PIN_PC2,
.is_rmii = 0,
};
diff --git a/arch/arm/mach-at91/board-csb637.c b/arch/arm/mach-at91/board-csb637.c
index 431688c..fb8456e 100644
--- a/arch/arm/mach-at91/board-csb637.c
+++ b/arch/arm/mach-at91/board-csb637.c
@@ -57,7 +57,7 @@ static void __init csb637_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata csb637_eth_data = {
+static struct eth_platform_data __initdata csb637_eth_data = {
.phy_irq_pin = AT91_PIN_PC0,
.is_rmii = 0,
};
diff --git a/arch/arm/mach-at91/board-eb9200.c b/arch/arm/mach-at91/board-eb9200.c
index 6cf6566..ac71845 100644
--- a/arch/arm/mach-at91/board-eb9200.c
+++ b/arch/arm/mach-at91/board-eb9200.c
@@ -65,7 +65,7 @@ static void __init eb9200_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata eb9200_eth_data = {
+static struct eth_platform_data __initdata eb9200_eth_data = {
.phy_irq_pin = AT91_PIN_PC4,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-ecbat91.c b/arch/arm/mach-at91/board-ecbat91.c
index de2fd04..aa8fb2a 100644
--- a/arch/arm/mach-at91/board-ecbat91.c
+++ b/arch/arm/mach-at91/board-ecbat91.c
@@ -65,7 +65,7 @@ static void __init ecb_at91init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata ecb_at91eth_data = {
+static struct eth_platform_data __initdata ecb_at91eth_data = {
.phy_irq_pin = AT91_PIN_PC4,
.is_rmii = 0,
};
diff --git a/arch/arm/mach-at91/board-eco920.c b/arch/arm/mach-at91/board-eco920.c
index a158a0c..a1e9173 100644
--- a/arch/arm/mach-at91/board-eco920.c
+++ b/arch/arm/mach-at91/board-eco920.c
@@ -47,7 +47,7 @@ static void __init eco920_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata eco920_eth_data = {
+static struct eth_platform_data __initdata eco920_eth_data = {
.phy_irq_pin = AT91_PIN_PC2,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-foxg20.c b/arch/arm/mach-at91/board-foxg20.c
index dfc7dfe..b7630b9 100644
--- a/arch/arm/mach-at91/board-foxg20.c
+++ b/arch/arm/mach-at91/board-foxg20.c
@@ -141,7 +141,7 @@ static struct spi_board_info foxg20_spi_devices[] = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata foxg20_macb_data = {
+static struct eth_platform_data __initdata foxg20_macb_data = {
.phy_irq_pin = AT91_PIN_PA7,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-gsia18s.c b/arch/arm/mach-at91/board-gsia18s.c
index bc28136..0405b17 100644
--- a/arch/arm/mach-at91/board-gsia18s.c
+++ b/arch/arm/mach-at91/board-gsia18s.c
@@ -98,7 +98,7 @@ static struct at91_udc_data __initdata udc_data = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata macb_data = {
+static struct eth_platform_data __initdata macb_data = {
.phy_irq_pin = AT91_PIN_PA28,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-kafa.c b/arch/arm/mach-at91/board-kafa.c
index d2e1f4e..f45fc82 100644
--- a/arch/arm/mach-at91/board-kafa.c
+++ b/arch/arm/mach-at91/board-kafa.c
@@ -62,7 +62,7 @@ static void __init kafa_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata kafa_eth_data = {
+static struct eth_platform_data __initdata kafa_eth_data = {
.phy_irq_pin = AT91_PIN_PC4,
.is_rmii = 0,
};
diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c
index a13d206..88a40c2 100644
--- a/arch/arm/mach-at91/board-kb9202.c
+++ b/arch/arm/mach-at91/board-kb9202.c
@@ -71,7 +71,7 @@ static void __init kb9202_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata kb9202_eth_data = {
+static struct eth_platform_data __initdata kb9202_eth_data = {
.phy_irq_pin = AT91_PIN_PB29,
.is_rmii = 0,
};
diff --git a/arch/arm/mach-at91/board-neocore926.c b/arch/arm/mach-at91/board-neocore926.c
index fe5f1d4..97890d8 100644
--- a/arch/arm/mach-at91/board-neocore926.c
+++ b/arch/arm/mach-at91/board-neocore926.c
@@ -161,7 +161,7 @@ static struct at91_mmc_data __initdata neocore926_mmc_data = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata neocore926_macb_data = {
+static struct eth_platform_data __initdata neocore926_macb_data = {
.phy_irq_pin = AT91_PIN_PE31,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-pcontrol-g20.c b/arch/arm/mach-at91/board-pcontrol-g20.c
index feb6578..03e8286 100644
--- a/arch/arm/mach-at91/board-pcontrol-g20.c
+++ b/arch/arm/mach-at91/board-pcontrol-g20.c
@@ -129,7 +129,7 @@ static struct at91_udc_data __initdata pcontrol_g20_udc_data = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata macb_data = {
+static struct eth_platform_data __initdata macb_data = {
.phy_irq_pin = AT91_PIN_PA28,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-picotux200.c b/arch/arm/mach-at91/board-picotux200.c
index 55dad3a..3f3cd9c 100644
--- a/arch/arm/mach-at91/board-picotux200.c
+++ b/arch/arm/mach-at91/board-picotux200.c
@@ -65,7 +65,7 @@ static void __init picotux200_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata picotux200_eth_data = {
+static struct eth_platform_data __initdata picotux200_eth_data = {
.phy_irq_pin = AT91_PIN_PC4,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-qil-a9260.c b/arch/arm/mach-at91/board-qil-a9260.c
index 69d15a8..165e43e 100644
--- a/arch/arm/mach-at91/board-qil-a9260.c
+++ b/arch/arm/mach-at91/board-qil-a9260.c
@@ -110,7 +110,7 @@ static struct spi_board_info ek_spi_devices[] = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata ek_macb_data = {
+static struct eth_platform_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PA31,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-rm9200dk.c b/arch/arm/mach-at91/board-rm9200dk.c
index 4c1047c..c31cdda 100644
--- a/arch/arm/mach-at91/board-rm9200dk.c
+++ b/arch/arm/mach-at91/board-rm9200dk.c
@@ -70,7 +70,7 @@ static void __init dk_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata dk_eth_data = {
+static struct eth_platform_data __initdata dk_eth_data = {
.phy_irq_pin = AT91_PIN_PC4,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-rm9200ek.c b/arch/arm/mach-at91/board-rm9200ek.c
index 9df1be8..0fe93aa 100644
--- a/arch/arm/mach-at91/board-rm9200ek.c
+++ b/arch/arm/mach-at91/board-rm9200ek.c
@@ -70,7 +70,7 @@ static void __init ek_init_irq(void)
at91rm9200_init_interrupts(NULL);
}
-static struct at91_eth_data __initdata ek_eth_data = {
+static struct eth_platform_data __initdata ek_eth_data = {
.phy_irq_pin = AT91_PIN_PC4,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-sam9-l9260.c b/arch/arm/mach-at91/board-sam9-l9260.c
index 25a26be..145884d 100644
--- a/arch/arm/mach-at91/board-sam9-l9260.c
+++ b/arch/arm/mach-at91/board-sam9-l9260.c
@@ -115,7 +115,7 @@ static struct spi_board_info ek_spi_devices[] = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata ek_macb_data = {
+static struct eth_platform_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PA7,
.is_rmii = 0,
};
diff --git a/arch/arm/mach-at91/board-sam9260ek.c b/arch/arm/mach-at91/board-sam9260ek.c
index de1816e..fcaedf5 100644
--- a/arch/arm/mach-at91/board-sam9260ek.c
+++ b/arch/arm/mach-at91/board-sam9260ek.c
@@ -156,7 +156,7 @@ static struct spi_board_info ek_spi_devices[] = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata ek_macb_data = {
+static struct eth_platform_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PA7,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c
index bfe490d..4f799a4 100644
--- a/arch/arm/mach-at91/board-sam9263ek.c
+++ b/arch/arm/mach-at91/board-sam9263ek.c
@@ -163,7 +163,7 @@ static struct at91_mmc_data __initdata ek_mmc_data = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata ek_macb_data = {
+static struct eth_platform_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PE31,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c
index ca8198b..d54b3e6 100644
--- a/arch/arm/mach-at91/board-sam9g20ek.c
+++ b/arch/arm/mach-at91/board-sam9g20ek.c
@@ -128,7 +128,7 @@ static struct spi_board_info ek_spi_devices[] = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata ek_macb_data = {
+static struct eth_platform_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PA7,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c
index 6c999db..7df85eb 100644
--- a/arch/arm/mach-at91/board-sam9m10g45ek.c
+++ b/arch/arm/mach-at91/board-sam9m10g45ek.c
@@ -120,7 +120,7 @@ static struct mci_platform_data __initdata mci1_data = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata ek_macb_data = {
+static struct eth_platform_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PD5,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c
index 17f7d9b..6902e7d 100644
--- a/arch/arm/mach-at91/board-snapper9260.c
+++ b/arch/arm/mach-at91/board-snapper9260.c
@@ -70,7 +70,7 @@ static struct at91_udc_data __initdata snapper9260_udc_data = {
.vbus_polled = 1,
};
-static struct at91_eth_data snapper9260_macb_data = {
+static struct eth_platform_data snapper9260_macb_data = {
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-stamp9g20.c b/arch/arm/mach-at91/board-stamp9g20.c
index f8902b1..9a7c586 100644
--- a/arch/arm/mach-at91/board-stamp9g20.c
+++ b/arch/arm/mach-at91/board-stamp9g20.c
@@ -163,7 +163,7 @@ static struct at91_udc_data __initdata stamp9g20evb_udc_data = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata macb_data = {
+static struct eth_platform_data __initdata macb_data = {
.phy_irq_pin = AT91_PIN_PA28,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-usb-a9260.c b/arch/arm/mach-at91/board-usb-a9260.c
index 07784ba..c756389 100644
--- a/arch/arm/mach-at91/board-usb-a9260.c
+++ b/arch/arm/mach-at91/board-usb-a9260.c
@@ -84,7 +84,7 @@ static struct at91_udc_data __initdata ek_udc_data = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata ek_macb_data = {
+static struct eth_platform_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PA31,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-usb-a9263.c b/arch/arm/mach-at91/board-usb-a9263.c
index b614508..e6c260d 100644
--- a/arch/arm/mach-at91/board-usb-a9263.c
+++ b/arch/arm/mach-at91/board-usb-a9263.c
@@ -97,7 +97,7 @@ static struct spi_board_info ek_spi_devices[] = {
/*
* MACB Ethernet device
*/
-static struct at91_eth_data __initdata ek_macb_data = {
+static struct eth_platform_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PE31,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/board-yl-9200.c b/arch/arm/mach-at91/board-yl-9200.c
index e0f0080..102dfc1 100644
--- a/arch/arm/mach-at91/board-yl-9200.c
+++ b/arch/arm/mach-at91/board-yl-9200.c
@@ -112,7 +112,7 @@ static struct gpio_led yl9200_leds[] = {
/*
* Ethernet
*/
-static struct at91_eth_data __initdata yl9200_eth_data = {
+static struct eth_platform_data __initdata yl9200_eth_data = {
.phy_irq_pin = AT91_PIN_PB28,
.is_rmii = 1,
};
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h
index 2b499eb..d970420 100644
--- a/arch/arm/mach-at91/include/mach/board.h
+++ b/arch/arm/mach-at91/include/mach/board.h
@@ -40,6 +40,7 @@
#include <linux/atmel-mci.h>
#include <sound/atmel-ac97c.h>
#include <linux/serial.h>
+#include <linux/platform_data/macb.h>
/* USB Device */
struct at91_udc_data {
@@ -81,18 +82,7 @@ extern void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
/* atmel-mci platform config */
extern void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data);
- /* Ethernet (EMAC & MACB) */
-struct at91_eth_data {
- u32 phy_mask;
- u8 phy_irq_pin; /* PHY IRQ */
- u8 is_rmii; /* using RMII interface? */
-};
-extern void __init at91_add_device_eth(struct at91_eth_data *data);
-
-#if defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91SAM9G20) || defined(CONFIG_ARCH_AT91CAP9) \
- || defined(CONFIG_ARCH_AT91SAM9G45) || defined(CONFIG_ARCH_AT572D940HF)
-#define eth_platform_data at91_eth_data
-#endif
+extern void __init at91_add_device_eth(struct eth_platform_data *data);
/* USB Host */
struct at91_usbh_data {
diff --git a/arch/avr32/mach-at32ap/include/mach/board.h b/arch/avr32/mach-at32ap/include/mach/board.h
index 6174020..3d79356 100644
--- a/arch/avr32/mach-at32ap/include/mach/board.h
+++ b/arch/avr32/mach-at32ap/include/mach/board.h
@@ -6,6 +6,7 @@
#include <linux/types.h>
#include <linux/serial.h>
+#include <linux/platform_data/macb.h>
#define GPIO_PIN_NONE (-1)
@@ -41,10 +42,6 @@ struct atmel_uart_data {
void at32_map_usart(unsigned int hw_id, unsigned int line, int flags);
struct platform_device *at32_add_device_usart(unsigned int id);
-struct eth_platform_data {
- u32 phy_mask;
- u8 is_rmii;
-};
struct platform_device *
at32_add_device_eth(unsigned int id, struct eth_platform_data *data);
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 79ccb54..bfd3601 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -18,12 +18,10 @@
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/dma-mapping.h>
+#include <linux/platform_data/macb.h>
#include <linux/platform_device.h>
#include <linux/phy.h>
-#include <mach/board.h>
-#include <mach/cpu.h>
-
#include "macb.h"
#define RX_BUFFER_SIZE 128
diff --git a/include/linux/platform_data/macb.h b/include/linux/platform_data/macb.h
new file mode 100644
index 0000000..beddfd3
--- /dev/null
+++ b/include/linux/platform_data/macb.h
@@ -0,0 +1,10 @@
+#ifndef __MACB_PDATA_H__
+#define __MACB_PDATA_H__
+
+struct eth_platform_data {
+ u32 phy_mask;
+ u8 phy_irq_pin; /* PHY IRQ */
+ u8 is_rmii; /* using RMII interface? */
+};
+
+#endif /* __MACB_PDATA_H__ */
--
1.7.4
^ permalink raw reply related
* [PATCH 2/8] macb: detect hclk presence from platform data
From: Jamie Iles @ 2011-03-10 10:10 UTC (permalink / raw)
To: netdev, linux-arm-kernel; +Cc: nicolas.ferre, Jamie Iles
In-Reply-To: <1299751843-9743-1-git-send-email-jamie@jamieiles.com>
Rather than detecting whether we need to do a clk_get() and enable on
the "hclk" based on the kernel configuration, add an extra field to the
platform data. This makes it cleaner to add more supported
architectures without lots of ifdeffery.
This requires that all instantiations of the device have platform data
defined but that is the case currently anyway.
Signed-off-by: Jamie Iles <jamie@jamieiles.com>
---
arch/avr32/mach-at32ap/at32ap700x.c | 2 +
drivers/net/macb.c | 77 ++++++++++++++++++-----------------
include/linux/platform_data/macb.h | 1 +
3 files changed, 43 insertions(+), 37 deletions(-)
diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c
index 2747cde..2abcafd 100644
--- a/arch/avr32/mach-at32ap/at32ap700x.c
+++ b/arch/avr32/mach-at32ap/at32ap700x.c
@@ -1088,6 +1088,8 @@ at32_add_device_eth(unsigned int id, struct eth_platform_data *data)
struct platform_device *pdev;
u32 pin_mask;
+ data->have_hclk = 1;
+
switch (id) {
case 0:
pdev = &macb0_device;
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index bfd3601..ae98fee 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -246,9 +246,7 @@ static int macb_mii_init(struct macb *bp)
bp->mii_bus->parent = &bp->dev->dev;
pdata = bp->pdev->dev.platform_data;
- if (pdata)
- bp->mii_bus->phy_mask = pdata->phy_mask;
-
+ bp->mii_bus->phy_mask = pdata->phy_mask;
bp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
if (!bp->mii_bus->irq) {
err = -ENOMEM;
@@ -1103,9 +1101,14 @@ static const struct net_device_ops macb_netdev_ops = {
#endif
};
+#ifdef CONFIG_ARCH_AT91
+#define PCLK_NAME "macb_clk"
+#else /* CONFIG_ARCH_AT91 */
+#define PCLK_NAME "pclk"
+#endif
+
static int __init macb_probe(struct platform_device *pdev)
{
- struct eth_platform_data *pdata;
struct resource *regs;
struct net_device *dev;
struct macb *bp;
@@ -1113,6 +1116,7 @@ static int __init macb_probe(struct platform_device *pdev)
unsigned long pclk_hz;
u32 config;
int err = -ENXIO;
+ struct eth_platform_data *pdata;
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!regs) {
@@ -1120,6 +1124,13 @@ static int __init macb_probe(struct platform_device *pdev)
goto err_out;
}
+ err = -EINVAL;
+ pdata = dev_get_platdata(&pdev->dev);
+ if (!pdata) {
+ dev_err(&pdev->dev, "no platform data present\n");
+ goto err_out;
+ }
+
err = -ENOMEM;
dev = alloc_etherdev(sizeof(*bp));
if (!dev) {
@@ -1138,28 +1149,22 @@ static int __init macb_probe(struct platform_device *pdev)
spin_lock_init(&bp->lock);
-#if defined(CONFIG_ARCH_AT91)
- bp->pclk = clk_get(&pdev->dev, "macb_clk");
+ bp->pclk = clk_get(&pdev->dev, PCLK_NAME);
if (IS_ERR(bp->pclk)) {
dev_err(&pdev->dev, "failed to get macb_clk\n");
goto err_out_free_dev;
}
clk_enable(bp->pclk);
-#else
- bp->pclk = clk_get(&pdev->dev, "pclk");
- if (IS_ERR(bp->pclk)) {
- dev_err(&pdev->dev, "failed to get pclk\n");
- goto err_out_free_dev;
- }
- bp->hclk = clk_get(&pdev->dev, "hclk");
- if (IS_ERR(bp->hclk)) {
- dev_err(&pdev->dev, "failed to get hclk\n");
- goto err_out_put_pclk;
+
+ if (pdata->have_hclk) {
+ bp->hclk = clk_get(&pdev->dev, "hclk");
+ if (IS_ERR(bp->hclk)) {
+ dev_err(&pdev->dev, "failed to get hclk\n");
+ goto err_out_put_pclk;
+ }
+ clk_enable(bp->hclk);
}
- clk_enable(bp->pclk);
- clk_enable(bp->hclk);
-#endif
bp->regs = ioremap(regs->start, regs->end - regs->start + 1);
if (!bp->regs) {
@@ -1197,9 +1202,8 @@ static int __init macb_probe(struct platform_device *pdev)
macb_writel(bp, NCFGR, config);
macb_get_hwaddr(bp);
- pdata = pdev->dev.platform_data;
- if (pdata && pdata->is_rmii)
+ if (pdata->is_rmii)
#if defined(CONFIG_ARCH_AT91)
macb_writel(bp, USRIO, (MACB_BIT(RMII) | MACB_BIT(CLKEN)) );
#else
@@ -1243,14 +1247,12 @@ err_out_free_irq:
err_out_iounmap:
iounmap(bp->regs);
err_out_disable_clocks:
-#ifndef CONFIG_ARCH_AT91
- clk_disable(bp->hclk);
- clk_put(bp->hclk);
-#endif
+ if (pdata->have_hclk) {
+ clk_disable(bp->hclk);
+ clk_put(bp->hclk);
+ }
clk_disable(bp->pclk);
-#ifndef CONFIG_ARCH_AT91
err_out_put_pclk:
-#endif
clk_put(bp->pclk);
err_out_free_dev:
free_netdev(dev);
@@ -1263,6 +1265,7 @@ static int __exit macb_remove(struct platform_device *pdev)
{
struct net_device *dev;
struct macb *bp;
+ struct eth_platform_data *pdata = dev_get_platdata(&pdev->dev);
dev = platform_get_drvdata(pdev);
@@ -1276,10 +1279,10 @@ static int __exit macb_remove(struct platform_device *pdev)
unregister_netdev(dev);
free_irq(dev->irq, dev);
iounmap(bp->regs);
-#ifndef CONFIG_ARCH_AT91
- clk_disable(bp->hclk);
- clk_put(bp->hclk);
-#endif
+ if (pdata->have_hclk) {
+ clk_disable(bp->hclk);
+ clk_put(bp->hclk);
+ }
clk_disable(bp->pclk);
clk_put(bp->pclk);
free_netdev(dev);
@@ -1294,12 +1297,12 @@ static int macb_suspend(struct platform_device *pdev, pm_message_t state)
{
struct net_device *netdev = platform_get_drvdata(pdev);
struct macb *bp = netdev_priv(netdev);
+ struct eth_platform_data *pdata = dev_get_platdata(&pdev->dev);
netif_device_detach(netdev);
-#ifndef CONFIG_ARCH_AT91
- clk_disable(bp->hclk);
-#endif
+ if (pdata->have_hclk)
+ clk_disable(bp->hclk);
clk_disable(bp->pclk);
return 0;
@@ -1309,11 +1312,11 @@ static int macb_resume(struct platform_device *pdev)
{
struct net_device *netdev = platform_get_drvdata(pdev);
struct macb *bp = netdev_priv(netdev);
+ struct eth_platform_data *pdata = dev_get_platdata(&pdev->dev);
clk_enable(bp->pclk);
-#ifndef CONFIG_ARCH_AT91
- clk_enable(bp->hclk);
-#endif
+ if (pdata->have_hclk)
+ clk_enable(bp->hclk);
netif_device_attach(netdev);
diff --git a/include/linux/platform_data/macb.h b/include/linux/platform_data/macb.h
index beddfd3..ae18579 100644
--- a/include/linux/platform_data/macb.h
+++ b/include/linux/platform_data/macb.h
@@ -5,6 +5,7 @@ struct eth_platform_data {
u32 phy_mask;
u8 phy_irq_pin; /* PHY IRQ */
u8 is_rmii; /* using RMII interface? */
+ int have_hclk; /* have hclk as well as pclk */
};
#endif /* __MACB_PDATA_H__ */
--
1.7.4
^ permalink raw reply related
* [PATCH 3/8] macb: convert printk to pr_ and friends
From: Jamie Iles @ 2011-03-10 10:10 UTC (permalink / raw)
To: netdev, linux-arm-kernel; +Cc: nicolas.ferre, Jamie Iles
In-Reply-To: <1299751843-9743-1-git-send-email-jamie@jamieiles.com>
macb is already using the dev_dbg() and friends helpers so use pr_foo()
along with a pr_fmt() definition to make the printing a little cleaner.
Signed-off-by: Jamie Iles <jamie@jamieiles.com>
---
drivers/net/macb.c | 34 +++++++++++++++++-----------------
1 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index ae98fee..5d676ad 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -8,6 +8,7 @@
* published by the Free Software Foundation.
*/
+#define pr_fmt(fmt) "macb: " fmt
#include <linux/clk.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
@@ -175,11 +176,11 @@ static void macb_handle_link_change(struct net_device *dev)
if (status_change) {
if (phydev->link)
- printk(KERN_INFO "%s: link up (%d/%s)\n",
+ pr_info("%s: link up (%d/%s)\n",
dev->name, phydev->speed,
DUPLEX_FULL == phydev->duplex ? "Full":"Half");
else
- printk(KERN_INFO "%s: link down\n", dev->name);
+ pr_info("%s: link down\n", dev->name);
}
}
@@ -193,7 +194,7 @@ static int macb_mii_probe(struct net_device *dev)
phydev = phy_find_first(bp->mii_bus);
if (!phydev) {
- printk (KERN_ERR "%s: no PHY found\n", dev->name);
+ pr_err("%s: no PHY found\n", dev->name);
return -1;
}
@@ -206,7 +207,7 @@ static int macb_mii_probe(struct net_device *dev)
PHY_INTERFACE_MODE_RMII :
PHY_INTERFACE_MODE_MII);
if (ret) {
- printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
+ pr_err("%s: Could not attach to PHY\n", dev->name);
return ret;
}
@@ -303,7 +304,7 @@ static void macb_tx(struct macb *bp)
if (status & (MACB_BIT(UND) | MACB_BIT(TSR_RLE))) {
int i;
- printk(KERN_ERR "%s: TX %s, resetting buffers\n",
+ pr_err("%s: TX %s, resetting buffers\n",
bp->dev->name, status & MACB_BIT(UND) ?
"underrun" : "retry limit exceeded");
@@ -574,10 +575,11 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
if (status & MACB_BIT(HRESP)) {
/*
- * TODO: Reset the hardware, and maybe move the printk
- * to a lower-priority context as well (work queue?)
+ * TODO: Reset the hardware, and maybe move the
+ * pr_err to a lower-priority context as well (work
+ * queue?)
*/
- printk(KERN_ERR "%s: DMA bus error: HRESP not OK\n",
+ pr_err("%s: DMA bus error: HRESP not OK\n",
dev->name);
}
@@ -950,9 +952,8 @@ static int macb_open(struct net_device *dev)
err = macb_alloc_consistent(bp);
if (err) {
- printk(KERN_ERR
- "%s: Unable to allocate DMA memory (error %d)\n",
- dev->name, err);
+ pr_err("%s: Unable to allocate DMA memory (error %d)\n",
+ dev->name, err);
return err;
}
@@ -1177,9 +1178,8 @@ static int __init macb_probe(struct platform_device *pdev)
err = request_irq(dev->irq, macb_interrupt, IRQF_SAMPLE_RANDOM,
dev->name, dev);
if (err) {
- printk(KERN_ERR
- "%s: Unable to request IRQ %d (error %d)\n",
- dev->name, dev->irq, err);
+ pr_err("%s: Unable to request IRQ %d (error %d)\n",
+ dev->name, dev->irq, err);
goto err_out_iounmap;
}
@@ -1230,11 +1230,11 @@ static int __init macb_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, dev);
- printk(KERN_INFO "%s: Atmel MACB at 0x%08lx irq %d (%pM)\n",
- dev->name, dev->base_addr, dev->irq, dev->dev_addr);
+ pr_info("%s: Atmel MACB at 0x%08lx irq %d (%pM)\n",
+ dev->name, dev->base_addr, dev->irq, dev->dev_addr);
phydev = bp->phy_dev;
- printk(KERN_INFO "%s: attached PHY driver [%s] "
+ pr_info("%s: attached PHY driver [%s] "
"(mii_bus:phy_addr=%s, irq=%d)\n", dev->name,
phydev->drv->name, dev_name(&phydev->dev), phydev->irq);
--
1.7.4
^ permalink raw reply related
* [PATCH 4/8] macb: initial support for Cadence GEM
From: Jamie Iles @ 2011-03-10 10:10 UTC (permalink / raw)
To: netdev, linux-arm-kernel; +Cc: nicolas.ferre, Jamie Iles
In-Reply-To: <1299751843-9743-1-git-send-email-jamie@jamieiles.com>
The Cadence GEM is based on the MACB Ethernet controller but has a few
small changes with regards to register and bitfield placement. This
patch adds a new platform driver for gem which sets allows the driver to
tell at runtime whether it is targetting a GEM device.
Signed-off-by: Jamie Iles <jamie@jamieiles.com>
---
drivers/net/Kconfig | 8 ++++--
drivers/net/macb.c | 53 ++++++++++++++++++++++++++++++++++++++++++--------
drivers/net/macb.h | 18 +++++++++++++++++
3 files changed, 67 insertions(+), 12 deletions(-)
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 6bd5caa..6de335a 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -223,12 +223,14 @@ menuconfig NET_ETHERNET
if NET_ETHERNET
config MACB
- tristate "Atmel MACB support"
+ tristate "Cadence MACB/GEM support"
depends on HAVE_NET_MACB
select PHYLIB
help
- The Atmel MACB ethernet interface is found on many AT32 and AT91
- parts. Say Y to include support for the MACB chip.
+ The Cadence MACB ethernet interface is found on many Atmel AT32 and
+ AT91 parts. This driver also supports the Cadence GEM (Gigabit
+ Ethernet MAC found in some ARM SoC devices). Note: the Gigabit mode
+ is not yet supported. Say Y to include support for the MACB/GEM chip.
To compile this driver as a module, choose M here: the module
will be called macb.
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 5d676ad..204afa6 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -1,5 +1,5 @@
/*
- * Atmel MACB Ethernet Controller driver
+ * Cadence MACB/GEM Ethernet Controller driver
*
* Copyright (C) 2004-2006 Atmel Corporation
*
@@ -7,7 +7,6 @@
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
-
#define pr_fmt(fmt) "macb: " fmt
#include <linux/clk.h>
#include <linux/module.h>
@@ -1108,7 +1107,7 @@ static const struct net_device_ops macb_netdev_ops = {
#define PCLK_NAME "pclk"
#endif
-static int __init macb_probe(struct platform_device *pdev)
+static int __macb_probe(struct platform_device *pdev, int is_gem)
{
struct resource *regs;
struct net_device *dev;
@@ -1147,6 +1146,7 @@ static int __init macb_probe(struct platform_device *pdev)
bp = netdev_priv(dev);
bp->pdev = pdev;
bp->dev = dev;
+ bp->is_gem = is_gem;
spin_lock_init(&bp->lock);
@@ -1230,8 +1230,9 @@ static int __init macb_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, dev);
- pr_info("%s: Atmel MACB at 0x%08lx irq %d (%pM)\n",
- dev->name, dev->base_addr, dev->irq, dev->dev_addr);
+ pr_info("%s: Cadence %s at 0x%08lx irq %d (%pM)\n",
+ dev->name, bp->is_gem ? "GEM" : "MACB", dev->base_addr,
+ dev->irq, dev->dev_addr);
phydev = bp->phy_dev;
pr_info("%s: attached PHY driver [%s] "
@@ -1261,7 +1262,17 @@ err_out:
return err;
}
-static int __exit macb_remove(struct platform_device *pdev)
+static int __devinit macb_probe(struct platform_device *pdev)
+{
+ return __macb_probe(pdev, 0);
+}
+
+static int __devinit gem_probe(struct platform_device *pdev)
+{
+ return __macb_probe(pdev, 1);
+}
+
+static int __devexit macb_remove(struct platform_device *pdev)
{
struct net_device *dev;
struct macb *bp;
@@ -1328,7 +1339,8 @@ static int macb_resume(struct platform_device *pdev)
#endif
static struct platform_driver macb_driver = {
- .remove = __exit_p(macb_remove),
+ .probe = macb_probe,
+ .remove = __devexit_p(macb_remove),
.suspend = macb_suspend,
.resume = macb_resume,
.driver = {
@@ -1337,20 +1349,43 @@ static struct platform_driver macb_driver = {
},
};
+static struct platform_driver gem_driver = {
+ .probe = gem_probe,
+ .remove = __devexit_p(macb_remove),
+ .suspend = macb_suspend,
+ .resume = macb_resume,
+ .driver = {
+ .name = "gem",
+ .owner = THIS_MODULE,
+ },
+};
+
static int __init macb_init(void)
{
- return platform_driver_probe(&macb_driver, macb_probe);
+ int ret;
+
+ ret = platform_driver_register(&macb_driver);
+ if (ret)
+ return ret;
+
+ ret = platform_driver_register(&gem_driver);
+ if (ret)
+ platform_driver_unregister(&macb_driver);
+
+ return ret;
+
}
static void __exit macb_exit(void)
{
platform_driver_unregister(&macb_driver);
+ platform_driver_unregister(&gem_driver);
}
module_init(macb_init);
module_exit(macb_exit);
MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("Atmel MACB Ethernet driver");
+MODULE_DESCRIPTION("Cadence MACB/GEM Ethernet driver");
MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
MODULE_ALIAS("platform:macb");
diff --git a/drivers/net/macb.h b/drivers/net/macb.h
index d3212f6..f838615 100644
--- a/drivers/net/macb.h
+++ b/drivers/net/macb.h
@@ -254,11 +254,28 @@
<< MACB_##name##_OFFSET)) \
| MACB_BF(name,value))
+#define GEM_BIT(name) \
+ (1 << GEM_##name##_OFFSET)
+#define GEM_BF(name,value) \
+ (((value) & ((1 << GEM_##name##_SIZE) - 1)) \
+ << GEM_##name##_OFFSET)
+#define GEM_BFEXT(name,value)\
+ (((value) >> GEM_##name##_OFFSET) \
+ & ((1 << GEM_##name##_SIZE) - 1))
+#define GEM_BFINS(name,value,old) \
+ (((old) & ~(((1 << GEM_##name##_SIZE) - 1) \
+ << GEM_##name##_OFFSET)) \
+ | GEM_BF(name,value))
+
/* Register access macros */
#define macb_readl(port,reg) \
__raw_readl((port)->regs + MACB_##reg)
#define macb_writel(port,reg,value) \
__raw_writel((value), (port)->regs + MACB_##reg)
+#define gem_readl(port,reg) \
+ __raw_readl((port)->regs + GEM_##reg)
+#define gem_writel(port,reg,value) \
+ __raw_writel((value), (port)->regs + GEM_##reg)
struct dma_desc {
u32 addr;
@@ -360,6 +377,7 @@ struct macb_stats {
struct macb {
void __iomem *regs;
+ int is_gem;
unsigned int rx_tail;
struct dma_desc *rx_ring;
--
1.7.4
^ permalink raw reply related
* [PATCH 6/8] macb: support higher rate GEM MDIO clock divisors
From: Jamie Iles @ 2011-03-10 10:10 UTC (permalink / raw)
To: netdev, linux-arm-kernel; +Cc: nicolas.ferre, Jamie Iles
In-Reply-To: <1299751843-9743-1-git-send-email-jamie@jamieiles.com>
GEM devices support larger clock divisors and have a different
range of divisors. Program the MDIO clock divisors based on the
device type.
Signed-off-by: Jamie Iles <jamie@jamieiles.com>
---
drivers/net/macb.c | 49 ++++++++++++++++++++++++++++++++++++++++---------
drivers/net/macb.h | 11 +++++++++++
2 files changed, 51 insertions(+), 9 deletions(-)
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 2541e3b..dbc6e7ea 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -801,7 +801,8 @@ static void macb_init_hw(struct macb *bp)
macb_reset_hw(bp);
__macb_set_hwaddr(bp);
- config = macb_readl(bp, NCFGR) & MACB_BF(CLK, -1L);
+ config = bp->is_gem ? macb_readl(bp, NCFGR) & GEM_BF(CLK, -1L) :
+ macb_readl(bp, NCFGR) & MACB_BF(CLK, -1L);
config |= MACB_BIT(PAE); /* PAuse Enable */
config |= MACB_BIT(DRFCS); /* Discard Rx FCS */
config |= MACB_BIT(BIG); /* Receive oversized frames */
@@ -1118,6 +1119,42 @@ static const struct net_device_ops macb_netdev_ops = {
#define PCLK_NAME "pclk"
#endif
+static u32 macb_mdc_clk_div(unsigned long pclk_hz)
+{
+ u32 config;
+
+ if (pclk_hz <= 20000000)
+ config = MACB_BF(CLK, MACB_CLK_DIV8);
+ else if (pclk_hz <= 40000000)
+ config = MACB_BF(CLK, MACB_CLK_DIV16);
+ else if (pclk_hz <= 80000000)
+ config = MACB_BF(CLK, MACB_CLK_DIV32);
+ else
+ config = MACB_BF(CLK, MACB_CLK_DIV64);
+
+ return config;
+}
+
+static u32 gem_mdc_clk_div(unsigned long pclk_hz)
+{
+ u32 config;
+
+ if (pclk_hz <= 20000000)
+ config = GEM_BF(CLK, GEM_CLK_DIV8);
+ else if (pclk_hz <= 40000000)
+ config = GEM_BF(CLK, GEM_CLK_DIV16);
+ else if (pclk_hz <= 80000000)
+ config = GEM_BF(CLK, GEM_CLK_DIV32);
+ else if (pclk_hz <= 120000000)
+ config = GEM_BF(CLK, GEM_CLK_DIV48);
+ else if (pclk_hz <= 160000000)
+ config = GEM_BF(CLK, GEM_CLK_DIV64);
+ else
+ config = GEM_BF(CLK, GEM_CLK_DIV96);
+
+ return config;
+}
+
static int __macb_probe(struct platform_device *pdev, int is_gem)
{
struct resource *regs;
@@ -1202,14 +1239,8 @@ static int __macb_probe(struct platform_device *pdev, int is_gem)
/* Set MII management clock divider */
pclk_hz = clk_get_rate(bp->pclk);
- if (pclk_hz <= 20000000)
- config = MACB_BF(CLK, MACB_CLK_DIV8);
- else if (pclk_hz <= 40000000)
- config = MACB_BF(CLK, MACB_CLK_DIV16);
- else if (pclk_hz <= 80000000)
- config = MACB_BF(CLK, MACB_CLK_DIV32);
- else
- config = MACB_BF(CLK, MACB_CLK_DIV64);
+ config = bp->is_gem ? gem_mdc_clk_div(pclk_hz) :
+ macb_mdc_clk_div(pclk_hz);
macb_writel(bp, NCFGR, config);
macb_get_hwaddr(bp);
diff --git a/drivers/net/macb.h b/drivers/net/macb.h
index 6248af6..4cd1e41 100644
--- a/drivers/net/macb.h
+++ b/drivers/net/macb.h
@@ -130,6 +130,9 @@
#define MACB_IRXFCS_OFFSET 19
#define MACB_IRXFCS_SIZE 1
+/* GEM specific NCFGR bitfields. */
+#define GEM_CLK_OFFSET 18
+#define GEM_CLK_SIZE 3
/* Bitfields in NSR */
#define MACB_NSR_LINK_OFFSET 0
#define MACB_NSR_LINK_SIZE 1
@@ -238,6 +241,14 @@
#define MACB_CLK_DIV32 2
#define MACB_CLK_DIV64 3
+/* GEM specific constants for CLK. */
+#define GEM_CLK_DIV8 0
+#define GEM_CLK_DIV16 1
+#define GEM_CLK_DIV32 2
+#define GEM_CLK_DIV48 3
+#define GEM_CLK_DIV64 4
+#define GEM_CLK_DIV96 5
+
/* Constants for MAN register */
#define MACB_MAN_SOF 1
#define MACB_MAN_WRITE 1
--
1.7.4
^ permalink raw reply related
* [PATCH 7/8] macb: support statistics for GEM devices
From: Jamie Iles @ 2011-03-10 10:10 UTC (permalink / raw)
To: netdev, linux-arm-kernel; +Cc: nicolas.ferre, Jamie Iles
In-Reply-To: <1299751843-9743-1-git-send-email-jamie@jamieiles.com>
GEM devices have a different number of statistics registers and they
are at a different offset to MACB devices. Make the statistics
collection method dependent on device type.
Signed-off-by: Jamie Iles <jamie@jamieiles.com>
---
drivers/net/macb.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++--
drivers/net/macb.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 107 insertions(+), 4 deletions(-)
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index dbc6e7ea..2965405 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -291,8 +291,8 @@ err_out:
static void macb_update_stats(struct macb *bp)
{
u32 __iomem *reg = bp->regs + MACB_PFR;
- u32 *p = &bp->hw_stats.rx_pause_frames;
- u32 *end = &bp->hw_stats.tx_pause_frames + 1;
+ u32 *p = &bp->hw_stats.macb.rx_pause_frames;
+ u32 *end = &bp->hw_stats.macb.tx_pause_frames + 1;
WARN_ON((unsigned long)(end - p - 1) != (MACB_TPF - MACB_PFR) / 4);
@@ -1002,11 +1002,62 @@ static int macb_close(struct net_device *dev)
return 0;
}
+static void gem_update_stats(struct macb *bp)
+{
+ u32 __iomem *reg = bp->regs + GEM_OTX;
+ u32 *p = &bp->hw_stats.gem.tx_octets_31_0;
+ u32 *end = &bp->hw_stats.gem.rx_udp_checksum_errors + 1;
+
+ for (; p < end; p++, reg++)
+ *p += __raw_readl(reg);
+}
+
+static struct net_device_stats *gem_get_stats(struct macb *bp)
+{
+ struct gem_stats *hwstat = &bp->hw_stats.gem;
+ struct net_device_stats *nstat = &bp->stats;
+
+ gem_update_stats(bp);
+
+ nstat->rx_errors = (hwstat->rx_frame_check_sequence_errors +
+ hwstat->rx_alignment_errors +
+ hwstat->rx_resource_errors +
+ hwstat->rx_overruns +
+ hwstat->rx_oversize_frames +
+ hwstat->rx_jabbers +
+ hwstat->rx_undersized_frames +
+ hwstat->rx_length_field_frame_errors);
+ nstat->tx_errors = (hwstat->tx_late_collisions +
+ hwstat->tx_excessive_collisions +
+ hwstat->tx_underrun +
+ hwstat->tx_carrier_sense_errors);
+ nstat->multicast = hwstat->rx_multicast_frames;
+ nstat->collisions = (hwstat->tx_single_collision_frames +
+ hwstat->tx_multiple_collision_frames +
+ hwstat->tx_excessive_collisions);
+ nstat->rx_length_errors = (hwstat->rx_oversize_frames +
+ hwstat->rx_jabbers +
+ hwstat->rx_undersized_frames +
+ hwstat->rx_length_field_frame_errors);
+ nstat->rx_over_errors = hwstat->rx_resource_errors;
+ nstat->rx_crc_errors = hwstat->rx_frame_check_sequence_errors;
+ nstat->rx_frame_errors = hwstat->rx_alignment_errors;
+ nstat->rx_fifo_errors = hwstat->rx_overruns;
+ nstat->tx_aborted_errors = hwstat->tx_excessive_collisions;
+ nstat->tx_carrier_errors = hwstat->tx_carrier_sense_errors;
+ nstat->tx_fifo_errors = hwstat->tx_underrun;
+
+ return nstat;
+}
+
static struct net_device_stats *macb_get_stats(struct net_device *dev)
{
struct macb *bp = netdev_priv(dev);
struct net_device_stats *nstat = &bp->stats;
- struct macb_stats *hwstat = &bp->hw_stats;
+ struct macb_stats *hwstat = &bp->hw_stats.macb;
+
+ if (bp->is_gem)
+ return gem_get_stats(bp);
/* read stats from hardware */
macb_update_stats(bp);
diff --git a/drivers/net/macb.h b/drivers/net/macb.h
index 4cd1e41..bc2e2c0 100644
--- a/drivers/net/macb.h
+++ b/drivers/net/macb.h
@@ -63,6 +63,7 @@
/* GEM register offsets. */
#define GEM_SA1B 0x0088
#define GEM_SA1T 0x008C
+#define GEM_OTX 0x0100
/* Bitfields in NCR */
#define MACB_LB_OFFSET 0
@@ -390,6 +391,54 @@ struct macb_stats {
u32 tx_pause_frames;
};
+struct gem_stats {
+ u32 tx_octets_31_0;
+ u32 tx_octets_47_32;
+ u32 tx_frames;
+ u32 tx_broadcast_frames;
+ u32 tx_multicast_frames;
+ u32 tx_pause_frames;
+ u32 tx_64_byte_frames;
+ u32 tx_65_127_byte_frames;
+ u32 tx_128_255_byte_frames;
+ u32 tx_256_511_byte_frames;
+ u32 tx_512_1023_byte_frames;
+ u32 tx_1024_1518_byte_frames;
+ u32 tx_greater_than_1518_byte_frames;
+ u32 tx_underrun;
+ u32 tx_single_collision_frames;
+ u32 tx_multiple_collision_frames;
+ u32 tx_excessive_collisions;
+ u32 tx_late_collisions;
+ u32 tx_deferred_frames;
+ u32 tx_carrier_sense_errors;
+ u32 rx_octets_31_0;
+ u32 rx_octets_47_32;
+ u32 rx_frames;
+ u32 rx_broadcast_frames;
+ u32 rx_multicast_frames;
+ u32 rx_pause_frames;
+ u32 rx_64_byte_frames;
+ u32 rx_65_127_byte_frames;
+ u32 rx_128_255_byte_frames;
+ u32 rx_256_511_byte_frames;
+ u32 rx_512_1023_byte_frames;
+ u32 rx_1024_1518_byte_frames;
+ u32 rx_greater_than_1518_byte_frames;
+ u32 rx_undersized_frames;
+ u32 rx_oversize_frames;
+ u32 rx_jabbers;
+ u32 rx_frame_check_sequence_errors;
+ u32 rx_length_field_frame_errors;
+ u32 rx_symbol_errors;
+ u32 rx_alignment_errors;
+ u32 rx_resource_errors;
+ u32 rx_overruns;
+ u32 rx_ip_header_checksum_errors;
+ u32 rx_tcp_checksum_errors;
+ u32 rx_udp_checksum_errors;
+};
+
struct macb {
void __iomem *regs;
int is_gem;
@@ -409,7 +458,10 @@ struct macb {
struct net_device *dev;
struct napi_struct napi;
struct net_device_stats stats;
- struct macb_stats hw_stats;
+ union {
+ struct macb_stats macb;
+ struct gem_stats gem;
+ } hw_stats;
dma_addr_t rx_ring_dma;
dma_addr_t tx_ring_dma;
--
1.7.4
^ permalink raw reply related
* [PATCH 5/8] macb: handle HW address registers for GEM devices
From: Jamie Iles @ 2011-03-10 10:10 UTC (permalink / raw)
To: netdev, linux-arm-kernel; +Cc: nicolas.ferre, Jamie Iles
In-Reply-To: <1299751843-9743-1-git-send-email-jamie@jamieiles.com>
GEM has it's hardware address registers in a different location
to MACB so we need to make this conditional on type.
Signed-off-by: Jamie Iles <jamie@jamieiles.com>
---
drivers/net/macb.c | 19 +++++++++++++++----
drivers/net/macb.h | 4 ++++
2 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 204afa6..2541e3b 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -57,9 +57,15 @@ static void __macb_set_hwaddr(struct macb *bp)
u16 top;
bottom = cpu_to_le32(*((u32 *)bp->dev->dev_addr));
- macb_writel(bp, SA1B, bottom);
top = cpu_to_le16(*((u16 *)(bp->dev->dev_addr + 4)));
- macb_writel(bp, SA1T, top);
+
+ if (!bp->is_gem) {
+ macb_writel(bp, SA1B, bottom);
+ macb_writel(bp, SA1T, top);
+ } else {
+ gem_writel(bp, SA1B, bottom);
+ gem_writel(bp, SA1T, top);
+ }
}
static void __init macb_get_hwaddr(struct macb *bp)
@@ -68,8 +74,13 @@ static void __init macb_get_hwaddr(struct macb *bp)
u16 top;
u8 addr[6];
- bottom = macb_readl(bp, SA1B);
- top = macb_readl(bp, SA1T);
+ if (!bp->is_gem) {
+ bottom = macb_readl(bp, SA1B);
+ top = macb_readl(bp, SA1T);
+ } else {
+ bottom = gem_readl(bp, SA1B);
+ top = gem_readl(bp, SA1T);
+ }
addr[0] = bottom & 0xff;
addr[1] = (bottom >> 8) & 0xff;
diff --git a/drivers/net/macb.h b/drivers/net/macb.h
index f838615..6248af6 100644
--- a/drivers/net/macb.h
+++ b/drivers/net/macb.h
@@ -60,6 +60,10 @@
#define MACB_USRIO 0x00c0
#define MACB_WOL 0x00c4
+/* GEM register offsets. */
+#define GEM_SA1B 0x0088
+#define GEM_SA1T 0x008C
+
/* Bitfields in NCR */
#define MACB_LB_OFFSET 0
#define MACB_LB_SIZE 1
--
1.7.4
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox