All of lore.kernel.org
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@arm.com>
To: Boris Ostrovsky <boris.ostrovsky@oracle.com>, xen-devel@lists.xen.org
Cc: sstabellini@kernel.org, wei.liu2@citrix.com,
	George.Dunlap@eu.citrix.com, andrew.cooper3@citrix.com,
	ian.jackson@eu.citrix.com, tim@xen.org, jbeulich@suse.com
Subject: Re: [PATCH v7 6/9] spinlock: Introduce spin_lock_cb()
Date: Mon, 14 Aug 2017 12:22:14 +0100	[thread overview]
Message-ID: <766310e2-aabd-7b23-0bae-1cd8b74a5119@arm.com> (raw)
In-Reply-To: <1502228707-31883-7-git-send-email-boris.ostrovsky@oracle.com>

Hi Boris,

On 08/08/17 22:45, Boris Ostrovsky wrote:
> While waiting for a lock we may want to periodically run some
> code. This code may, for example, allow the caller to release
> resources held by it that are no longer needed in the critical
> section protected by the lock.
>
> Specifically, this feature will be needed by scrubbing code where
> the scrubber, while waiting for heap lock to merge back clean
> pages, may be requested by page allocator (which is currently
> holding the lock) to abort merging and release the buddy page head
> that the allocator wants.
>
> We could use spin_trylock() but since it doesn't take lock ticket
> it may take long time until the lock is taken. Instead we add
> spin_lock_cb() that allows us to grab the ticket and execute a
> callback while waiting. This callback is executed on every iteration
> of the spinlock waiting loop.
>
> Since we may be sleeping in the lock until it is released we need a
> mechanism that will make sure that the callback has a chance to run.
> We add spin_lock_kick() that will wake up the waiter.
>
> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Acked-by: Jan Beulich <jbeulich@suse.com>
> ---
>  xen/common/spinlock.c      | 9 ++++++++-
>  xen/include/xen/spinlock.h | 8 ++++++++
>  2 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c
> index 2a06406..3c1caae 100644
> --- a/xen/common/spinlock.c
> +++ b/xen/common/spinlock.c
> @@ -129,7 +129,7 @@ static always_inline u16 observe_head(spinlock_tickets_t *t)
>      return read_atomic(&t->head);
>  }
>
> -void _spin_lock(spinlock_t *lock)
> +void inline _spin_lock_cb(spinlock_t *lock, void (*cb)(void *), void *data)
>  {
>      spinlock_tickets_t tickets = SPINLOCK_TICKET_INC;
>      LOCK_PROFILE_VAR;
> @@ -140,6 +140,8 @@ void _spin_lock(spinlock_t *lock)
>      while ( tickets.tail != observe_head(&lock->tickets) )
>      {
>          LOCK_PROFILE_BLOCK;
> +        if ( unlikely(cb) )
> +            cb(data);
>          arch_lock_relax();
>      }
>      LOCK_PROFILE_GOT;
> @@ -147,6 +149,11 @@ void _spin_lock(spinlock_t *lock)
>      arch_lock_acquire_barrier();
>  }
>
> +void _spin_lock(spinlock_t *lock)
> +{
> +     _spin_lock_cb(lock, NULL, NULL);
> +}
> +
>  void _spin_lock_irq(spinlock_t *lock)
>  {
>      ASSERT(local_irq_is_enabled());
> diff --git a/xen/include/xen/spinlock.h b/xen/include/xen/spinlock.h
> index c1883bd..91bfb95 100644
> --- a/xen/include/xen/spinlock.h
> +++ b/xen/include/xen/spinlock.h
> @@ -153,6 +153,7 @@ typedef struct spinlock {
>  #define spin_lock_init(l) (*(l) = (spinlock_t)SPIN_LOCK_UNLOCKED)
>
>  void _spin_lock(spinlock_t *lock);
> +void _spin_lock_cb(spinlock_t *lock, void (*cond)(void *), void *data);
>  void _spin_lock_irq(spinlock_t *lock);
>  unsigned long _spin_lock_irqsave(spinlock_t *lock);
>
> @@ -169,6 +170,7 @@ void _spin_lock_recursive(spinlock_t *lock);
>  void _spin_unlock_recursive(spinlock_t *lock);
>
>  #define spin_lock(l)                  _spin_lock(l)
> +#define spin_lock_cb(l, c, d)         _spin_lock_cb(l, c, d)
>  #define spin_lock_irq(l)              _spin_lock_irq(l)
>  #define spin_lock_irqsave(l, f)                                 \
>      ({                                                          \
> @@ -190,6 +192,12 @@ void _spin_unlock_recursive(spinlock_t *lock);
>      1 : ({ local_irq_restore(flags); 0; });     \
>  })
>
> +#define spin_lock_kick(l)                       \
> +({                                              \to understand why you need a stronger one here
> +    smp_mb();                                   \

arch_lock_signal() has already a barrier for ARM. So we have a double 
barrier now.

However, the barrier is slightly weaker (smp_wmb()). I am not sure why 
you need to use a stronger barrier here. What you care is the write to 
be done before signaling, read does not much matter. Did I miss anything?

Cheers,

> +    arch_lock_signal();                         \
> +})
> +
>  /* Ensure a lock is quiescent between two critical operations. */
>  #define spin_barrier(l)               _spin_barrier(l)
>
>

-- 
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  reply	other threads:[~2017-08-14 11:22 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-08 21:44 [PATCH v7 0/9] Memory scrubbing from idle loop Boris Ostrovsky
2017-08-08 21:44 ` [PATCH v7 1/9] mm: Clean up free_heap_pages() Boris Ostrovsky
2017-08-10 12:21   ` Wei Liu
2017-08-14 10:30   ` Jan Beulich
2017-08-08 21:45 ` [PATCH v7 2/9] mm: Place unscrubbed pages at the end of pagelist Boris Ostrovsky
2017-08-14 10:37   ` Jan Beulich
2017-08-14 14:29     ` Boris Ostrovsky
2017-08-15  8:18       ` Jan Beulich
2017-08-15 14:41         ` Boris Ostrovsky
2017-08-15 14:51           ` Jan Beulich
2017-08-15 14:52             ` Julien Grall
2017-08-15 15:03               ` Boris Ostrovsky
2017-08-15 15:08                 ` Jan Beulich
2017-08-14 11:16   ` Julien Grall
2017-08-08 21:45 ` [PATCH v7 3/9] mm: Extract allocation loop from alloc_heap_pages() Boris Ostrovsky
2017-08-08 21:45 ` [PATCH v7 4/9] mm: Scrub pages in alloc_heap_pages() if needed Boris Ostrovsky
2017-08-08 21:45 ` [PATCH v7 5/9] mm: Scrub memory from idle loop Boris Ostrovsky
2017-08-08 21:45 ` [PATCH v7 6/9] spinlock: Introduce spin_lock_cb() Boris Ostrovsky
2017-08-14 11:22   ` Julien Grall [this message]
2017-08-14 14:39     ` Boris Ostrovsky
2017-08-14 14:42       ` Julien Grall
2017-08-14 14:57         ` Boris Ostrovsky
2017-08-08 21:45 ` [PATCH v7 7/9] mm: Keep heap accessible to others while scrubbing Boris Ostrovsky
2017-08-14 10:38   ` Jan Beulich
2017-08-08 21:45 ` [PATCH v7 8/9] mm: Print number of unscrubbed pages in 'H' debug handler Boris Ostrovsky
2017-08-08 21:45 ` [PATCH v7 9/9] mm: Make sure pages are scrubbed Boris Ostrovsky

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=766310e2-aabd-7b23-0bae-1cd8b74a5119@arm.com \
    --to=julien.grall@arm.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=sstabellini@kernel.org \
    --cc=tim@xen.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.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.