[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <ZmsZ_lKgOlB6Wypy@kbusch-mbp.dhcp.thefacebook.com>
Date: Thu, 13 Jun 2024 10:10:38 -0600
From: Keith Busch <kbusch@...nel.org>
To: "Paul E. McKenney" <paulmck@...nel.org>
Cc: Nilay Shroff <nilay@...ux.ibm.com>, Keith Busch <kbusch@...a.com>,
linux-nvme@...ts.infradead.org, linux-kernel@...r.kernel.org,
linux-kselftest@...r.kernel.org, hch@....de, sagi@...mberg.me,
davidgow@...gle.com, akpm@...ux-foundation.org,
venkat88@...ux.vnet.ibm.com
Subject: Re: [PATCH 1/2] list: introduce a new cutting helper
On Thu, Jun 13, 2024 at 09:01:47AM -0700, Paul E. McKenney wrote:
>
> Is there a way to avoid this issue by making this be a statement parameter
> to a macro?
Something like this? It appears to work for the intended use, at least.
---
diff --git a/include/linux/rculist.h b/include/linux/rculist.h
index 3dc1e58865f77..cdd2e5c0d5cdb 100644
--- a/include/linux/rculist.h
+++ b/include/linux/rculist.h
@@ -204,6 +204,30 @@ static inline void list_replace_rcu(struct list_head *old,
old->prev = LIST_POISON2;
}
+
+static inline void __list_cut_start(struct list_head *list,
+ struct list_head *head,
+ struct list_head *entry)
+{
+ list->next = entry;
+ list->prev = head->prev;
+ __list_del(entry->prev, head);
+}
+
+static inline void __list_cut_end(struct list_head *list,
+ struct list_head *entry)
+{
+ entry->prev = list;
+ list->prev->next = list;
+}
+
+#define list_cut_rcu(list, head, entry, sync) \
+ do { \
+ __list_cut_start(list, head, entry); \
+ sync; \
+ __list_cut_end(list, entry); \
+ } while (0)
+
/**
* __list_splice_init_rcu - join an RCU-protected list into an existing list.
* @list: the RCU-protected list to splice
--
Powered by blists - more mailing lists