public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Matthew Wilcox <matthew@wil.cx>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org,
	Matthew Wilcox <willy@linux.intel.com>,
	linux-arch@vger.kernel.org
Subject: Re: [PATCH 11/12] Generic semaphore implementation
Date: Thu, 28 Feb 2008 22:43:22 -0700	[thread overview]
Message-ID: <20080229054322.GC19198@parisc-linux.org> (raw)
In-Reply-To: <20080228175729.e7bebc44.akpm@linux-foundation.org>

On Thu, Feb 28, 2008 at 05:57:29PM -0800, Andrew Morton wrote:
> This make all architectures use the lib/semaphore-sleepers.c
> implementation.

It's slightly different -- I didn't use any existing semaphore
implementation for inspiration (though I did write the parisc one,
so I couldn't help but be influenced).  I was much more influenced
by mutex.c.  After I'd posted it the first time, dhowells pointed out
it was essentially the same as FRV's implementation.

> The major difference is that down() and up() will now
> unconditionally do a spin_lock_irq[save]() on the not-contended fastpath,
> whereas the hand-optimised arch-specific implementations would avoid that.
> 
> Yes, hopefully not many sempahores are used on fastpaths any more, and a
> suitable fix for any which _are_ so used is usually convert-to-mutex.
> 
> And spin_lock_irqsave() probably isn't hugely slower than an atomic-dec
> anyway.

As always, the major cost is getting the cacheline exclusive on this
CPU.  I'd be surprised if you can measure the difference.

> A few nits, most or all of which pertain to the old code:

Thanks for the review.

> > +static void noinline __down(struct semaphore *sem);
> > +static int noinline __down_interruptible(struct semaphore *sem);
> > +static int noinline __down_killable(struct semaphore *sem);
> > +static void noinline __up(struct semaphore *sem);
> 
> We conventionally do `static inline void' rather than `static void inline',
> so I guess we should do `static noinline void' too.

I can change that.  I'll modify the git tree, unless anyone has any
complaints.  We should fix mutex.c at the same time:

static void noinline __sched
__mutex_lock_slowpath(atomic_t *lock_count);

> > +int down_interruptible(struct semaphore *sem)
> > +{
> > +	int result = 0;
> > +	might_sleep();
> > +	spin_lock_irq(&sem->lock);
> > +	if (unlikely(sem->count-- <= 0))
> > +		result = __down_interruptible(sem);
> > +	spin_unlock_irq(&sem->lock);
> > +	return result;
> > +}
> > +EXPORT_SYMBOL(down_interruptible);
> 
> Some functions leave no blank line between end-of-locals and start-of-code...

It's not something I feel strongly about ;-)

> whereas some others do leave a blank line.
> 
> I think the 51% consensus is that the latter form is preferred.

Fine.

> > +static void noinline __sched __up_down_common(struct semaphore *sem)
> > +{
> > +	struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,
> > +						struct semaphore_waiter, list);
> > +	list_del(&waiter->list);
> > +	waiter->up = 1;
> 
> hm.  Do we need a barrier here?

__up_down_common is always called while holding the spinlock.  The
spinlock is acquired by the waiter before it checks the flag.  If
there's a race here, I question the value of spinlocks at all.

> > +	wake_up_process(waiter->task);


> > + * Because this function is inlined, the 'state' parameter will be constant,
> > + * and thus optimised away by the compiler.
> > + */

> That is one huuuuuuuge inline.  Are we sure it's justified?

It's a mirror of __mutex_lock_common ... I don't believe it's justified
in one case and not the other.

-- 
Intel are signing my paycheques ... these opinions are still mine
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours.  We can't possibly take such
a retrograde step."

  reply	other threads:[~2008-02-29  5:43 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-27  0:36 [PATCHES] semaphore rewrite Matthew Wilcox
2008-02-28  6:33 ` [PATCH 01/12] Fix quota.h includes Matthew Wilcox
2008-02-28  6:33   ` [PATCH 02/12] Add semaphore.h to kernel_lock.c Matthew Wilcox
2008-02-28  6:33     ` [PATCH 03/12] arch: Remove unnecessary inclusions of asm/semaphore.h Matthew Wilcox
2008-02-28  6:33       ` [PATCH 04/12] net: " Matthew Wilcox
2008-02-28  6:33         ` [PATCH 05/12] drivers: " Matthew Wilcox
2008-02-28  6:33           ` [PATCH 06/12] fs: " Matthew Wilcox
2008-02-28  6:33             ` [PATCH 07/12] include: " Matthew Wilcox
2008-02-28  6:33               ` [PATCH 08/12] kernel: " Matthew Wilcox
2008-02-28  6:33                 ` [PATCH 09/12] lib: " Matthew Wilcox
2008-02-28  6:33                   ` [PATCH 10/12] security: " Matthew Wilcox
2008-02-28  6:34                     ` [PATCH 11/12] Generic semaphore implementation Matthew Wilcox
2008-02-28  6:34                       ` [PATCH 12/12] Convert asm/semaphore.h users to linux/semaphore.h Matthew Wilcox
2008-02-28  7:18                       ` [PATCH 11/12] Generic semaphore implementation Ingo Molnar
2008-02-29  0:39                         ` Matthew Wilcox
2008-02-29  0:50                           ` Harvey Harrison
2008-02-29  1:43                           ` Andrew Morton
2008-02-29  5:30                             ` Matthew Wilcox
2008-02-29 17:42                             ` Haavard Skinnemoen
2008-02-29 19:21                             ` Ingo Molnar
2008-02-29  2:00                           ` Stephen Rothwell
2008-02-29  2:10                             ` Andrew Morton
2008-02-29  5:32                               ` Matthew Wilcox
2008-02-29  6:43                               ` Stephen Rothwell
2008-02-29 16:14                             ` Linus Torvalds
2008-02-29  1:57                       ` Andrew Morton
2008-02-29  5:43                         ` Matthew Wilcox [this message]
2008-02-29  2:37                       ` Harvey Harrison
2008-02-29  2:47                         ` [PATCH] semaphore: remove likely/unlikely annotations Harvey Harrison
2008-03-03 14:54                         ` [PATCH 11/12] Generic semaphore implementation Matthew Wilcox

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=20080229054322.GC19198@parisc-linux.org \
    --to=matthew@wil.cx \
    --cc=akpm@linux-foundation.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=willy@linux.intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox