From: Eric Dumazet <dada1@cosmosbay.com>
To: Peter Teoh <htmldeveloper@gmail.com>
Cc: Johannes Weiner <hannes@saeurebad.de>,
Jeremy Fitzhardinge <jeremy@goop.org>,
LKML <linux-kernel@vger.kernel.org>, Tejun Heo <htejun@gmail.com>,
Dipankar Sarma <dipankar@in.ibm.com>
Subject: Re: per cpun+ spin locks coexistence?
Date: Mon, 17 Mar 2008 20:22:28 +0100 [thread overview]
Message-ID: <47DEC4F4.5010703@cosmosbay.com> (raw)
In-Reply-To: <804dabb00803171006i4423c5b6w58bd95116510d3f5@mail.gmail.com>
Peter Teoh a écrit :
> Thanks for the explanation, much apologies for this newbie discussion.
> But I still find it inexplicable:
>
> On Mon, Mar 17, 2008 at 4:20 AM, Johannes Weiner <hannes@saeurebad.de> wrote:
>
>> A per-cpu variable is basically an array the size of the number of
>> possible CPUs in the system. get_cpu_var() checks what current CPU we
>> are running on and gets the array-element corresponding to this CPU.
>>
>> So, really oversimplified, get_cpu_var(foo) translates to something like
>> foo[smp_processor_id()].
>>
>>
>
> Ok, so calling get_cpu_var() always return the array-element for the
> current CPU, and since by design, only the current CPU can
> modify/write to this array element (this is my assumption - correct?),
> and the other CPU will just read it (using the per_cpu construct).
> So far correct? So why do u still need to spin_lock() to lock other
> CPU from accessing - the other CPU will always just READ it, so just
> go ahead and let them read it. Seemed like it defeats the purpose of
> get_cpu_var()'s design?
>
> But supposed u really want to put a spin_lock(), just to be sure
> nobody is even reading it, or modifying it, so then what is the
> original purpose of get_cpu_var() - is it not to implement something
> that can be parallelized among different CPU, without affecting each
> other, and using no locks?
>
> The dual use of spin_lock+get_cpu_var() confuses me here :-). (not
> the per_cpu(), which I agree is supposed to be callabe from all the
> different CPU, for purpose of enumeration or data collection).
>
>
You are right Peter, that fs/file.c contains some leftover from previous
implementation of defer queue,
that was using a timer.
So we can probably provide a patch that :
- Use spin_lock() & spin_unlock() instead of spin_lock_bh() &
spin_unlock_bh() in free_fdtable_work()
since we dont anymore use a softirq (timer) to reschedule the workqueue.
( this timer was deleted by the following patch :
http://readlist.com/lists/vger.kernel.org/linux-kernel/50/251040.html
But, you cannot avoid use of spin_lock()/spin_unlock() because
schedule_work() makes no garantee that the work will be done by this cpu.
(free_fdtable_work() can be called to flush the fd defer queue of CPU X
on behalf CPU Y, with X != Y .
You then can have a corruption because CPU X is inside
free_fdtable_rcu() and CPU Y is inside free_fdtable_work() )
So both spin_lock() and get_cpu_var() are necessary :
- One to get the precpu data for optimal performance on SMP (but not
mandatory)
- One to protect the data from corruption on SMP.
next prev parent reply other threads:[~2008-03-17 19:23 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-12 16:17 per cpun+ spin locks coexistence? Peter Teoh
2008-03-14 17:54 ` Jeremy Fitzhardinge
2008-03-16 16:30 ` Peter Teoh
2008-03-16 20:20 ` Johannes Weiner
2008-03-17 17:06 ` Peter Teoh
2008-03-17 17:51 ` Johannes Weiner
2008-03-17 19:22 ` Eric Dumazet [this message]
2008-03-18 17:00 ` Peter Teoh
2008-03-18 17:34 ` Dipankar Sarma
2008-03-18 18:00 ` Eric Dumazet
2008-03-19 16:25 ` Peter Teoh
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=47DEC4F4.5010703@cosmosbay.com \
--to=dada1@cosmosbay.com \
--cc=dipankar@in.ibm.com \
--cc=hannes@saeurebad.de \
--cc=htejun@gmail.com \
--cc=htmldeveloper@gmail.com \
--cc=jeremy@goop.org \
--cc=linux-kernel@vger.kernel.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.