From: Zhen Lei <thunder.leizhen@huawei.com>
To: Andrew Morton <akpm@linux-foundation.org>,
Thomas Gleixner <tglx@linutronix.de>,
<linux-kernel@vger.kernel.org>, David Gow <davidgow@google.com>,
<linux-kselftest@vger.kernel.org>, <kunit-dev@googlegroups.com>
Cc: Zhen Lei <thunder.leizhen@huawei.com>
Subject: [PATCH 1/3] list: add hlist_cut_number()
Date: Wed, 4 Sep 2024 21:41:50 +0800 [thread overview]
Message-ID: <20240904134152.2141-2-thunder.leizhen@huawei.com> (raw)
In-Reply-To: <20240904134152.2141-1-thunder.leizhen@huawei.com>
Add a function to pull a sub list containing up to @cnt nodes from @old
list. This is beneficial to performance in scenarios where N free nodes
are pulled from the global list to the local list, or N free nodes are
pushed from the local list to the global list. Because the old sub list
is no longer split and then spliced into the new list one by one, this
also enhances readability.
Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
---
include/linux/list.h | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/include/linux/list.h b/include/linux/list.h
index 5f4b0a39cf46a37..9fb58cbceb1245c 100644
--- a/include/linux/list.h
+++ b/include/linux/list.h
@@ -1210,4 +1210,48 @@ static inline size_t hlist_count_nodes(struct hlist_head *head)
return count;
}
+/**
+ * hlist_cut_number - cut a list into two
+ * @new: a new list to add all removed entries
+ * @old: a list with entries
+ * @cnt: maximum of nodes need to be cut
+ * @last: save the last node of the new list
+ *
+ * This helper moves the initial part of @old, maximum of @cnt nodes, from
+ * @old to @new. @new should be an empty list or a list you do not care about
+ * losing its data.
+ *
+ * Returns the number of nodes in the @new list, maybe zero.
+ *
+ */
+static inline int hlist_cut_number(struct hlist_head *new,
+ struct hlist_head *old, int cnt, struct hlist_node **last)
+{
+ int nr = 0;
+ struct hlist_node *tmp, *pos = NULL;
+
+ if (cnt <= 0)
+ return 0;
+
+ hlist_for_each(tmp, old) {
+ nr++;
+ pos = tmp;
+ if (nr >= cnt)
+ break;
+ }
+
+ *last = pos;
+ new->first = old->first;
+
+ if (pos) {
+ new->first->pprev = &new->first;
+ old->first = pos->next;
+ if (old->first)
+ old->first->pprev = &old->first;
+ pos->next = NULL;
+ }
+
+ return nr;
+}
+
#endif
--
2.34.1
next prev parent reply other threads:[~2024-09-04 13:43 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-04 13:41 [PATCH 0/3] debugobjects: Add hlist_cut_number() and use it to optimize code Zhen Lei
2024-09-04 13:41 ` Zhen Lei [this message]
2024-09-04 13:41 ` [PATCH 2/3] list: test: Add a test for hlist_cut_number() Zhen Lei
2024-09-07 6:49 ` David Gow
2024-09-04 13:41 ` [PATCH 3/3] debugobjects: Use hlist_cut_number() to optimize performance and improve readability Zhen Lei
2024-09-09 18:41 ` Thomas Gleixner
2024-09-10 4:00 ` Leizhen (ThunderTown)
2024-09-10 11:44 ` Thomas Gleixner
2024-09-11 7:44 ` Leizhen (ThunderTown)
2024-09-11 8:54 ` Thomas Gleixner
2024-09-11 9:38 ` Leizhen (ThunderTown)
2024-10-07 12:22 ` Thomas Gleixner
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=20240904134152.2141-2-thunder.leizhen@huawei.com \
--to=thunder.leizhen@huawei.com \
--cc=akpm@linux-foundation.org \
--cc=davidgow@google.com \
--cc=kunit-dev@googlegroups.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=tglx@linutronix.de \
/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