From: Michel Lespinasse <walken@google.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: riel@redhat.com, daniel.santos@pobox.com, aarcange@redhat.com,
dwmw2@infradead.org, akpm@linux-foundation.org,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
torvalds@linux-foundation.org
Subject: Re: [PATCH v2 8/9] rbtree: faster augmented rbtree manipulation
Date: Mon, 6 Aug 2012 14:55:45 -0700 [thread overview]
Message-ID: <CANN689HKPKeZ-sqqwXGPhv=Jno4c=v=ffeOxLPkOFmMzEVXexw@mail.gmail.com> (raw)
In-Reply-To: <1344267537.27828.93.camel@twins>
On Mon, Aug 6, 2012 at 8:38 AM, Peter Zijlstra <peterz@infradead.org> wrote:
> On Mon, 2012-08-06 at 16:17 +0200, Peter Zijlstra wrote:
>
>> Why would every user need to replicate the propagate and rotate
>> boilerplate?
>
> So I don't have a tree near that any of this applies to (hence no actual
> patch)
All right, here are instructions to get a tree this will apply to :)
1- fetch linux-next tree
2- check out next-20120806
3- revert e406c4110c968b7691c4ccfadcd866a74a72fa5b (was sent as
previous RFC version of this series, didn't realize it had made it
into -mm)
4- apply patches 1 and 3-9 of this series (patch 2 was also sent as
previous RFC version and made it into -mm)
> but why can't we have something like:
>
> struct rb_augment_callback {
> const bool (*update)(struct rb_node *node);
> const int offset;
> const int size;
> };
>
> #define RB_AUGMENT_CALLBACK(_update, _type, _rb_member, _aug_member) \
> (struct rb_augment_callback){ \
> .update = _update, \
> .offset = offsetof(_type, _aug_member) - \
> offsetof(_type, _rb_member), \
> .size = sizeof(((_type *)NULL)->_aug_member), \
> }
>
> static __always_inline void
> augment_copy(struct rb_node *dst, struct rb_node *src,
> const rb_augment_callback *ac)
> {
> memcpy((void *)dst + ac->offset,
> (void *)src + ac->offset,
> ac->size);
> }
>
> static __always_inline void
> augment_propagate(struct rb_node *rb, struct rb_node *stop,
> const struct rb_augment_callback *ac)
> {
> while (rb != stop) {
> if (!ac->update(rb))
> break;
> rb = rb_parent(rb);
> }
> }
>
> static __always_inline void
> augment_rotate(struct rb_node *old, struct rb_node *new.
> const struct rb_augment_callback *ac)
> {
> augment_copy(new, old, ac);
> (void)ac->update(old);
> }
I don't think this would work well, because ac->offset and ac->size
wouldn't be known at the point where they are needed, so the memcpy
wouldn't be nicely optimized into a fetch and store of the desired
size.
However, I wouldn't have a problem with declaring all 3 callbacks (and
the struct holding them) using a preprocessor macro as you propose.
Would that seem fine with you ? I can send an add-on patch to do that.
--
Michel "Walken" Lespinasse
A program is never fully debugged until the last user dies.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-08-06 21:55 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-02 22:34 [PATCH v2 0/9] faster augmented rbtree interface Michel Lespinasse
2012-08-02 22:34 ` [PATCH v2 1/9] rbtree test: fix sparse warning about 64-bit constant Michel Lespinasse
2012-08-05 20:47 ` Rik van Riel
2012-08-02 22:34 ` [PATCH v2 2/9] rbtree: optimize fetching of sibling node Michel Lespinasse
2012-08-05 23:20 ` Rik van Riel
2012-08-06 14:23 ` Peter Zijlstra
2012-08-06 20:46 ` Michel Lespinasse
2012-08-02 22:34 ` [PATCH v2 3/9] rbtree: add __rb_change_child() helper function Michel Lespinasse
2012-08-06 1:00 ` Rik van Riel
2012-08-06 14:22 ` Peter Zijlstra
2012-08-07 0:04 ` Michel Lespinasse
2012-08-02 22:34 ` [PATCH v2 4/9] rbtree: place easiest case first in rb_erase() Michel Lespinasse
2012-08-06 1:13 ` Rik van Riel
2012-08-02 22:34 ` [PATCH v2 5/9] rbtree: handle 1-child recoloring in rb_erase() instead of rb_erase_color() Michel Lespinasse
2012-08-06 1:27 ` Rik van Riel
2012-08-02 22:34 ` [PATCH v2 6/9] rbtree: low level optimizations in rb_erase() Michel Lespinasse
2012-08-06 1:41 ` Rik van Riel
2012-08-06 14:21 ` Peter Zijlstra
2012-08-06 20:50 ` Michel Lespinasse
2012-08-06 20:58 ` Peter Zijlstra
2012-08-06 21:20 ` Michel Lespinasse
2012-08-06 21:21 ` Michel Lespinasse
2012-08-02 22:34 ` [PATCH v2 7/9] rbtree: augmented rbtree test Michel Lespinasse
2012-08-06 2:11 ` Rik van Riel
2012-08-02 22:34 ` [PATCH v2 8/9] rbtree: faster augmented rbtree manipulation Michel Lespinasse
2012-08-06 2:12 ` Rik van Riel
2012-08-06 14:17 ` Peter Zijlstra
2012-08-06 15:38 ` Peter Zijlstra
2012-08-06 21:55 ` Michel Lespinasse [this message]
2012-08-07 7:12 ` [PATCH] rbtree: add RB_DECLARE_CALLBACKS() macro Michel Lespinasse
2012-08-06 14:25 ` [PATCH v2 8/9] rbtree: faster augmented rbtree manipulation Peter Zijlstra
2012-08-06 21:34 ` Michel Lespinasse
2012-08-06 21:36 ` Peter Zijlstra
2012-08-06 14:29 ` Peter Zijlstra
2012-08-06 21:38 ` Michel Lespinasse
2012-08-02 22:34 ` [PATCH v2 9/9] rbtree: remove prior augmented rbtree implementation Michel Lespinasse
2012-08-02 22:41 ` Joe Perches
2012-08-06 2:13 ` Rik van Riel
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='CANN689HKPKeZ-sqqwXGPhv=Jno4c=v=ffeOxLPkOFmMzEVXexw@mail.gmail.com' \
--to=walken@google.com \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=daniel.santos@pobox.com \
--cc=dwmw2@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=peterz@infradead.org \
--cc=riel@redhat.com \
--cc=torvalds@linux-foundation.org \
/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