public inbox for linux-arch@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@osdl.org>
To: David Howells <dhowells@redhat.com>
Cc: torvalds@osdl.org, hch@infradead.org, arjan@infradead.org,
	matthew@wil.cx, linux-kernel@vger.kernel.org,
	linux-arch@vger.kernel.org
Subject: Re: [PATCH 1/19] MUTEX: Introduce simple mutex implementation
Date: Mon, 12 Dec 2005 16:19:44 -0800	[thread overview]
Message-ID: <20051212161944.3185a3f9.akpm@osdl.org> (raw)
In-Reply-To: <dhowells1134431145@warthog.cambridge.redhat.com>

David Howells <dhowells@redhat.com> wrote:
>
> The attached patch introduces a simple mutex implementation as an alternative
> to the usual semaphore implementation where simple mutex functionality is all
> that is required.
> 
> This is useful in two ways:
> 
>  (1) A number of archs only provide very simple atomic instructions (such as
>      XCHG on i386, TAS on M68K, SWAP on FRV) which aren't sufficient to
>      implement full semaphore support directly. Instead spinlocks must be
>      employed to implement fuller functionality.
> 
>  (2) This makes it obvious in what way the semaphore is being used: whether
>      it's being used as a mutex or being used as a counter.
> 
> This patch set does the following:
> 
>  (1) Provides a simple xchg() based semaphore as a default for all
>      architectures that don't wish to override it and provide their own.
> 
>      Overriding is possible by setting CONFIG_ARCH_IMPLEMENTS_MUTEX and
>      supplying asm/mutex.h
> 
>      Partial overriding is possible by #defining mutex_grab(), mutex_release()
>      and is_mutex_locked() to perform the appropriate optimised functions.
> 
>  (2) Provides linux/mutex.h as a common include for gaining access to mutex
>      semaphores.
> 
>  (3) Provides linux/semaphore.h as a common include for gaining access to all
>      the different types of semaphore that may be used from within the kernel.
> 
>  (4) Renames down*() to down_sem*() and up() to up_sem() for the traditional
>      semaphores, and removes init_MUTEX*() and DECLARE_MUTEX*() from
>      asm/semaphore.h
> 
>  (5) Redirects the following to apply to the new mutexes rather than the
>      traditional semaphores:
> 
> 	down()
> 	down_trylock()
> 	down_interruptible()
> 	up()
> 	init_MUTEX()
>      	init_MUTEX_LOCKED()
> 	DECLARE_MUTEX()
> 	DECLARE_MUTEX_LOCKED()
> 
>      On the basis that most usages of semaphores are as mutexes, this makes
>      sense for in most cases it's just then a matter of changing the type from
>      struct semaphore to struct mutex. In some cases, sema_init() has to be
>      changed to init_MUTEX*() also.
> 
>  (6) Generally include linux/semaphore.h in place of asm/semaphore.h.
> 
>  (7) Provides a debugging config option CONFIG_DEBUG_MUTEX_OWNER by which the
>      mutex owner can be tracked and by which over-upping can be detected.

Maybe I'm not understanding all this, but...

I'd have thought that the way to do this is to simply reimplement down(),
up(), down_trylock(), etc using the new xchg-based code and to then hunt
down those few parts of the kernel which actually use the old semaphore's
counting feature and convert them to use down_sem(), up_sem(), etc.  And
rename all the old semaphore code: s/down/down_sem/etc.

So after such a transformation, this new "mutex" thingy would not exist.

>  include/linux/mutex.h        |   32 +++++++

But it does.

> +#define mutex_grab(mutex)	(xchg(&(mutex)->state, 1) == 0)

mutex_trylock(), please.

> +#define is_mutex_locked(mutex)	((mutex)->state)

Let's keep the namespace consistent.  mutex_is_locked().

> +static inline void down(struct mutex *mutex)
> +{
> +	if (mutex_grab(mutex)) {

likely()

> +#ifdef CONFIG_DEBUG_MUTEX_OWNER
> +		mutex->__owner = current;
> +#endif
> +	}
> +	else {
> +		__down(mutex);
> +	}
> +}
> +
> +/*
> + * sleep interruptibly until we get the mutex
> + * - return 0 if successful, -EINTR if interrupted
> + */
> +static inline int down_interruptible(struct mutex *mutex)
> +{
> +	if (mutex_grab(mutex)) {

likely()

> +static inline int down_trylock(struct mutex *mutex)
> +{
> +	if (mutex_grab(mutex)) {

etc.

You could just put likely() into mutex_trylock().  err, mutex_grab().

> +/*
> + * release the mutex
> + */
> +static inline void up(struct mutex *mutex)
> +{
> +	unsigned long flags;
> +
> +#ifdef CONFIG_DEBUG_MUTEX_OWNER
> +	if (mutex->__owner != current)
> +		__up_bad(mutex);
> +	mutex->__owner = NULL;
> +#endif
> +
> +	/* must prevent a race */
> +	spin_lock_irqsave(&mutex->wait_lock, flags);
> +	if (!list_empty(&mutex->wait_list))
> +		__up(mutex);
> +	else
> +		mutex_release(mutex);
> +	spin_unlock_irqrestore(&mutex->wait_lock, flags);
> +}

This is too large to inline.

It's also significantly slower than the existing up()?

  parent reply	other threads:[~2005-12-13  0:19 UTC|newest]

Thread overview: 228+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-12 23:45 [PATCH 1/19] MUTEX: Introduce simple mutex implementation David Howells
2005-12-12 23:45 ` [PATCH 2/19] MUTEX: i386 arch mutex David Howells
2005-12-12 23:45 ` [PATCH 8/19] MUTEX: Drivers I-K changes David Howells
2005-12-12 23:45 ` [PATCH 4/19] MUTEX: FRV arch mutex David Howells
2005-12-12 23:45 ` [PATCH 5/19] MUTEX: Core kernel changes David Howells
2005-12-12 23:45 ` [PATCH 3/19] MUTEX: x86_64 arch mutex David Howells
2005-12-12 23:45 ` [PATCH 7/19] MUTEX: Drivers F-H changes David Howells
2005-12-12 23:45 ` [PATCH 6/19] MUTEX: Drivers A-E changes David Howells
2005-12-12 23:45 ` [PATCH 11/19] MUTEX: Drivers Q-S changes David Howells
2005-12-12 23:45 ` [PATCH 14/19] MUTEX: First set of include changes David Howells
2005-12-12 23:45 ` [PATCH 10/19] MUTEX: Drivers N-P changes David Howells
2005-12-12 23:45 ` [PATCH 12/19] MUTEX: Drivers T-Z changes David Howells
2005-12-12 23:45 ` [PATCH 9/19] MUTEX: Drivers L-M changes David Howells
2005-12-12 23:45 ` [PATCH 15/19] MUTEX: Second set of include changes David Howells
2005-12-12 23:45 ` [PATCH 13/19] MUTEX: Filesystem changes David Howells
2005-12-12 23:45 ` [PATCH 17/19] MUTEX: Networking changes David Howells
2005-12-12 23:45 ` [PATCH 18/19] MUTEX: Security changes David Howells
2005-12-12 23:45 ` [PATCH 19/19] MUTEX: Sound changes David Howells
2005-12-12 23:45 ` [PATCH 16/19] MUTEX: IPC changes David Howells
2005-12-13  0:13 ` [PATCH 1/19] MUTEX: Introduce simple mutex implementation Nick Piggin
2005-12-13  9:54   ` David Howells
2005-12-13 10:13     ` Ingo Molnar
2005-12-13 10:34       ` Ingo Molnar
2005-12-13 10:37         ` Ingo Molnar
2005-12-13 12:47         ` Oliver Neukum
2005-12-13 13:09           ` Alan Cox
2005-12-13 13:13             ` Matthew Wilcox
2005-12-13 14:04               ` Alan Cox
2005-12-13 13:24             ` Oliver Neukum
2005-12-14  1:00     ` Nick Piggin
2005-12-14 10:54       ` David Howells
2005-12-14 11:17         ` Nick Piggin
2005-12-14 11:46           ` David Howells
2005-12-14 21:23             ` Nick Piggin
2005-12-16 12:00               ` David Howells
2005-12-16 13:16                 ` Nick Piggin
2005-12-16 15:53                   ` David Howells
2005-12-16 23:41                     ` Nick Piggin
2005-12-16 16:02                   ` David Howells
2005-12-13  0:19 ` Nick Piggin
2005-12-13 11:23   ` David Howells
2005-12-13 11:34     ` David Howells
2005-12-13  0:19 ` Andrew Morton [this message]
2005-12-13  7:54   ` Ingo Molnar
2005-12-13  7:58     ` Andi Kleen
2005-12-13  8:42       ` Andrew Morton
2005-12-13  8:49         ` Andi Kleen
2005-12-13  9:01           ` Andrew Morton
2005-12-13  9:02             ` Andrew Morton
2005-12-13 10:07               ` Jakub Jelinek
2005-12-13 10:11                 ` Andi Kleen
2005-12-13 10:15                   ` Jakub Jelinek
2005-12-13 10:25                   ` Andrew Morton
2005-12-14 10:46               ` Russell King
2005-12-13  9:05             ` Andi Kleen
2005-12-13  9:15               ` Andrew Morton
2005-12-13  9:24                 ` Andi Kleen
2005-12-13  9:44                   ` Andrew Morton
2005-12-13  9:49                     ` Andi Kleen
2005-12-13 10:28                   ` Andreas Schwab
2005-12-13 10:30                     ` Andi Kleen
2005-12-13 12:33                   ` Matthew Wilcox
2005-12-13 22:18               ` Adrian Bunk
2005-12-13 22:25                 ` Andi Kleen
2005-12-13 22:32                   ` Adrian Bunk
2005-12-13  9:11             ` Ingo Molnar
2005-12-13  9:04           ` Christoph Hellwig
2005-12-13  9:13             ` Ingo Molnar
2005-12-13 10:11             ` Jakub Jelinek
2005-12-13 10:19               ` Christoph Hellwig
2005-12-13 10:27                 ` Ingo Molnar
2005-12-15  4:53                 ` Miles Bader
2005-12-15  5:05                   ` Nick Piggin
2005-12-13  9:09           ` Ingo Molnar
2005-12-13  9:21             ` Andi Kleen
2005-12-13 16:16           ` Linus Torvalds
2005-12-13  9:03         ` Christoph Hellwig
2005-12-13  9:14           ` Andrew Morton
2005-12-13  9:21             ` Christoph Hellwig
2005-12-13 10:31             ` drivers/scsi/sd.c gcc-2.95.3 Alexey Dobriyan
2005-12-13  8:00     ` [PATCH 1/19] MUTEX: Introduce simple mutex implementation Arjan van de Ven
2005-12-13  9:03       ` Ingo Molnar
2005-12-13  9:09         ` Andi Kleen
2005-12-13  9:34           ` Ingo Molnar
2005-12-13 14:33             ` Mark Lord
2005-12-13 14:45               ` Arjan van de Ven
2005-12-13  9:37           ` Ingo Molnar
2005-12-13  9:19         ` Arjan van de Ven
2005-12-13  9:02     ` Christoph Hellwig
2005-12-13  9:39       ` Ingo Molnar
2005-12-13 10:00         ` Ingo Molnar
2005-12-13 17:40           ` Paul Jackson
2005-12-13 18:34             ` David Howells
2005-12-13 22:31               ` Paul Jackson
2005-12-14 11:02                 ` David Howells
2005-12-14 11:12                   ` David Howells
2005-12-14 11:18                     ` Alan Cox
2005-12-14 12:35                       ` David Howells
2005-12-14 13:58                         ` Thomas Gleixner
2005-12-14 23:40                           ` Mark Lord
2005-12-14 23:54                             ` Andrew Morton
2005-12-15 13:41                               ` Nikita Danilov
2005-12-15 14:56                                 ` Alan Cox
2005-12-15 15:52                                   ` Nikita Danilov
2005-12-15 15:55                                     ` David Howells
2005-12-15 16:22                                       ` linux-os (Dick Johnson)
2005-12-15 16:28                                       ` Linus Torvalds
2005-12-15 16:51                                         ` David Howells
2005-12-15 17:04                                         ` Thomas Gleixner
2005-12-15 17:09                                         ` Paul Jackson
2005-12-15 17:17                                           ` David Howells
2005-12-15 16:56                                       ` Paul Jackson
2005-12-15 17:28                                         ` David Howells
2005-12-15 17:48                                           ` Linus Torvalds
2005-12-15 18:20                                             ` Nikita Danilov
2005-12-15 20:58                                               ` Steven Rostedt
2005-12-15 19:21                                             ` Andrew Morton
2005-12-15 19:38                                               ` Linus Torvalds
2005-12-15 20:28                                               ` Steven Rostedt
2005-12-15 20:32                                                 ` Geert Uytterhoeven
2005-12-16 21:41                                                   ` Thomas Gleixner
2005-12-16 21:41                                                     ` Linus Torvalds
2005-12-16 22:06                                                       ` Thomas Gleixner
2005-12-16 22:19                                                         ` Linus Torvalds
2005-12-16 22:32                                                           ` Steven Rostedt
2005-12-16 22:42                                                           ` Thomas Gleixner
2005-12-16 22:41                                                             ` Linus Torvalds
2005-12-16 22:49                                                               ` Steven Rostedt
2005-12-16 23:29                                                               ` Thomas Gleixner
2005-12-17  0:29                                                               ` Joe Korty
2005-12-17  1:00                                                                 ` Linus Torvalds
2005-12-17  3:13                                                                   ` Steven Rostedt
2005-12-17  7:34                                                                     ` Linus Torvalds
2005-12-17 23:43                                                                       ` Matthew Wilcox
2005-12-18  0:05                                                                         ` Lee Revell
2005-12-18  0:21                                                                           ` Matthew Wilcox
2005-12-18  1:25                                                                             ` Lee Revell
2005-12-22 12:27                                                                         ` Bill Huey
2005-12-19 16:08                                                                       ` Ingo Molnar
2005-12-22 12:40                                                                       ` Bill Huey
2005-12-22 12:45                                                                         ` Bill Huey
2005-12-19 23:46                                                                   ` Keith Owens
2005-12-15 16:50                                     ` Christopher Friesen
2005-12-15 20:53                                       ` Steven Rostedt
2005-12-15 14:41                               ` Steven Rostedt
2005-12-15 15:37                               ` David Howells
2005-12-15 19:28                                 ` Andrew Morton
2005-12-15 20:18                                   ` Andrew Morton
2005-12-15 21:28                                     ` Steven Rostedt
2005-12-16 10:45                                     ` David Howells
2005-12-16 22:02                                     ` Thomas Gleixner
2005-12-14 23:57                             ` Thomas Gleixner
2005-12-14 23:57                               ` Mark Lord
2005-12-15  0:10                                 ` Thomas Gleixner
2005-12-15  2:46                                   ` Linus Torvalds
2005-12-15 15:53                                     ` David Howells
2005-12-13  9:55     ` Ingo Molnar
2005-12-13 10:48   ` David Howells
2005-12-13 12:39     ` Matthew Wilcox
2005-12-13  0:30 ` Arnd Bergmann
2005-12-13 21:03   ` David Howells
2005-12-13  0:57 ` Daniel Walker
2005-12-13  3:23   ` Steven Rostedt
2005-12-13  2:57 ` Mark Lord
2005-12-13  3:17   ` Steven Rostedt
2005-12-13  9:06   ` Christoph Hellwig
2005-12-13 10:54 ` Ingo Molnar
2005-12-13 11:24   ` David Howells
2005-12-13 13:45     ` Ingo Molnar
2005-12-13 13:05 ` Alan Cox
2005-12-13 13:15   ` Alan Cox
2005-12-13 23:21     ` Nikita Danilov
2005-12-13 13:32   ` David Howells
2005-12-13 14:00     ` Alan Cox
2005-12-13 15:23       ` David Howells
2005-12-15  5:24         ` Miles Bader
2005-12-13 14:35     ` Christopher Friesen
2005-12-13 14:44       ` Arjan van de Ven
2005-12-13 14:59         ` Christopher Friesen
2005-12-13 15:39       ` David Howells
2005-12-13 16:10         ` Alan Cox
2005-12-14 10:29           ` Arjan van de Ven
2005-12-14 11:03             ` Arjan van de Ven
2005-12-14 11:03             ` Alan Cox
2005-12-14 11:08               ` Arjan van de Ven
2005-12-14 11:24                 ` Alan Cox
2005-12-14 11:35                   ` Andrew Morton
2005-12-14 11:44                     ` Arjan van de Ven
2005-12-14 11:52                       ` Andi Kleen
2005-12-14 11:55                         ` Arjan van de Ven
2005-12-14 11:57                       ` David Howells
2005-12-14 12:19                         ` Jakub Jelinek
2005-12-16  1:54                         ` Nick Piggin
2005-12-16 11:02                           ` David Howells
2005-12-16 11:30                             ` David Howells
2005-12-16 16:33                               ` Linus Torvalds
2005-12-16 22:23                                 ` David S. Miller
2005-12-16 22:38                                   ` Linus Torvalds
2005-12-16 22:53                                     ` David S. Miller
2005-12-17  0:41                                       ` Jesse Barnes
2005-12-17  7:10                                         ` David S. Miller
2005-12-17  7:40                                           ` Linus Torvalds
2005-12-17 17:22                                             ` Jesse Barnes
2005-12-17 17:19                                           ` Jesse Barnes
2005-12-17 22:38                                       ` Richard Henderson
2005-12-17 23:05                                         ` David S. Miller
2005-12-16 13:01                             ` Nick Piggin
2005-12-16 13:21                               ` Russell King
2005-12-16 13:41                                 ` Nick Piggin
2005-12-16 13:46                                 ` Linh Dang
2005-12-16 14:31                                   ` Russell King
2005-12-16 15:24                                     ` Linh Dang
2005-12-16 15:35                                       ` Nick Piggin
2005-12-16 15:40                                       ` Kyle Moffett
2005-12-16 15:46                                     ` David Howells
2005-12-16 15:58                                       ` Russell King
2005-12-16 15:49                                     ` Linh Dang
2005-12-17 15:57                               ` Nikita Danilov
2005-12-16 16:28                             ` Linus Torvalds
2005-12-14 12:17                     ` Christoph Hellwig
2005-12-14 11:42                   ` Arjan van de Ven
2005-12-14  8:31         ` Ingo Molnar
2005-12-13 20:04     ` Steven Rostedt
  -- strict thread matches above, loose matches on Subject: below --
2005-12-15 17:45 Luck, Tony
2005-12-15 18:00 ` David Howells
2005-12-15 18:48 ` James Bottomley
2005-12-15 20:38 ` Jeff Dike
2005-12-15 23:45   ` Stephen Rothwell

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=20051212161944.3185a3f9.akpm@osdl.org \
    --to=akpm@osdl.org \
    --cc=arjan@infradead.org \
    --cc=dhowells@redhat.com \
    --cc=hch@infradead.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matthew@wil.cx \
    --cc=torvalds@osdl.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox