All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marcelo <marcelo.leitner@gmail.com>
To: Jia He <hejianet@gmail.com>
Cc: netdev@vger.kernel.org, linux-sctp@vger.kernel.org,
	linux-kernel@vger.kernel.org, davem@davemloft.net,
	Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
	James Morris <jmorris@namei.org>,
	Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
	Patrick McHardy <kaber@trash.net>,
	Vlad Yasevich <vyasevich@gmail.com>,
	Neil Horman <nhorman@tuxdriver.com>,
	Steffen Klassert <steffen.klassert@secunet.com>,
	Herbert Xu <herbert@gondor.apana.org.au>
Subject: Re: [RFC PATCH v3 3/7] proc: Reduce cache miss in snmp6_seq_show
Date: Mon, 12 Sep 2016 19:05:02 +0000	[thread overview]
Message-ID: <20160912190502.GC17689@localhost.localdomain> (raw)
In-Reply-To: <1473402842-1987-4-git-send-email-hejianet@gmail.com>

On Fri, Sep 09, 2016 at 02:33:58PM +0800, Jia He wrote:
> This is to use the generic interface snmp_get_cpu_field{,64}_batch to 
> aggregate the data by going through all the items of each cpu sequentially.
> 
> Signed-off-by: Jia He <hejianet@gmail.com>
> ---
>  net/ipv6/proc.c | 32 +++++++++++++++++++++++---------
>  1 file changed, 23 insertions(+), 9 deletions(-)
> 
> diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c
> index 679253d0..50ba2c3 100644
> --- a/net/ipv6/proc.c
> +++ b/net/ipv6/proc.c
> @@ -30,6 +30,11 @@
>  #include <net/transp_v6.h>
>  #include <net/ipv6.h>
>  
> +#define MAX4(a, b, c, d) \
> +	max_t(u32, max_t(u32, a, b), max_t(u32, c, d))
> +#define SNMP_MIB_MAX MAX4(UDP_MIB_MAX, TCP_MIB_MAX, \
> +			IPSTATS_MIB_MAX, ICMP_MIB_MAX)
> +
>  static int sockstat6_seq_show(struct seq_file *seq, void *v)
>  {
>  	struct net *net = seq->private;
> @@ -192,13 +197,19 @@ static void snmp6_seq_show_item(struct seq_file *seq, void __percpu *pcpumib,
>  				const struct snmp_mib *itemlist)
>  {
>  	int i;
> -	unsigned long val;
> -
> -	for (i = 0; itemlist[i].name; i++) {
> -		val = pcpumib ?
> -			snmp_fold_field(pcpumib, itemlist[i].entry) :
> -			atomic_long_read(smib + itemlist[i].entry);
> -		seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name, val);
> +	unsigned long buff[SNMP_MIB_MAX];
> +
> +	memset(buff, 0, sizeof(unsigned long) * SNMP_MIB_MAX);

This memset() could be moved...

> +
> +	if (pcpumib) {

... here, so it's not executed if it hits the else block.

> +		snmp_get_cpu_field_batch(buff, itemlist, pcpumib);
> +		for (i = 0; itemlist[i].name; i++)
> +			seq_printf(seq, "%-32s\t%lu\n",
> +				   itemlist[i].name, buff[i]);
> +	} else {
> +		for (i = 0; itemlist[i].name; i++)
> +			seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name,
> +				   atomic_long_read(smib + itemlist[i].entry));
>  	}
>  }
>  
> @@ -206,10 +217,13 @@ static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu *mib,
>  				  const struct snmp_mib *itemlist, size_t syncpoff)
>  {
>  	int i;
> +	u64 buff64[SNMP_MIB_MAX];
> +
> +	memset(buff64, 0, sizeof(unsigned long) * SNMP_MIB_MAX);
>  
> +	snmp_get_cpu_field64_batch(buff64, itemlist, mib, syncpoff);
>  	for (i = 0; itemlist[i].name; i++)
> -		seq_printf(seq, "%-32s\t%llu\n", itemlist[i].name,
> -			   snmp_fold_field64(mib, itemlist[i].entry, syncpoff));
> +		seq_printf(seq, "%-32s\t%llu\n", itemlist[i].name, buff64[i]);
>  }
>  
>  static int snmp6_seq_show(struct seq_file *seq, void *v)
> -- 
> 1.8.3.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-sctp" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

WARNING: multiple messages have this Message-ID (diff)
From: Marcelo <marcelo.leitner@gmail.com>
To: Jia He <hejianet@gmail.com>
Cc: netdev@vger.kernel.org, linux-sctp@vger.kernel.org,
	linux-kernel@vger.kernel.org, davem@davemloft.net,
	Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
	James Morris <jmorris@namei.org>,
	Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
	Patrick McHardy <kaber@trash.net>,
	Vlad Yasevich <vyasevich@gmail.com>,
	Neil Horman <nhorman@tuxdriver.com>,
	Steffen Klassert <steffen.klassert@secunet.com>,
	Herbert Xu <herbert@gondor.apana.org.au>
Subject: Re: [RFC PATCH v3 3/7] proc: Reduce cache miss in snmp6_seq_show
Date: Mon, 12 Sep 2016 16:05:02 -0300	[thread overview]
Message-ID: <20160912190502.GC17689@localhost.localdomain> (raw)
In-Reply-To: <1473402842-1987-4-git-send-email-hejianet@gmail.com>

On Fri, Sep 09, 2016 at 02:33:58PM +0800, Jia He wrote:
> This is to use the generic interface snmp_get_cpu_field{,64}_batch to 
> aggregate the data by going through all the items of each cpu sequentially.
> 
> Signed-off-by: Jia He <hejianet@gmail.com>
> ---
>  net/ipv6/proc.c | 32 +++++++++++++++++++++++---------
>  1 file changed, 23 insertions(+), 9 deletions(-)
> 
> diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c
> index 679253d0..50ba2c3 100644
> --- a/net/ipv6/proc.c
> +++ b/net/ipv6/proc.c
> @@ -30,6 +30,11 @@
>  #include <net/transp_v6.h>
>  #include <net/ipv6.h>
>  
> +#define MAX4(a, b, c, d) \
> +	max_t(u32, max_t(u32, a, b), max_t(u32, c, d))
> +#define SNMP_MIB_MAX MAX4(UDP_MIB_MAX, TCP_MIB_MAX, \
> +			IPSTATS_MIB_MAX, ICMP_MIB_MAX)
> +
>  static int sockstat6_seq_show(struct seq_file *seq, void *v)
>  {
>  	struct net *net = seq->private;
> @@ -192,13 +197,19 @@ static void snmp6_seq_show_item(struct seq_file *seq, void __percpu *pcpumib,
>  				const struct snmp_mib *itemlist)
>  {
>  	int i;
> -	unsigned long val;
> -
> -	for (i = 0; itemlist[i].name; i++) {
> -		val = pcpumib ?
> -			snmp_fold_field(pcpumib, itemlist[i].entry) :
> -			atomic_long_read(smib + itemlist[i].entry);
> -		seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name, val);
> +	unsigned long buff[SNMP_MIB_MAX];
> +
> +	memset(buff, 0, sizeof(unsigned long) * SNMP_MIB_MAX);

This memset() could be moved...

> +
> +	if (pcpumib) {

... here, so it's not executed if it hits the else block.

> +		snmp_get_cpu_field_batch(buff, itemlist, pcpumib);
> +		for (i = 0; itemlist[i].name; i++)
> +			seq_printf(seq, "%-32s\t%lu\n",
> +				   itemlist[i].name, buff[i]);
> +	} else {
> +		for (i = 0; itemlist[i].name; i++)
> +			seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name,
> +				   atomic_long_read(smib + itemlist[i].entry));
>  	}
>  }
>  
> @@ -206,10 +217,13 @@ static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu *mib,
>  				  const struct snmp_mib *itemlist, size_t syncpoff)
>  {
>  	int i;
> +	u64 buff64[SNMP_MIB_MAX];
> +
> +	memset(buff64, 0, sizeof(unsigned long) * SNMP_MIB_MAX);
>  
> +	snmp_get_cpu_field64_batch(buff64, itemlist, mib, syncpoff);
>  	for (i = 0; itemlist[i].name; i++)
> -		seq_printf(seq, "%-32s\t%llu\n", itemlist[i].name,
> -			   snmp_fold_field64(mib, itemlist[i].entry, syncpoff));
> +		seq_printf(seq, "%-32s\t%llu\n", itemlist[i].name, buff64[i]);
>  }
>  
>  static int snmp6_seq_show(struct seq_file *seq, void *v)
> -- 
> 1.8.3.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-sctp" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

  reply	other threads:[~2016-09-12 19:05 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-09  6:33 [RFC PATCH v3 0/7] Reduce cache miss for snmp_fold_field Jia He
2016-09-09  6:33 ` Jia He
2016-09-09  6:33 ` [RFC PATCH v3 1/7] net:snmp: Introduce generic batch interfaces for snmp_get_cpu_field{,64} Jia He
2016-09-09  6:33   ` Jia He
2016-09-09  6:33 ` [RFC PATCH v3 2/7] proc: Reduce cache miss in {snmp,netstat}_seq_show Jia He
2016-09-09  6:33   ` Jia He
2016-09-12 18:57   ` Marcelo
2016-09-12 18:57     ` Marcelo
2016-09-14  3:10     ` hejianet
2016-09-14  3:10       ` hejianet
2016-09-14  5:58     ` hejianet
2016-09-14  5:58       ` hejianet
2016-09-14 11:55       ` Marcelo
2016-09-14 11:55         ` Marcelo
2016-09-21 16:18         ` hejianet
2016-09-21 16:18           ` hejianet
2016-09-21 18:24           ` Marcelo
2016-09-21 18:24             ` Marcelo
2016-09-22  5:38             ` hejianet
2016-09-22  5:38               ` hejianet
2016-09-09  6:33 ` [RFC PATCH v3 3/7] proc: Reduce cache miss in snmp6_seq_show Jia He
2016-09-09  6:33   ` Jia He
2016-09-12 19:05   ` Marcelo [this message]
2016-09-12 19:05     ` Marcelo
2016-09-14  3:11     ` hejianet
2016-09-14  3:11       ` hejianet
2016-09-09  6:33 ` [RFC PATCH v3 4/7] proc: Reduce cache miss in sctp_snmp_seq_show Jia He
2016-09-09  6:33   ` Jia He
2016-09-09  6:34 ` [RFC PATCH v3 5/7] proc: Reduce cache miss in xfrm_statistics_seq_show Jia He
2016-09-09  6:34   ` Jia He
2016-09-09  6:34 ` [RFC PATCH v3 6/7] ipv6: Remove useless parameter in __snmp6_fill_statsdev Jia He
2016-09-09  6:34   ` Jia He
2016-09-09  6:34 ` [RFC PATCH v3 7/7] net: Suppress the "Comparison to NULL could be written" warning Jia He
2016-09-09  6:34   ` Jia He

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160912190502.GC17689@localhost.localdomain \
    --to=marcelo.leitner@gmail.com \
    --cc=davem@davemloft.net \
    --cc=hejianet@gmail.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=jmorris@namei.org \
    --cc=kaber@trash.net \
    --cc=kuznet@ms2.inr.ac.ru \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sctp@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=nhorman@tuxdriver.com \
    --cc=steffen.klassert@secunet.com \
    --cc=vyasevich@gmail.com \
    --cc=yoshfuji@linux-ipv6.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.