Message ID | 2851036.1679417029@warthog.procyon.org.uk |
---|---|
State | New |
Headers | show |
Series | [GIT,PULL] keys: Miscellaneous fixes/changes | expand |
On Tue, Mar 21, 2023 at 9:43 AM David Howells <dhowells@redhat.com> wrote: > > (1) Fix request_key() so that it doesn't cache a looked up key on the > current thread if that thread is a kernel thread. The cache is > cleared during notify_resume - but that doesn't happen in kernel > threads. This is causing cifs DNS keys to be un-invalidateable. I've pulled this, but I'd like people to look a bit more at this. The issue with TIF_NOTIFY_RESUME is that it is only done on return to user space. And these days, PF_KTHREAD isn't the only case that never returns to user space. PF_IO_WORKER has the exact same behaviour. Now, to counteract this, as of this merge window (and marked for stable) IO threads do a fake "return to user mode" handling in io_run_task_work(), and so I think we're all good, but I'd like people to at least think about this. Linus
The pull request you sent on Tue, 21 Mar 2023 16:43:49 +0000:
> git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git tags/keys-fixes-20230321
has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/2faac9a98f010cf5b342fa89ac489c4586364e6e
Thank you!
On 3/21/23 12:48?PM, Linus Torvalds wrote: > On Tue, Mar 21, 2023 at 9:43?AM David Howells <dhowells@redhat.com> wrote: >> >> (1) Fix request_key() so that it doesn't cache a looked up key on the >> current thread if that thread is a kernel thread. The cache is >> cleared during notify_resume - but that doesn't happen in kernel >> threads. This is causing cifs DNS keys to be un-invalidateable. > > I've pulled this, but I'd like people to look a bit more at this. > > The issue with TIF_NOTIFY_RESUME is that it is only done on return to > user space. > > And these days, PF_KTHREAD isn't the only case that never returns to > user space. PF_IO_WORKER has the exact same behaviour. > > Now, to counteract this, as of this merge window (and marked for > stable) IO threads do a fake "return to user mode" handling in > io_run_task_work(), and so I think we're all good, but I'd like people > to at least think about this. I haven't seen the patch yet as it hasn't been pushed, but can imagine what it looks like. It may make sense to add some debug check for PF_KTHREAD having TIF_NOTIFY_RESUME set, or task_work pending for that matter, as that is generally not workable without doing something to handle it explicitly. For PF_IO_WORKER, with the commit you mentioned, those threads should deal with TIF_NOTIFY_RESUME just fine. Until something else gets added that is also run from exit_to_user_mode...
On Tue, Mar 21, 2023 at 12:16 PM Jens Axboe <axboe@kernel.dk> wrote: > > I haven't seen the patch yet as it hasn't been pushed, Well, it went out a couple of minutes before your email, so it's out now. > It may make sense to add some debug check for > PF_KTHREAD having TIF_NOTIFY_RESUME set, or task_work pending for that > matter, as that is generally not workable without doing something to > handle it explicitly. Yeah, I guess we could have some generic check for that. I'm not sure where it would be. Scheduler? Linus
On 3/21/23 1:21?PM, Linus Torvalds wrote: > On Tue, Mar 21, 2023 at 12:16?PM Jens Axboe <axboe@kernel.dk> wrote: >> >> I haven't seen the patch yet as it hasn't been pushed, > > Well, it went out a couple of minutes before your email, so it's out now. Yep I see it now, looks as expected. >> It may make sense to add some debug check for >> PF_KTHREAD having TIF_NOTIFY_RESUME set, or task_work pending for that >> matter, as that is generally not workable without doing something to >> handle it explicitly. > > Yeah, I guess we could have some generic check for that. I'm not sure > where it would be. Scheduler? Off the top of my head, two options, both in kernel/sched/core.c: 1) Add it to schedule_debug() 2) Add it to sched_submit_work(), adding PF_KTHREAD to the flags checked for PF_IO_WORKER | PF_WQ_WORKER to avoid adding any extra fast-path overhead. Alternatively, I guess it could go in kthread_exit() as well. But for workloads with a persistent kthread that doesn't really go away, that won't catch it.