[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Fri, 7 Jul 2017 11:32:49 +0200
From: Ingo Molnar <mingo@...nel.org>
To: Peter Zijlstra <peterz@...radead.org>
Cc: David Laight <David.Laight@...LAB.COM>,
"'paulmck@...ux.vnet.ibm.com'" <paulmck@...ux.vnet.ibm.com>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
"netfilter-devel@...r.kernel.org" <netfilter-devel@...r.kernel.org>,
"netdev@...r.kernel.org" <netdev@...r.kernel.org>,
"oleg@...hat.com" <oleg@...hat.com>,
"akpm@...ux-foundation.org" <akpm@...ux-foundation.org>,
"mingo@...hat.com" <mingo@...hat.com>,
"dave@...olabs.net" <dave@...olabs.net>,
"manfred@...orfullife.com" <manfred@...orfullife.com>,
"tj@...nel.org" <tj@...nel.org>, "arnd@...db.de" <arnd@...db.de>,
"linux-arch@...r.kernel.org" <linux-arch@...r.kernel.org>,
"will.deacon@....com" <will.deacon@....com>,
"stern@...land.harvard.edu" <stern@...land.harvard.edu>,
"parri.andrea@...il.com" <parri.andrea@...il.com>,
"torvalds@...ux-foundation.org" <torvalds@...ux-foundation.org>
Subject: Re: [PATCH v2 0/9] Remove spin_unlock_wait()
* Ingo Molnar <mingo@...nel.org> wrote:
>
> * Peter Zijlstra <peterz@...radead.org> wrote:
>
> > > It might even be that this is the defined semantics of spin_unlock_wait().
> >
> > As is, spin_unlock_wait() is somewhat ill defined. IIRC it grew from an
> > optimization by Oleg and subsequently got used elsewhere. And it being the
> > subtle bugger it is, there were bugs.
>
> I believe the historical, original spin_unlock_wait() came from early SMP
> optimizations of the networking code - and then spread elsewhere, step by step.
> All but one of the networking uses went away since then - so I don't think there's
> any original usecase left.
No - the original usecase was task teardown: I still remembered that but didn't
find the commit - but it's there in very old Linux kernel patches, done by DaveM
originally in v2.1.36 (!):
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -136,6 +136,12 @@ void release(struct task_struct * p)
}
for (i=1 ; i<NR_TASKS ; i++)
if (task[i] == p) {
+#ifdef __SMP__
+ /* FIXME! Cheesy, but kills the window... -DaveM */
+ while(p->processor != NO_PROC_ID)
+ barrier();
+ spin_unlock_wait(&scheduler_lock);
+#endif
Other code learned to use spin_unlock_wait(): the original version of
[hard]irq_enter() was the second user, net_family_read_lock() was the third user,
followed by more uses in networking. All but one of those are not present in the
current upstream kernel anymore.
This task-teardown FIXME was fixed in v2.1.114 (was replaced by an open coded poll
loop), but the spin_unlock_wait() primitive remained.
The rest is history! ;-)
Thanks,
Ingo
Powered by blists - more mailing lists