public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Imran Khan <imran.f.khan@oracle.com>
To: Al Viro <viro@zeniv.linux.org.uk>
Cc: tj@kernel.org, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org
Subject: Re: [RESEND PATCH v7 1/8] kernfs: Introduce interface to access global kernfs_open_file_mutex.
Date: Wed, 6 Apr 2022 14:54:19 +1000	[thread overview]
Message-ID: <0dfe1056-3dc5-4d31-698e-e2c075ffd6ee@oracle.com> (raw)
In-Reply-To: <YkxRDJ2ynEHGdjeT@zeniv-ca.linux.org.uk>

Hello Al,

On 6/4/22 12:24 am, Al Viro wrote:
[...]
> 
> What for?  Again, have kernfs_drain_open_files() do this:
> {
>         struct kernfs_open_node *on;
> 	struct kernfs_open_file *of;
> 
> 	if (!(kn->flags & (KERNFS_HAS_MMAP | KERNFS_HAS_RELEASE)))
> 		return;
> 	if (rcu_dereference(kn->attr.open) == NULL)
> 		return;
> 	mutex_lock(&kernfs_open_file_mutex);
> 	// now ->attr.open is stable (all stores are under kernfs_open_file_mutex)
> 	on = rcu_dereference(kn->attr.open);
> 	if (!on) {
> 		mutex_unlock(&kernfs_open_file_mutex);
> 		return;
> 	}
> 	// on->files contents is stable
> 	list_for_each_entry(of, &on->files, list) {
> 		struct inode *inode = file_inode(of->file);
> 
> 		if (kn->flags & KERNFS_HAS_MMAP)
> 			unmap_mapping_range(inode->i_mapping, 0, 0, 1);
> 
> 		if (kn->flags & KERNFS_HAS_RELEASE)
> 			kernfs_release_file(kn, of);
> 	}
> 	mutex_unlock(&kernfs_open_file_mutex);
> }
> 

I did something similar in in [1], except that I was traversing
on->files under rcu_read_lock and this was a source of confusion.

> What's the problem?  The caller has already guaranteed that no additions will
> happen.  Once we'd grabbed kernfs_open_file_mutex, we know that
> 	* kn->attr.open value won't change until we drop the mutex
> 	* nothing gets removed from kn->attr.open->files until we drop the mutex
> so we can bloody well walk that list, blocking as much as we want.
> 
> We don't need rcu_read_lock() there - we are already holding the mutex used
> by writers for exclusion among themselves.  RCU *allows* lockless readers,
> it doesn't require all readers to be such.  kernfs_notify() can be made
> lockless, this one can't and that's fine.
> 

Thanks for explaining this. I missed the exclusiveness being provided by
kernfs_open_file_mutex in this case.

> BTW, speaking of kernfs_notify() - can calls of that come from NMI handlers?
> If not, I'd consider using llist for kernfs_notify_list...

I see it gets invoked from 3 places only: cgroup_file_notify,
sysfs_notify and sysfs_notify_dirent. So kernfs_notify should not be
getting invoked in NMI context. I will make the llist transition in next
version.

Thanks,
-- Imran

[1]
https://lore.kernel.org/lkml/20220324103040.584491-3-imran.f.khan@oracle.com/

  reply	other threads:[~2022-04-06 13:34 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-17  7:26 [RESEND PATCH v7 0/8] kernfs: Introduce interface to access global kernfs_open_file_mutex Imran Khan
2022-03-17  7:26 ` [RESEND PATCH v7 1/8] " Imran Khan
2022-03-17 21:34   ` Al Viro
2022-04-05  5:36     ` Imran Khan
2022-04-05 14:24       ` Al Viro
2022-04-06  4:54         ` Imran Khan [this message]
2022-04-06 14:54           ` Al Viro
2022-04-06 15:18             ` Tejun Heo
2022-04-14  0:01           ` Imran Khan
2022-03-18 17:10   ` Eric W. Biederman
2022-03-21  0:10     ` Imran Khan
2022-03-17  7:26 ` [RESEND PATCH v7 2/8] kernfs: Replace global kernfs_open_file_mutex with hashed mutexes Imran Khan
2022-03-17  7:26 ` [RESEND PATCH v7 3/8] kernfs: Introduce interface to access kernfs_open_node_lock Imran Khan
2022-03-17  7:26 ` [RESEND PATCH v7 4/8] kernfs: Replace global kernfs_open_node_lock with hashed spinlocks Imran Khan
2022-03-17  7:26 ` [RESEND PATCH v7 5/8] kernfs: Use a per-fs rwsem to protect per-fs list of kernfs_super_info Imran Khan
2022-03-17  7:26 ` [RESEND PATCH v7 6/8] kernfs: Introduce interface to access per-fs rwsem Imran Khan
2022-03-17  7:26 ` [RESEND PATCH v7 7/8] kernfs: Replace per-fs rwsem with hashed rwsems Imran Khan
2022-03-18  0:07   ` Al Viro
2022-03-21  1:57     ` Imran Khan
2022-03-21  7:29       ` Al Viro
2022-03-21 16:46         ` Tejun Heo
2022-03-21 17:55           ` Al Viro
2022-03-21 19:20             ` Tejun Heo
2022-03-22  2:40               ` Al Viro
2022-03-22 17:08                 ` Tejun Heo
2022-03-22 20:26                   ` Al Viro
2022-03-22 21:20                     ` Tejun Heo
2022-03-28  0:15                 ` Imran Khan
2022-03-28 17:30                   ` Tejun Heo
2022-03-30  2:23                 ` Imran Khan
2022-03-17  7:26 ` [RESEND PATCH v7 8/8] kernfs: Add a document to describe hashed locks used in kernfs Imran Khan

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=0dfe1056-3dc5-4d31-698e-e2c075ffd6ee@oracle.com \
    --to=imran.f.khan@oracle.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tj@kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox