Messages in this thread Patch in this message | | | Subject | Re: Poll about irqsafe_cpu_add and others | From | Eric Dumazet <> | Date | Thu, 17 Mar 2011 17:53:21 +0100 |
| |
Le jeudi 17 mars 2011 à 10:18 -0500, Christoph Lameter a écrit : > On Thu, 17 Mar 2011, David Miller wrote: > > > > > I had been meaning to bring this up from another perspective. > > > > In networking, we often only ever access objects in base or > > BH context. Therefore in BH context cases we can do just > > normal counter bumps without any of the special atomic or > > IRQ disabling code at all. > > We have the __ functions for that purpose. __this_cpu_inc f.e. falls back > to a simply ++ operation if the arch cannot provide something better. > irqsafe_xx are only used if the context does not provide any protection > and if there is the potential of the counter being incremented from an > interrupt context. >
What David and I have in mind is to use one array per mib instead of two. This is an old idea.
https://patchwork.kernel.org/patch/15883/
When we know we run from BH context, we can use __this_cpu_inc(), but if we dont know or run from user/process context, we would need irqsafe_inc variant.
For x86 this maps to same single instruction, but for other arches, this might be too expensive.
BTW, I think following patch is possible to save some text and useless tests (on 64bit platform at least)
size vmlinux.old vmlinux
Thanks
[PATCH] snmp: SNMP_UPD_PO_STATS_BH() always called from softirq
We dont need to test if we run from softirq context.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Cc: Christoph Lameter <cl@linux-foundation.org> --- include/net/snmp.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/net/snmp.h b/include/net/snmp.h index 762e2ab..be2424d 100644 --- a/include/net/snmp.h +++ b/include/net/snmp.h @@ -149,8 +149,8 @@ struct linux_xfrm_mib { } while (0) #define SNMP_UPD_PO_STATS_BH(mib, basefield, addend) \ do { \ - __typeof__(*mib[0]) *ptr = \ - __this_cpu_ptr((mib)[!in_softirq()]); \ + __typeof__(*mib[0]) *ptr = __this_cpu_ptr((mib)[0]); \ + \ ptr->mibs[basefield##PKTS]++; \ ptr->mibs[basefield##OCTETS] += addend;\ } while (0)
-- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |