All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Snitzer <snitzer@redhat.com>
To: Mikulas Patocka <mpatocka@redhat.com>
Cc: Eric Biggers <ebiggers@kernel.org>,
	dm-devel@redhat.com, Mike Snitzer <snitzer@kernel.org>,
	Sami Tolvanen <samitolvanen@google.com>,
	Nathan Huckleberry <nhuck@google.com>
Subject: Re: [dm-devel] [PATCH v2 2/6] dm bufio: Add DM_BUFIO_CLIENT_NO_SLEEP flag
Date: Wed, 27 Jul 2022 11:47:59 -0400	[thread overview]
Message-ID: <YuFeL6J1gtFV63dW@redhat.com> (raw)
In-Reply-To: <alpine.LRH.2.02.2207271055510.28280@file01.intranet.prod.int.rdu2.redhat.com>

On Wed, Jul 27 2022 at 11:25P -0400,
Mikulas Patocka <mpatocka@redhat.com> wrote:

> Hi
> 
> I'd like to ask - why not use dm_bufio_trylock from an interrupt context?
> 
> I would just add a new function "dm_bufio_get_trylock" that is equivalent 
> to "dm_bufio_get", except that it uses dm_bufio_trylock - and if it fails, 
> fallback to process context.
> 
> I think using dm_bufio_trylock would be less hacky than introducing a 
> new dm_bufio flag that changes mutex to spinlock.

OK, I can drop the bufio hacks (patches 1 and 2) and replace with a
dm_bufio_get_trylock and see if that resolves the cryptsetup testing
issues Milan is reporting.  But on the flip side I feel like trylock
is far more prone to fail for at least one of a series of cached
buffers needed (via _get). And so it'll punt to workqueue more often
and _not_ provide the desired performance improvement.  BUT.. we shall
see.

All said, I'm now dropping this patchset from the upcoming 5.20 merge.
This all clearly needs more development time.

Huck: I'll run with Mikulas's suggestion and try to get the cryptsetup
tests passing. But I'll leave performance testing to you.

Thanks,
Mike



> On Tue, 26 Jul 2022, Mike Snitzer wrote:
> 
> > From: Nathan Huckleberry <nhuck@google.com>
> > 
> > Add an optional flag that ensures dm_bufio_client does not sleep
> > (primary focus is to service dm_bufio_get without sleeping). This
> > allows the dm-bufio cache to be queried from interrupt context.
> > 
> > To ensure that dm-bufio does not sleep, dm-bufio must use a spinlock
> > instead of a mutex. Additionally, to avoid deadlocks, special care
> > must be taken so that dm-bufio does not sleep while holding the
> > spinlock.
> > 
> > But again: the scope of this no_sleep is initially confined to
> > dm_bufio_get, so __alloc_buffer_wait_no_callback is _not_ changed to
> > avoid sleeping because __bufio_new avoids allocation for NF_GET.
> > 
> > Signed-off-by: Nathan Huckleberry <nhuck@google.com>
> > Signed-off-by: Mike Snitzer <snitzer@kernel.org>
> > ---
> >  drivers/md/dm-bufio.c    | 22 +++++++++++++++++++---
> >  include/linux/dm-bufio.h |  5 +++++
> >  2 files changed, 24 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c
> > index ad5603eb12e3..486179d1831c 100644
> > --- a/drivers/md/dm-bufio.c
> > +++ b/drivers/md/dm-bufio.c
> > @@ -81,6 +81,8 @@
> >   */
> >  struct dm_bufio_client {
> >  	struct mutex lock;
> > +	spinlock_t spinlock;
> > +	unsigned long spinlock_flags;
> >  
> >  	struct list_head lru[LIST_SIZE];
> >  	unsigned long n_buffers[LIST_SIZE];
> > @@ -90,6 +92,7 @@ struct dm_bufio_client {
> >  	s8 sectors_per_block_bits;
> >  	void (*alloc_callback)(struct dm_buffer *);
> >  	void (*write_callback)(struct dm_buffer *);
> > +	bool no_sleep;
> >  
> >  	struct kmem_cache *slab_buffer;
> >  	struct kmem_cache *slab_cache;
> > @@ -167,17 +170,26 @@ struct dm_buffer {
> >  
> >  static void dm_bufio_lock(struct dm_bufio_client *c)
> >  {
> > -	mutex_lock_nested(&c->lock, dm_bufio_in_request());
> > +	if (c->no_sleep)
> > +		spin_lock_irqsave_nested(&c->spinlock, c->spinlock_flags, dm_bufio_in_request());
> > +	else
> > +		mutex_lock_nested(&c->lock, dm_bufio_in_request());
> >  }
> >  
> >  static int dm_bufio_trylock(struct dm_bufio_client *c)
> >  {
> > -	return mutex_trylock(&c->lock);
> > +	if (c->no_sleep)
> > +		return spin_trylock_irqsave(&c->spinlock, c->spinlock_flags);
> > +	else
> > +		return mutex_trylock(&c->lock);
> >  }
> >  
> >  static void dm_bufio_unlock(struct dm_bufio_client *c)
> >  {
> > -	mutex_unlock(&c->lock);
> > +	if (c->no_sleep)
> > +		spin_unlock_irqrestore(&c->spinlock, c->spinlock_flags);
> > +	else
> > +		mutex_unlock(&c->lock);
> >  }
> >  
> >  /*----------------------------------------------------------------*/
> > @@ -1748,12 +1760,16 @@ struct dm_bufio_client *dm_bufio_client_create(struct block_device *bdev, unsign
> >  	c->alloc_callback = alloc_callback;
> >  	c->write_callback = write_callback;
> >  
> > +	if (flags & DM_BUFIO_CLIENT_NO_SLEEP)
> > +		c->no_sleep = true;
> > +
> >  	for (i = 0; i < LIST_SIZE; i++) {
> >  		INIT_LIST_HEAD(&c->lru[i]);
> >  		c->n_buffers[i] = 0;
> >  	}
> >  
> >  	mutex_init(&c->lock);
> > +	spin_lock_init(&c->spinlock);
> >  	INIT_LIST_HEAD(&c->reserved_buffers);
> >  	c->need_reserved_buffers = reserved_buffers;
> >  
> > diff --git a/include/linux/dm-bufio.h b/include/linux/dm-bufio.h
> > index e21480715255..15d9e15ca830 100644
> > --- a/include/linux/dm-bufio.h
> > +++ b/include/linux/dm-bufio.h
> > @@ -17,6 +17,11 @@
> >  struct dm_bufio_client;
> >  struct dm_buffer;
> >  
> > +/*
> > + * Flags for dm_bufio_client_create
> > + */
> > +#define DM_BUFIO_CLIENT_NO_SLEEP 0x1
> > +
> >  /*
> >   * Create a buffered IO cache on a given device
> >   */
> > -- 
> > 2.32.1 (Apple Git-133)
> > 
> > --
> > dm-devel mailing list
> > dm-devel@redhat.com
> > https://listman.redhat.com/mailman/listinfo/dm-devel
> > 
> --
> dm-devel mailing list
> dm-devel@redhat.com
> https://listman.redhat.com/mailman/listinfo/dm-devel
> 

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


  reply	other threads:[~2022-07-27 16:19 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-26 16:09 [dm-devel] [PATCH v2 0/6] dm verity: optionally use tasklets Mike Snitzer
2022-07-26 16:09 ` [dm-devel] [PATCH v2 1/6] dm bufio: Add flags argument to dm_bufio_client_create Mike Snitzer
2022-07-26 16:09 ` [dm-devel] [PATCH v2 2/6] dm bufio: Add DM_BUFIO_CLIENT_NO_SLEEP flag Mike Snitzer
2022-07-27 15:25   ` Mikulas Patocka
2022-07-27 15:47     ` Mike Snitzer [this message]
2022-07-27 19:53       ` Nathan Huckleberry
2022-07-28 22:37         ` Mike Snitzer
2022-07-26 16:09 ` [dm-devel] [PATCH v2 3/6] dm verity: Add optional "try_verify_in_tasklet" feature Mike Snitzer
2022-07-26 16:09 ` [dm-devel] [PATCH v2 4/6] dm verity: allow optional args to alter primary args handling Mike Snitzer
2022-07-26 16:09 ` [dm-devel] [PATCH v2 5/6] dm bufio: conditionally enable branching for DM_BUFIO_CLIENT_NO_SLEEP Mike Snitzer
2022-07-26 16:09 ` [dm-devel] [PATCH v2 6/6] dm verity: conditionally enable branching for "try_verify_in_tasklet" Mike Snitzer
2022-07-26 20:18 ` [dm-devel] [PATCH v2 0/6] dm verity: optionally use tasklets Nathan Huckleberry
2022-07-26 21:44 ` Milan Broz
2022-07-26 23:04   ` Mike Snitzer
2022-07-27  8:23     ` Milan Broz
2022-08-03  1:39       ` Nathan Huckleberry
2022-08-03 16:17         ` Mike Snitzer
2022-08-03 18:29           ` [dm-devel] [PATCH] Fixes 6890e9b8c7d0a1062bbf4f854b6be3723836ad9a Nathan Huckleberry
2022-08-04 20:22             ` [dm-devel] " Mike Snitzer

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=YuFeL6J1gtFV63dW@redhat.com \
    --to=snitzer@redhat.com \
    --cc=dm-devel@redhat.com \
    --cc=ebiggers@kernel.org \
    --cc=mpatocka@redhat.com \
    --cc=nhuck@google.com \
    --cc=samitolvanen@google.com \
    --cc=snitzer@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.