lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <1192513249.19073.9.camel@pasglop> Date: Tue, 16 Oct 2007 15:40:49 +1000 From: Benjamin Herrenschmidt <benh@...nel.crashing.org> To: shemminger@...ux.foundation.org Cc: netdev@...r.kernel.org, "David S. Miller" <davem@...emloft.net>, Roland Dreier <rdreier@...co.com>, linuxppc-dev list <linuxppc-dev@...abs.org> Subject: [PATCH/RFC] net: Add __napi_sycnhronize() to sync with napi poll net: Add __napi_sycnhronize() to sync with napi poll The EMAC driver which needs to handle multiple devices with one NAPI instance implements its own per-channel disable bit. However, when setting such a bit, it needs to synchronize with the poller (that is make sure that any pending poller instance has completed, or is started late enough to see that disable bit). This implements a low level __napi_synchronize() function to acheive that. The underscores are to emphasis the low level aspect of it and to discourage driver writers who don't know what they are doing to use it (to please DaveM :-) Signed-off-by: Benjamin Herrenschmidt <benh@...nel.crashing.org> --- If the approach is accepted, I would like to have this merged now so the EMAC patch to make it work again can follow :-) Note: I use msleep_interruptible(1); just like napi_disable(). However I'm not too happy that the "hot" loop that results of a pending signal here will spin without even a cpu_relax ... what do you guys think would be the best way to handle this ? Index: linux-work/include/linux/netdevice.h =================================================================== --- linux-work.orig/include/linux/netdevice.h 2007-10-16 15:27:27.000000000 +1000 +++ linux-work/include/linux/netdevice.h 2007-10-16 15:27:38.000000000 +1000 @@ -394,6 +394,21 @@ static inline void napi_disable(struct n } /** + * __napi_synchronize - synchronize with a concurrent poll + * @n: napi context + * + * Synchronizes with a concurrent poll. Not to be used in normal + * drivers, mostly useful if you end up with multiple interfaces + * on one NAPI instance. + */ +static inline void __napi_synchronize(struct napi_struct *n) +{ + smp_mb(); + while (test_bit(NAPI_STATE_SCHED, &n->state)) + msleep_interruptible(1); +} + +/** * napi_enable - enable NAPI scheduling * @n: napi context * - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists