All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jens Axboe <axboe@kernel.dk>
To: Benjamin LaHaise <bcrl@kvack.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Robert Elliot <Elliott@hp.com>
Cc: linux-aio@kvack.org, linux-kernel@vger.kernel.org,
	Christoph Hellwig <hch@infradead.org>,
	stable@vger.kernel.org
Subject: Re: [PATCH] aio: protect reqs_available updates from changes in interrupt handlers
Date: Mon, 14 Jul 2014 19:30:43 +0200	[thread overview]
Message-ID: <53C413C3.7050308@kernel.dk> (raw)
In-Reply-To: <20140714171227.GC11326@kvack.org>

On 2014-07-14 19:12, Benjamin LaHaise wrote:
> Hello everyone,
>
> Please pull the following commit (263782c1c95bbddbb022dc092fd89a36bb8d5577)
> from git://git.kvack.org/aio-fixes.git to fix an aio bug reported by Robert
> Elliot.
> ---
> As of commit f8567a3845ac05bb28f3c1b478ef752762bd39ef it is now possible to
> have put_reqs_available() called from irq context.  While put_reqs_available()
> is per cpu, it did not protect itself from interrupts on the same CPU.  This
> lead to aio_complete() corrupting the available io requests count when run
> under a heavy O_DIRECT workloads as reported by Robert Elliott.  Fix this by
> disabling irq updates around the per cpu batch updates of reqs_available.
>
> Many thanks to Robert and folks for testing and tracking this down.
>
> Reported-by: Robert Elliot <Elliott@hp.com>
> Tested-by: Robert Elliot <Elliott@hp.com>
> Signed-off-by: Benjamin LaHaise <bcrl@kvack.org>
> Cc: Jens Axboe <axboe@kernel.dk>, Christoph Hellwig <hch@infradead.org>
> Cc: stable@vger.kenel.org
> ---
>   fs/aio.c | 7 +++++++
>   1 file changed, 7 insertions(+)
>
> diff --git a/fs/aio.c b/fs/aio.c
> index 955947e..1c9c5f0 100644
> --- a/fs/aio.c
> +++ b/fs/aio.c
> @@ -830,16 +830,20 @@ void exit_aio(struct mm_struct *mm)
>   static void put_reqs_available(struct kioctx *ctx, unsigned nr)
>   {
>   	struct kioctx_cpu *kcpu;
> +	unsigned long flags;
>
>   	preempt_disable();
>   	kcpu = this_cpu_ptr(ctx->cpu);
>
> +	local_irq_save(flags);
>   	kcpu->reqs_available += nr;

Why not just makes this:

	local_irq_save(flags);
	kcpu = this_put_ptr(...);
	...

and get rid of the preemption bits, it's a bit redundant now you need to 
kill local interrupts anyway.

-- 
Jens Axboe


  reply	other threads:[~2014-07-14 17:30 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-14 17:12 [PATCH] aio: protect reqs_available updates from changes in interrupt handlers Benjamin LaHaise
2014-07-14 17:30 ` Jens Axboe [this message]
2014-07-14 17:38   ` Benjamin LaHaise

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=53C413C3.7050308@kernel.dk \
    --to=axboe@kernel.dk \
    --cc=Elliott@hp.com \
    --cc=bcrl@kvack.org \
    --cc=hch@infradead.org \
    --cc=linux-aio@kvack.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=torvalds@linux-foundation.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.