From: Chuck Lever <chuck.lever@oracle.com>
To: Olga Kornievskaia <okorniev@redhat.com>, jlayton@kernel.org
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 1/3] llist: add ability to remove a particular entry from the list
Date: Thu, 16 Jan 2025 09:26:45 -0500 [thread overview]
Message-ID: <b469204c-adb7-4cc6-a8e9-dfd19ee331df@oracle.com> (raw)
In-Reply-To: <20250115232406.44815-2-okorniev@redhat.com>
On 1/15/25 6:24 PM, Olga Kornievskaia wrote:
> nfsd stores its network transports in a lwq (which is a lockless list)
> llist has no ability to remove a particular entry which nfsd needs
> to remove a listener thread.
Note that scripts/get_maintainer.pl says that the maintainer of this
file is:
linux-kernel@vger.kernel.org
so that address should appear on the cc: list of this series. So
should the list of reviewers for NFSD that appear in MAINTAINERS.
ISTR Neil found the same gap in the llist API. I don't think it's
possible to safely remove an item from the middle of an llist. Much
of the complexity of the current svc thread scheduler is due to this
complication.
I think you will need to mark the listener as dead and find some
way of safely dealing with it later.
> Suggested-by: Jeff Layton <jlayton@kernel.org>
> Signed-off-by: Olga Kornievskaia <okorniev@redhat.com>
> ---
> include/linux/llist.h | 36 ++++++++++++++++++++++++++++++++++++
> 1 file changed, 36 insertions(+)
>
> diff --git a/include/linux/llist.h b/include/linux/llist.h
> index 2c982ff7475a..fe6be21897d9 100644
> --- a/include/linux/llist.h
> +++ b/include/linux/llist.h
> @@ -253,6 +253,42 @@ static inline bool __llist_add(struct llist_node *new, struct llist_head *head)
> return __llist_add_batch(new, new, head);
> }
>
> +/**
> + * llist_del_entry - remove a particular entry from a lock-less list
> + * @head: head of the list to remove the entry from
> + * @entry: entry to be removed from the list
> + *
> + * Walk the list, find the given entry and remove it from the list.
> + * The caller must ensure that nothing can race in and change the
> + * list while this is running.
> + *
> + * Returns true if the entry was found and removed.
> + */
> +static inline bool llist_del_entry(struct llist_head *head, struct llist_node *entry)
> +{
> + struct llist_node *pos;
> +
> + if (!head->first)
> + return false;
> +
> + /* Is it the first entry? */
> + if (head->first == entry) {
> + head->first = entry->next;
> + entry->next = entry;
> + return true;
> + }
> +
> + /* Find it in the list */
> + llist_for_each(head->first, pos) {
> + if (pos->next == entry) {
> + pos->next = entry->next;
> + entry->next = entry;
> + return true;
> + }
> + }
> + return false;
> +}
> +
> /**
> * llist_del_all - delete all entries from lock-less list
> * @head: the head of lock-less list to delete all entries
--
Chuck Lever
next prev parent reply other threads:[~2025-01-16 14:27 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-15 23:24 [PATCH 0/3] fix removal of nfsd listeners Olga Kornievskaia
2025-01-15 23:24 ` [PATCH 1/3] llist: add ability to remove a particular entry from the list Olga Kornievskaia
2025-01-16 14:26 ` Chuck Lever [this message]
2025-01-16 14:54 ` Olga Kornievskaia
2025-01-16 15:33 ` Chuck Lever
2025-01-16 15:42 ` Jeff Layton
2025-01-16 16:00 ` Chuck Lever
2025-01-16 16:31 ` Olga Kornievskaia
2025-01-16 16:44 ` Chuck Lever
2025-01-17 4:08 ` kernel test robot
2025-01-17 4:08 ` kernel test robot
2025-01-24 0:57 ` kernel test robot
2025-01-15 23:24 ` [PATCH 2/3] SUNRPC: add ability to remove specific server transport Olga Kornievskaia
2025-01-15 23:24 ` [PATCH 3/3] nfsd: fix management of listener transports Olga Kornievskaia
2025-01-16 14:27 ` Chuck Lever
2025-01-16 14:46 ` Jeff Layton
2025-01-16 14:55 ` Chuck Lever
2025-01-16 15:34 ` Olga Kornievskaia
2025-01-16 15:42 ` Chuck Lever
2025-01-16 11:53 ` [PATCH 0/3] fix removal of nfsd listeners Jeff Layton
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=b469204c-adb7-4cc6-a8e9-dfd19ee331df@oracle.com \
--to=chuck.lever@oracle.com \
--cc=jlayton@kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=okorniev@redhat.com \
/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