From: Christian Brauner <brauner@kernel.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>,
Mateusz Guzik <mjguzik@gmail.com>,
viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org, oleg@redhat.com,
Matthew Wilcox <willy@infradead.org>
Subject: Re: [PATCH] fs: use __fput_sync in close(2)
Date: Tue, 8 Aug 2023 19:15:37 +0200 [thread overview]
Message-ID: <20230808-jacken-feigen-46727b8d37ad@brauner> (raw)
In-Reply-To: <CAHk-=whk-8Pv5YXH4jNfyAf2xiQCGCUVyBWw71qJEafn4mT6vw@mail.gmail.com>
On Tue, Aug 08, 2023 at 09:57:04AM -0700, Linus Torvalds wrote:
> On Mon, 7 Aug 2023 at 22:57, Eric W. Biederman <ebiederm@xmission.com> wrote:
> >
> > Taking a quick look at the history it appears that fput was always
> > synchronous [..]
>
> Indeed. Synchronous used to be the only case.
>
> The reason it's async now is because several drivers etc do the final
> close from nasty contexts, so 'fput()' needed to be async for the
> general case.
>
> > All 3 issues taken together says that a synchronous fput is a
> > loaded foot gun that must be used very carefully. That said
> > close(2) does seem to be a reliably safe place to be synchronous.
>
> Yes.
>
> That said, I detest Mateusz' patch. I hate these kinds of "do
> different things based on flags" interfaces. Particularly when it
> spreads out like this.
>
> So I do like having close() be synchronous, because we actually do
> have correctness issues wrt the close having completed properly by the
> time we return to user space, so we have that "task_work_add()" there
> that will force the synchronization anyway before we return.
>
> So the system call case is indeed a special case. Arguably
> close_range() could be too, but honestly, once you start doing ranges
> of file descriptors, you are (a) doint something fairly unusual, and
> (b) the "queue them up on the task work" might actually be a *good*
> thing.
>
> It's definitely not a good thing for the single-fd-close case, though.
>
> But even if we want to do this - and I have absolutely no objections
> to it conceptually as per above - we need to be a lot more surgical
> about it, and not pass stupid flags around.
>
> Here's a TOTALLY UNTESTED(!) patch that I think effectively does what
> Mateusz wants done, but does it all within just fs/open.c and only for
> the obvious context of the close() system call itself.
>
> All it needs is to just split out the "flush" part from filp_close(),
> and we already had all the other infrastructure for this operation.
>
> Mateusz, two questions:
>
> (a) does this patch work for you?
>
> (b) do you have numbers for this all?
I really would like to have good ways of testing the impact of such
things because I'm a little scared of endless optimization patches that
overall either complicate or uglify our code. Maybe I'm paranoid, maybe
that's dumb but it worries me.
>
> and if it all looks good I have no problems with this kind of much
> more targeted and obvious patch.
>
> Again: TOTALLY UNTESTED. It looks completely obvious, but mistakes happen.
I think you're at least missing the removal of the PF_KTHREAD check in
void __fput_sync(struct file *file)
{
if (atomic_long_dec_and_test(&file->f_count)) {
- struct task_struct *task = current;
- BUG_ON(!(task->flags & PF_KTHREAD));
__fput(file);
}
}
so right now we'd BUG_ON(). It'd be neat to leave that in so
__fput_sync() doesn't get proliferated to non PF_KTHREAD without us
noticing. So maybe we just need a tiny primitive.
next prev parent reply other threads:[~2023-08-08 18:56 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-06 23:06 [PATCH] fs: use __fput_sync in close(2) Mateusz Guzik
2023-08-07 3:18 ` Matthew Wilcox
2023-08-08 5:56 ` Eric W. Biederman
2023-08-08 7:32 ` Mateusz Guzik
2023-08-08 8:13 ` Christian Brauner
2023-08-08 8:23 ` Mateusz Guzik
2023-08-08 8:40 ` Christian Brauner
2023-08-08 9:21 ` Mateusz Guzik
2023-08-08 15:07 ` [PATCH v2 (kindof)] " Mateusz Guzik
2023-08-08 16:30 ` Christian Brauner
2023-08-08 17:00 ` Christian Brauner
2023-08-08 17:05 ` Linus Torvalds
2023-08-08 17:06 ` Christian Brauner
2023-08-09 9:03 ` David Laight
2023-08-08 16:57 ` [PATCH] " Linus Torvalds
2023-08-08 17:10 ` Mateusz Guzik
2023-08-08 17:18 ` Linus Torvalds
2023-08-08 17:24 ` Mateusz Guzik
2023-08-08 17:35 ` Christian Brauner
2023-08-08 17:48 ` Linus Torvalds
2023-08-08 17:15 ` Christian Brauner [this message]
2023-08-08 17:22 ` Linus Torvalds
2023-08-08 17:48 ` Eric W. Biederman
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=20230808-jacken-feigen-46727b8d37ad@brauner \
--to=brauner@kernel.org \
--cc=ebiederm@xmission.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mjguzik@gmail.com \
--cc=oleg@redhat.com \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.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.