All of lore.kernel.org
 help / color / mirror / Atom feed
From: Waiman Long <waiman.long@hpe.com>
To: Dave Chinner <david@fromorbit.com>
Cc: Scott J Norton <scott.norton@hpe.com>,
	Christoph Lameter <cl@linux-foundation.org>,
	Douglas Hatch <doug.hatch@hpe.com>,
	linux-kernel@vger.kernel.org, xfs@oss.sgi.com,
	Tejun Heo <tj@kernel.org>
Subject: Re: [PATCH] percpu_counter: return precise count from __percpu_counter_compare()
Date: Thu, 08 Oct 2015 12:01:16 -0400	[thread overview]
Message-ID: <5616934C.5000206@hpe.com> (raw)
In-Reply-To: <20151007230441.GG32150@dastard>

On 10/07/2015 07:04 PM, Dave Chinner wrote:
> On Wed, Oct 07, 2015 at 04:00:42PM -0400, Waiman Long wrote:
>> On 10/06/2015 05:30 PM, Dave Chinner wrote:
>>>>> /*
>>>>>   * Aggregate the per-cpu counter magazines back into the global
>>>>>   * counter. This avoids the need for repeated compare operations to
>>>>>   * run the slow path when the majority of the counter value is held
>>>>>   * in the per-cpu magazines. Folding them back into the global
>>>>>   * counter means we will continue to hit the fast
>>>>>   * percpu_counter_read() path until the counter value falls
>>>>>   * completely within the comparison limit passed to
>>>>>   * __percpu_counter_compare().
>>>>>   */
>>>>> static s64 percpu_counter_aggregate(struct percpu_counter *fbc)
>>>>> {
>>>>> 	s64 ret;
>>>>> 	int cpu;
>>>>> 	unsigned long flags;
>>>>>
>>>>> 	raw_spin_lock_irqsave(&fbc->lock, flags);
>>>>> 	ret = fbc->count;
>>>>> 	for_each_online_cpu(cpu) {
>>>>> 		s32 count = __this_cpu_read(*fbc->counters);
>>>>>                  ret += count;
>>>>> 		__this_cpu_sub(*fbc->counters, count)
>>>>> 	}
>>>>> 	fbc->count = ret;
>>>>> 	raw_spin_unlock_irqrestore(&fbc->lock, flags);
>>>>> 	return ret;
>>>>> }
>>>> I don't think that will work as some other CPUs may change the
>>>> percpu counters values between percpu_counter_aggregate() and
>>>> __percpu_counter_compare().  To be safe, the precise counter has to
>>>> be compted whenever the comparison value difference is less than
>>>> nr_cpus * batch size.
>>> Well, yes. Why do you think the above function does the same
>>> function as percpu_counter_sum()? So that the percpu_counter_sum()
>>> call *inside* __percpu_counter_compare() can be replaced by this
>>> call. i.e.
>>>
>>> 			return -1;
>>> 	}
>>> 	/* Need to use precise count */
>>> -	count = percpu_counter_sum(fbc);
>>> +	count = percpu_counter_aggregate(fbc);
>>> 	if (count>   rhs)
>>> 		return 1;
>>> 	else if (count<   rhs)
>>>
>>> Please think about what I'm saying rather than dismissing it without
>>> first understanding my suggestions.
>> I understood what you were saying. However, the per-cpu counter
>> isn't protected by the spinlock. Reading it is OK, but writing may
>> cause race if that counter is modified by a CPU other than its
>> owning CPU.
> <sigh>
>
> You're still trying to pick apart the code without considering what
> we need to acheive.  We don't need to the code to be bullet proof to
> test whether this hypothesis is correct or not - we just need
> something that is "near-enough" to give us the data point to tell us
> where we should focus our efforts. If optimising the counter like
> above does not reduce the overhead, then we may have to change XFS.
> If it does reduce the overhead, then the XFS code remains unchanged
> and we focus on optimising the counter code.

What determine if a precise sum is to be computed is the following code:

         if (abs(count - rhs) > (batch * num_online_cpus())) {

So even if we make the global count more accurate using 
percpu_counter_aggregate(), it won't have too much effect in reducing 
the chance where the precise count needs to be calculated. That is why I 
don't bother testing it with the modified code.

Cheers,
Longman

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

WARNING: multiple messages have this Message-ID (diff)
From: Waiman Long <waiman.long@hpe.com>
To: Dave Chinner <david@fromorbit.com>
Cc: Tejun Heo <tj@kernel.org>,
	Christoph Lameter <cl@linux-foundation.org>,
	linux-kernel@vger.kernel.org, xfs@oss.sgi.com,
	Scott J Norton <scott.norton@hpe.com>,
	Douglas Hatch <doug.hatch@hpe.com>
Subject: Re: [PATCH] percpu_counter: return precise count from __percpu_counter_compare()
Date: Thu, 08 Oct 2015 12:01:16 -0400	[thread overview]
Message-ID: <5616934C.5000206@hpe.com> (raw)
In-Reply-To: <20151007230441.GG32150@dastard>

On 10/07/2015 07:04 PM, Dave Chinner wrote:
> On Wed, Oct 07, 2015 at 04:00:42PM -0400, Waiman Long wrote:
>> On 10/06/2015 05:30 PM, Dave Chinner wrote:
>>>>> /*
>>>>>   * Aggregate the per-cpu counter magazines back into the global
>>>>>   * counter. This avoids the need for repeated compare operations to
>>>>>   * run the slow path when the majority of the counter value is held
>>>>>   * in the per-cpu magazines. Folding them back into the global
>>>>>   * counter means we will continue to hit the fast
>>>>>   * percpu_counter_read() path until the counter value falls
>>>>>   * completely within the comparison limit passed to
>>>>>   * __percpu_counter_compare().
>>>>>   */
>>>>> static s64 percpu_counter_aggregate(struct percpu_counter *fbc)
>>>>> {
>>>>> 	s64 ret;
>>>>> 	int cpu;
>>>>> 	unsigned long flags;
>>>>>
>>>>> 	raw_spin_lock_irqsave(&fbc->lock, flags);
>>>>> 	ret = fbc->count;
>>>>> 	for_each_online_cpu(cpu) {
>>>>> 		s32 count = __this_cpu_read(*fbc->counters);
>>>>>                  ret += count;
>>>>> 		__this_cpu_sub(*fbc->counters, count)
>>>>> 	}
>>>>> 	fbc->count = ret;
>>>>> 	raw_spin_unlock_irqrestore(&fbc->lock, flags);
>>>>> 	return ret;
>>>>> }
>>>> I don't think that will work as some other CPUs may change the
>>>> percpu counters values between percpu_counter_aggregate() and
>>>> __percpu_counter_compare().  To be safe, the precise counter has to
>>>> be compted whenever the comparison value difference is less than
>>>> nr_cpus * batch size.
>>> Well, yes. Why do you think the above function does the same
>>> function as percpu_counter_sum()? So that the percpu_counter_sum()
>>> call *inside* __percpu_counter_compare() can be replaced by this
>>> call. i.e.
>>>
>>> 			return -1;
>>> 	}
>>> 	/* Need to use precise count */
>>> -	count = percpu_counter_sum(fbc);
>>> +	count = percpu_counter_aggregate(fbc);
>>> 	if (count>   rhs)
>>> 		return 1;
>>> 	else if (count<   rhs)
>>>
>>> Please think about what I'm saying rather than dismissing it without
>>> first understanding my suggestions.
>> I understood what you were saying. However, the per-cpu counter
>> isn't protected by the spinlock. Reading it is OK, but writing may
>> cause race if that counter is modified by a CPU other than its
>> owning CPU.
> <sigh>
>
> You're still trying to pick apart the code without considering what
> we need to acheive.  We don't need to the code to be bullet proof to
> test whether this hypothesis is correct or not - we just need
> something that is "near-enough" to give us the data point to tell us
> where we should focus our efforts. If optimising the counter like
> above does not reduce the overhead, then we may have to change XFS.
> If it does reduce the overhead, then the XFS code remains unchanged
> and we focus on optimising the counter code.

What determine if a precise sum is to be computed is the following code:

         if (abs(count - rhs) > (batch * num_online_cpus())) {

So even if we make the global count more accurate using 
percpu_counter_aggregate(), it won't have too much effect in reducing 
the chance where the precise count needs to be calculated. That is why I 
don't bother testing it with the modified code.

Cheers,
Longman


  parent reply	other threads:[~2015-10-08 16:01 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-02 17:29 [PATCH] percpu_counter: return precise count from __percpu_counter_compare() Waiman Long
2015-10-02 17:29 ` Waiman Long
2015-10-02 18:04 ` kbuild test robot
2015-10-02 18:04   ` kbuild test robot
2015-10-05 23:03   ` Waiman Long
2015-10-05 23:03     ` Waiman Long
2015-10-02 18:05 ` kbuild test robot
2015-10-02 18:05   ` kbuild test robot
2015-10-02 18:12 ` kbuild test robot
2015-10-02 18:12   ` kbuild test robot
2015-10-02 18:15 ` kbuild test robot
2015-10-02 18:15   ` kbuild test robot
2015-10-02 22:16 ` Dave Chinner
2015-10-02 22:16   ` Dave Chinner
2015-10-05 23:02   ` Waiman Long
2015-10-05 23:02     ` Waiman Long
2015-10-06  0:25     ` Dave Chinner
2015-10-06  0:25       ` Dave Chinner
2015-10-06 17:33       ` Waiman Long
2015-10-06 17:33         ` Waiman Long
2015-10-06 21:30         ` Dave Chinner
2015-10-06 21:30           ` Dave Chinner
2015-10-07 20:00           ` Waiman Long
2015-10-07 20:00             ` Waiman Long
2015-10-07 23:04             ` Dave Chinner
2015-10-07 23:04               ` Dave Chinner
2015-10-07 23:20               ` Tejun Heo
2015-10-07 23:20                 ` Tejun Heo
2015-10-08  1:02                 ` Dave Chinner
2015-10-08  1:02                   ` Dave Chinner
2015-10-08  1:09                   ` Tejun Heo
2015-10-08  1:09                     ` Tejun Heo
2015-10-08 16:06                   ` Waiman Long
2015-10-08 16:06                     ` Waiman Long
2015-10-08 16:01               ` Waiman Long [this message]
2015-10-08 16:01                 ` Waiman Long

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=5616934C.5000206@hpe.com \
    --to=waiman.long@hpe.com \
    --cc=cl@linux-foundation.org \
    --cc=david@fromorbit.com \
    --cc=doug.hatch@hpe.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=scott.norton@hpe.com \
    --cc=tj@kernel.org \
    --cc=xfs@oss.sgi.com \
    /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.