From: Peter Zijlstra <peterz@infradead.org>
To: Kent Overstreet <kent.overstreet@linux.dev>
Cc: Kuan-Wei Chiu <visitorckw@gmail.com>,
colyli@suse.de, msakai@redhat.com, corbet@lwn.net,
mingo@redhat.com, acme@kernel.org, namhyung@kernel.org,
akpm@linux-foundation.org, mark.rutland@arm.com,
alexander.shishkin@linux.intel.com, jolsa@kernel.org,
irogers@google.com, adrian.hunter@intel.com,
kan.liang@linux.intel.com, jserv@ccns.ncku.edu.tw,
linux-kernel@vger.kernel.org, linux-bcache@vger.kernel.org,
dm-devel@lists.linux.dev, linux-bcachefs@vger.kernel.org,
linux-perf-users@vger.kernel.org, linux-doc@vger.kernel.org
Subject: Re: [PATCH 1/3] lib/min_heap: Introduce non-inline versions of min heap API functions
Date: Thu, 17 Oct 2024 11:55:20 +0200 [thread overview]
Message-ID: <20241017095520.GV16066@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <xb2gihmastm3wjn2o2sufvtglvjkelhiiwhnlzoiz4qncywyga@txf4vvnyxhvu>
On Wed, Oct 16, 2024 at 11:26:30PM -0400, Kent Overstreet wrote:
> yeah, I think we would prefer smaller codesize, by default.
>
> it'd be well worth checking the code size difference on inlined vs. not,
> and then the really think to do would be to provide optional _inlined()
> helpers that we can switch to if/when a particular codepath shows up in
> a profile
Make sure to build with kCFI and IBT enabled when you do this and enjoy
seeing ec_stripes_heap_cmp turn into this:
00000000000027c0 <__cfi_ec_stripes_heap_cmp>:
27c0: b8 01 88 88 07 mov $0x7888801,%eax
27c5: 90 nop
27c6: 90 nop
27c7: 90 nop
27c8: 90 nop
27c9: 90 nop
27ca: 90 nop
27cb: 90 nop
27cc: 90 nop
27cd: 90 nop
27ce: 90 nop
27cf: 90 nop
00000000000027d0 <ec_stripes_heap_cmp>:
27d0: f3 0f 1e fa endbr64
27d4: e8 00 00 00 00 call 27d9 <ec_stripes_heap_cmp+0x9> 27d5: R_X86_64_PLT32 __fentry__-0x4
27d9: 8b 47 08 mov 0x8(%rdi),%eax
27dc: 3b 46 08 cmp 0x8(%rsi),%eax
27df: 0f 92 c0 setb %al
27e2: 2e e9 00 00 00 00 cs jmp 27e8 <ec_stripes_heap_cmp+0x18> 27e4: R_X86_64_PLT32 __x86_return_thunk-0x4
27e8: 0f 1f 84 00 00 00 00 00 nopl 0x0(%rax,%rax,1)
27f0: 90 nop
27f1: 90 nop
27f2: 90 nop
27f3: 90 nop
27f4: 90 nop
While I was there, you might want to do the below. It makes no sense
duplicating that thing.
---
diff --git a/fs/bcachefs/ec.c b/fs/bcachefs/ec.c
index 1587c6e1866a..3a6c34cf8a15 100644
--- a/fs/bcachefs/ec.c
+++ b/fs/bcachefs/ec.c
@@ -1048,6 +1048,11 @@ static inline void ec_stripes_heap_swap(void *l, void *r, void *h)
ec_stripes_heap_set_backpointer(_h, j);
}
+static const struct min_heap_callbacks ec_stripes_callbacks = {
+ .less = ec_stripes_heap_cmp,
+ .swp = ec_stripes_heap_swap,
+};
+
static void heap_verify_backpointer(struct bch_fs *c, size_t idx)
{
ec_stripes_heap *h = &c->ec_stripes_heap;
@@ -1060,26 +1065,16 @@ static void heap_verify_backpointer(struct bch_fs *c, size_t idx)
void bch2_stripes_heap_del(struct bch_fs *c,
struct stripe *m, size_t idx)
{
- const struct min_heap_callbacks callbacks = {
- .less = ec_stripes_heap_cmp,
- .swp = ec_stripes_heap_swap,
- };
-
mutex_lock(&c->ec_stripes_heap_lock);
heap_verify_backpointer(c, idx);
- min_heap_del(&c->ec_stripes_heap, m->heap_idx, &callbacks, &c->ec_stripes_heap);
+ min_heap_del(&c->ec_stripes_heap, m->heap_idx, &ec_strips_callbacks, &c->ec_stripes_heap);
mutex_unlock(&c->ec_stripes_heap_lock);
}
void bch2_stripes_heap_insert(struct bch_fs *c,
struct stripe *m, size_t idx)
{
- const struct min_heap_callbacks callbacks = {
- .less = ec_stripes_heap_cmp,
- .swp = ec_stripes_heap_swap,
- };
-
mutex_lock(&c->ec_stripes_heap_lock);
BUG_ON(min_heap_full(&c->ec_stripes_heap));
@@ -1088,7 +1083,7 @@ void bch2_stripes_heap_insert(struct bch_fs *c,
.idx = idx,
.blocks_nonempty = m->blocks_nonempty,
}),
- &callbacks,
+ &ec_stripes_callbacks,
&c->ec_stripes_heap);
heap_verify_backpointer(c, idx);
@@ -1098,10 +1093,6 @@ void bch2_stripes_heap_insert(struct bch_fs *c,
void bch2_stripes_heap_update(struct bch_fs *c,
struct stripe *m, size_t idx)
{
- const struct min_heap_callbacks callbacks = {
- .less = ec_stripes_heap_cmp,
- .swp = ec_stripes_heap_swap,
- };
ec_stripes_heap *h = &c->ec_stripes_heap;
bool do_deletes;
size_t i;
@@ -1112,8 +1103,8 @@ void bch2_stripes_heap_update(struct bch_fs *c,
h->data[m->heap_idx].blocks_nonempty = m->blocks_nonempty;
i = m->heap_idx;
- min_heap_sift_up(h, i, &callbacks, &c->ec_stripes_heap);
- min_heap_sift_down(h, i, &callbacks, &c->ec_stripes_heap);
+ min_heap_sift_up( h, i, &ec_stripes_callbacks, &c->ec_stripes_heap);
+ min_heap_sift_down(h, i, &ec_stripes_callbacks, &c->ec_stripes_heap);
heap_verify_backpointer(c, idx);
next prev parent reply other threads:[~2024-10-17 9:55 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-13 18:47 [PATCH 0/3] Enhance min heap API with non-inline functions and optimizations Kuan-Wei Chiu
2024-10-13 18:47 ` [PATCH 1/3] lib/min_heap: Introduce non-inline versions of min heap API functions Kuan-Wei Chiu
2024-10-14 8:13 ` Peter Zijlstra
2024-10-14 8:20 ` Peter Zijlstra
2024-10-14 9:41 ` Kuan-Wei Chiu
2024-10-17 3:26 ` Kent Overstreet
2024-10-17 9:55 ` Peter Zijlstra [this message]
2024-10-17 10:46 ` Kent Overstreet
2024-10-20 5:15 ` Kuan-Wei Chiu
2024-10-13 18:47 ` [PATCH 2/3] lib min_heap: Optimize min heap by prescaling counters for better performance Kuan-Wei Chiu
2024-10-13 18:47 ` [PATCH 3/3] Documentation/core-api: Add min heap API introduction Kuan-Wei Chiu
2024-10-14 8:55 ` Matthew Wilcox
2024-10-14 10:04 ` Kuan-Wei Chiu
2024-10-13 23:05 ` [PATCH 0/3] Enhance min heap API with non-inline functions and optimizations Kent Overstreet
2024-10-13 23:27 ` Kuan-Wei Chiu
2024-10-14 2:08 ` Kent Overstreet
2024-10-14 1:18 ` Coly Li
2024-10-14 1:23 ` Kent Overstreet
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=20241017095520.GV16066@noisy.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=akpm@linux-foundation.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=colyli@suse.de \
--cc=corbet@lwn.net \
--cc=dm-devel@lists.linux.dev \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=jserv@ccns.ncku.edu.tw \
--cc=kan.liang@linux.intel.com \
--cc=kent.overstreet@linux.dev \
--cc=linux-bcache@vger.kernel.org \
--cc=linux-bcachefs@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=msakai@redhat.com \
--cc=namhyung@kernel.org \
--cc=visitorckw@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.