diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index d1a21b5..f8267fc 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -224,6 +224,7 @@ struct netif_rx_stats { unsigned time_squeeze; unsigned cpu_collision; unsigned received_rps; + unsigned ipi_rps; }; DECLARE_PER_CPU(struct netif_rx_stats, netdev_rx_stat); diff --git a/kernel/smp.c b/kernel/smp.c index 9867b6b..8c5dcb7 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -11,6 +11,7 @@ #include #include #include +#include static struct { struct list_head queue; @@ -158,7 +159,10 @@ void generic_exec_single(int cpu, struct call_single_data *data, int wait) * equipped to do the right thing... */ if (ipi) +{ arch_send_call_function_single_ipi(cpu); + __get_cpu_var(netdev_rx_stat).ipi_rps++; +} if (wait) csd_lock_wait(data); diff --git a/net/core/dev.c b/net/core/dev.c index b98ddc6..0bbbdcf 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3563,10 +3563,12 @@ static int softnet_seq_show(struct seq_file *seq, void *v) { struct netif_rx_stats *s = v; - seq_printf(seq, "%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x\n", + seq_printf(seq, "%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x\n", s->total, s->dropped, s->time_squeeze, 0, 0, 0, 0, 0, /* was fastroute */ - s->cpu_collision, s->received_rps); + s->cpu_collision, s->received_rps, s->ipi_rps); + s->ipi_rps = 0; + s->received_rps = 0; return 0; }