On Sep 5 14:18, rom...@fr.zoreil.com wrote: > From: Francois Romieu <rom...@fr.zoreil.com> > > net/core/net-sysfs.c::netstat_show retrieves stats with spinlock held. > > This change avoids sleepable allocation and performs some housekeeping: > - receive ring, transmit ring and counters dump area allocation failures > are all considered fatal during open() > - netif_warn is now redundant with rtl_reset_counters_cond built-in > failure message. > - rtl_reset_counters_cond induced failures in open() are also considered > fatal: it takes acceptable work to unwind comfortably.
Why? The counter reset is not a fatal condition for the operation of the NIC. Even if the counters show incorrect values, the normal operation of the NIC is not affected. And to top that off, even if resetting the counters actually doesn't work, the driver keeps the offset values, so a failed reset won't even harm the statistics. It just doesn't make sense to break the NIC operation for such a minor problem. And worse: > -static bool rtl8169_reset_counters(struct net_device *dev) > +static int rtl8169_reset_counters(struct net_device *dev) > { > struct rtl8169_private *tp = netdev_priv(dev); > - struct rtl8169_counters *counters; > - dma_addr_t paddr; > - bool ret = true; > > /* > * Versions prior to RTL_GIGA_MAC_VER_19 don't support resetting the > * tally counters. > */ > if (tp->mac_version < RTL_GIGA_MAC_VER_19) > - return true; > - > - counters = rtl8169_map_counters(dev, &paddr, CounterReset); > - if (!counters) > - return false; > - > - if (!rtl_udelay_loop_wait_low(tp, &rtl_reset_counters_cond, 10, 1000)) > - ret = false; > - > - rtl8169_unmap_counters(dev, paddr, counters); > + return -EINVAL; This returns -EINVAL even for older chip versions which are not capable of resetting the counters. The result is, this driver will not work at all on chip versions prior to RTL_GIGA_MAC_VER_19 anymore, because rtl_open will always fail. Other then that, I can test the patch probably tomorrow. Corinna
pgpcwnfNo06nh.pgp
Description: PGP signature