[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[hurd] 15/26: commit 9d21493b4beb8f918ba248032fefa393074a5e2b
From: |
Samuel Thibault |
Subject: |
[hurd] 15/26: commit 9d21493b4beb8f918ba248032fefa393074a5e2b |
Date: |
Tue, 22 Sep 2015 21:51:48 +0000 |
This is an automated email from the git hooks/post-receive script.
sthibault pushed a commit to branch dde
in repository hurd.
commit befb192dd8647442a46603d919ae4b6a9ebff74c
Author: Eric Dumazet <address@hidden>
Date: Sun May 17 20:55:16 2009 -0700
commit 9d21493b4beb8f918ba248032fefa393074a5e2b
net: tx scalability works : trans_start
struct net_device trans_start field is a hot spot on SMP and high
performance
devices, particularly multi queues ones, because every transmitter
dirties
it. Is main use is tx watchdog and bonding alive checks.
But as most devices dont use NETIF_F_LLTX, we have to lock
a netdev_queue before calling their ndo_start_xmit(). So it makes
sense to move trans_start from net_device to netdev_queue. Its update
will occur on a already present (and in exclusive state) cache line, for
free.
We can do this transition smoothly. An old driver continue to
update dev->trans_start, while an updated one updates txq->trans_start.
Further patches could also put tx_bytes/tx_packets counters in
netdev_queue to avoid dirtying dev->stats (vlan device comes to mind)
Signed-off-by: Eric Dumazet <address@hidden>
Signed-off-by: David S. Miller <address@hidden>
---
libdde_linux26/contrib/include/linux/netdevice.h | 11 +++++++
libdde_linux26/lib/src/net/sched/sch_generic.c | 40 ++++++++++++++++++------
2 files changed, 42 insertions(+), 9 deletions(-)
diff --git a/libdde_linux26/contrib/include/linux/netdevice.h
b/libdde_linux26/contrib/include/linux/netdevice.h
index bb4fca1..4414989 100644
--- a/libdde_linux26/contrib/include/linux/netdevice.h
+++ b/libdde_linux26/contrib/include/linux/netdevice.h
@@ -462,6 +462,10 @@ struct netdev_queue {
spinlock_t _xmit_lock;
int xmit_lock_owner;
struct Qdisc *qdisc_sleeping;
+ /*
+ * please use this field instead of dev->trans_start
+ */
+ unsigned long trans_start;
} ____cacheline_aligned_in_smp;
@@ -801,6 +805,11 @@ struct net_device
* One part is mostly used on xmit path (device)
*/
/* These may be needed for future network-power-down code. */
+
+ /*
+ * trans_start here is expensive for high speed devices on SMP,
+ * please use netdev_queue->trans_start instead.
+ */
unsigned long trans_start; /* Time (in jiffies) of last Tx
*/
int watchdog_timeo; /* used by dev_watchdog() */
@@ -1477,6 +1486,8 @@ static inline int netif_carrier_ok(const struct
net_device *dev)
return !test_bit(__LINK_STATE_NOCARRIER, &dev->state);
}
+extern unsigned long dev_trans_start(struct net_device *dev);
+
extern void __netdev_watchdog_up(struct net_device *dev);
extern void netif_carrier_on(struct net_device *dev);
diff --git a/libdde_linux26/lib/src/net/sched/sch_generic.c
b/libdde_linux26/lib/src/net/sched/sch_generic.c
index a2acd6c..252ac98 100644
--- a/libdde_linux26/lib/src/net/sched/sch_generic.c
+++ b/libdde_linux26/lib/src/net/sched/sch_generic.c
@@ -200,6 +200,21 @@ void __qdisc_run(struct Qdisc *q)
clear_bit(__QDISC_STATE_RUNNING, &q->state);
}
+unsigned long dev_trans_start(struct net_device *dev)
+{
+ unsigned long val, res = dev->trans_start;
+ unsigned int i;
+
+ for (i = 0; i < dev->num_tx_queues; i++) {
+ val = netdev_get_tx_queue(dev, i)->trans_start;
+ if (val && time_after(val, res))
+ res = val;
+ }
+ dev->trans_start = res;
+ return res;
+}
+EXPORT_SYMBOL(dev_trans_start);
+
static void dev_watchdog(unsigned long arg)
{
struct net_device *dev = (struct net_device *)arg;
@@ -209,25 +224,30 @@ static void dev_watchdog(unsigned long arg)
if (netif_device_present(dev) &&
netif_running(dev) &&
netif_carrier_ok(dev)) {
- int some_queue_stopped = 0;
+ int some_queue_timedout = 0;
unsigned int i;
+ unsigned long trans_start;
for (i = 0; i < dev->num_tx_queues; i++) {
struct netdev_queue *txq;
txq = netdev_get_tx_queue(dev, i);
- if (netif_tx_queue_stopped(txq)) {
- some_queue_stopped = 1;
+ /*
+ * old device drivers set dev->trans_start
+ */
+ trans_start = txq->trans_start ? :
dev->trans_start;
+ if (netif_tx_queue_stopped(txq) &&
+ time_after(jiffies, (trans_start +
+ dev->watchdog_timeo)))
{
+ some_queue_timedout = 1;
break;
}
}
- if (some_queue_stopped &&
- time_after(jiffies, (dev->trans_start +
- dev->watchdog_timeo))) {
+ if (some_queue_timedout) {
char drivername[64];
- WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s
(%s): transmit timed out\n",
- dev->name, netdev_drivername(dev,
drivername, 64));
+ WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s
(%s): transmit queue %u timed out\n",
+ dev->name, netdev_drivername(dev,
drivername, 64), i);
dev->netdev_ops->ndo_tx_timeout(dev);
}
if (!mod_timer(&dev->watchdog_timer,
@@ -612,8 +632,10 @@ static void transition_one_qdisc(struct net_device *dev,
clear_bit(__QDISC_STATE_DEACTIVATED, &new_qdisc->state);
rcu_assign_pointer(dev_queue->qdisc, new_qdisc);
- if (need_watchdog_p && new_qdisc != &noqueue_qdisc)
+ if (need_watchdog_p && new_qdisc != &noqueue_qdisc) {
+ dev_queue->trans_start = 0;
*need_watchdog_p = 1;
+ }
}
void dev_activate(struct net_device *dev)
--
Alioth's /usr/local/bin/git-commit-notice on
/srv/git.debian.org/git/pkg-hurd/hurd.git
- [hurd] 18/26: commit d5a9e24afb4ab38110ebb777588ea0bd0eacbd0a, (continued)
- [hurd] 18/26: commit d5a9e24afb4ab38110ebb777588ea0bd0eacbd0a, Samuel Thibault, 2015/09/22
- [hurd] 24/26: Merge remote-tracking branch 'incubator/dde' into dde-upstream, Samuel Thibault, 2015/09/22
- [hurd] 08/26: commit 042a53a9e437feaf2230dd2cadcecfae9c7bfe05, Samuel Thibault, 2015/09/22
- [hurd] 22/26: Install missing queue.h, Samuel Thibault, 2015/09/22
- [hurd] 12/26: update pci_ids, Samuel Thibault, 2015/09/22
- [hurd] 17/26: Add pr_cont, Samuel Thibault, 2015/09/22
- [hurd] 26/26: Move files, Samuel Thibault, 2015/09/22
- [hurd] 14/26: update workqueue.h, Samuel Thibault, 2015/09/22
- [hurd] 25/26: Merge branch 'dde-upstream' into dde, Samuel Thibault, 2015/09/22
- [hurd] 23/26: Fix build with gcc 5, Samuel Thibault, 2015/09/22
- [hurd] 15/26: commit 9d21493b4beb8f918ba248032fefa393074a5e2b,
Samuel Thibault <=
- [hurd] 21/26: Fix insecure format, Samuel Thibault, 2015/09/22
- [hurd] 03/26: commit f001fde5eadd915f4858d22ed70d7040f48767cf, Samuel Thibault, 2015/09/22
- [hurd] 06/26: commit 31278e71471399beaff9280737e52b47db4dc345, Samuel Thibault, 2015/09/22
- [hurd] 04/26: commit ccffad25b5136958d4769ed6de5e87992dd9c65c, Samuel Thibault, 2015/09/22
- [hurd] 09/26: Add mdio.h, Samuel Thibault, 2015/09/22
- [hurd] 19/26: Add rcuclassic.c, Samuel Thibault, 2015/09/22
- [hurd] 20/26: really add files, Samuel Thibault, 2015/09/22