All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cody P Schafer <cody@linux.vnet.ibm.com>
To: Michel Lespinasse <walken@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	EXT4 <linux-ext4@vger.kernel.org>, Jan Kara <jack@suse.cz>,
	rostedt@goodmis.org, Seth Jennings <sjenning@linux.vnet.ibm.com>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 01/11] rbtree: Fix rbtree_postorder_for_each_entry_safe() iterator
Date: Thu, 07 Nov 2013 10:59:27 -0800	[thread overview]
Message-ID: <527BE30F.7090108@linux.vnet.ibm.com> (raw)
In-Reply-To: <CANN689EhajVC4cq_oz2zaxOmMyYBZvGrKVsYYwkGH_C9jPGKag@mail.gmail.com>

On 11/07/2013 03:51 AM, Michel Lespinasse wrote:
> On Wed, Nov 6, 2013 at 5:42 PM, Cody P Schafer <cody@linux.vnet.ibm.com> wrote:
>> From: Jan Kara <jack@suse.cz>

[...]
>>
>> +#define rb_entry_safe(ptr, type, member) \
>> +       ({ typeof(ptr) ____ptr = (ptr); \
>> +          ____ptr ? rb_entry(____ptr, type, member) : NULL; \
>> +       })
>> +
>>   /**
>>    * rbtree_postorder_for_each_entry_safe - iterate over rb_root in post order of
>>    * given type safe against removal of rb_node entry
>> @@ -95,12 +100,9 @@ static inline void rb_link_node(struct rb_node * node, struct rb_node * parent,
>>    * @field:     the name of the rb_node field within 'type'.
>>    */
>>   #define rbtree_postorder_for_each_entry_safe(pos, n, root, field) \

[...]
>> +       for (pos = rb_entry_safe(rb_first_postorder(root), typeof(*pos), field); \
>> +            pos && ({ n = rb_entry_safe(rb_next_postorder(&pos->field), \
>> +                       typeof(*pos), field); 1; }); \
>> +            pos = n)

>
> Well, this really isn't pretty, and I'm not sure that
> rbtree_postorder_for_each_entry_safe() is a good idea in the first
> place. Note that we have never had or needed such a macro for the
> common case of in-order iteration; why would we need it for the
> less-common case of postorder iteration ?

Well, maybe we should add a helper for in-order iteration if it 
simplifies the code's appearance significantly. I added this one because 
I think it's highly probable that users of the postorer iteration will 
always want the *_entry_safe() style for_each, meaning I don't have to 
add the other (non-safe, non-entry) variants.

> I think it's just as well to have clients write something like
> struct rb_node *rb_node = rb_first_postorder(root);
> while (rb_node) {
>      struct rb_node *rb_next_node = rb_next_postorder(rb_node);
>      struct mystruct *node = rb_entry(rb_node, struct mystruct,
> mystruct_rb_field);
>      .... do whatever, possibly destroying node ...
>      rb_node = rb_next_node;
> }
>

So, 4 extra lines per usage, an extra variable, and the need to split 
the iteration's logic across the action performed.

> That said, there is some precedent for this kind of API in
> hlist_for_each_entry_safe, so I guess that's acceptable if there will
> be enough users of this macro - but it seems very strange to me that
> we would need it for the postorder traversal while we don't for the
> in-order traversal. I would prefer keeping rbtree.h minimal if that is
> possible.
>

The other patches in this patchset add 16 usages of the for_each macro, 
and these are only conversions of the simple cases I found by grepping 
the kernel for rb_erase() and rb_(left|right) = NULL patterns. I others 
have found other ways to do the same (or similar) things that I haven't 
noticed.


  reply	other threads:[~2013-11-07 18:59 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-07  1:42 [PATCH v2 00/11] rbtree: postorder iteration: fix, add tests, and use in various places Cody P Schafer
2013-11-07  1:42 ` [PATCH v2 01/11] rbtree: Fix rbtree_postorder_for_each_entry_safe() iterator Cody P Schafer
2013-11-07 11:51   ` Michel Lespinasse
2013-11-07 18:59     ` Cody P Schafer [this message]
2013-11-07 21:38   ` Andrew Morton
2013-11-07 21:58     ` Cody P Schafer
2013-11-07 22:14     ` Jan Kara
2013-11-07  1:42 ` [PATCH v2 02/11] rbtree/test: move rb_node to the middle of the test struct Cody P Schafer
2013-11-07 11:52   ` Michel Lespinasse
2013-11-07  1:42 ` [PATCH v2 03/11] rbtree/test: test rbtree_postorder_for_each_entry_safe() Cody P Schafer
2013-11-07 11:54   ` Michel Lespinasse
2013-11-07  1:42 ` [PATCH v2 04/11] net ipset: use rbtree postorder iteration instead of opencoding Cody P Schafer
2013-11-07  1:42 ` [PATCH v2 05/11] trace/trace_stat: use rbtree postorder iteration helper " Cody P Schafer
2013-11-07  1:42 ` [PATCH v2 06/11] fs/ubifs: " Cody P Schafer
2013-11-07  1:42   ` Cody P Schafer
2013-11-07  1:42   ` Cody P Schafer
2013-11-07  1:42 ` [PATCH v2 07/11] fs/ext4: " Cody P Schafer
2013-11-07  9:28   ` Jan Kara
2013-11-07  1:42 ` [PATCH v2 08/11] fs/jffs2: " Cody P Schafer
2013-11-07  1:42   ` Cody P Schafer
2013-11-07  1:42   ` Cody P Schafer
2013-11-07  1:42 ` [PATCH v2 09/11] fs/ext3: " Cody P Schafer
2013-11-07  8:17   ` Jan Kara
2013-11-07  1:42 ` [PATCH v2 10/11] mtd/ubi: " Cody P Schafer
2013-11-07  1:42   ` Cody P Schafer
2013-11-07  1:42   ` Cody P Schafer
2013-11-07  1:42 ` [PATCH v2 11/11] sh/dwarf: use rbtree postorder iteration helper instead of solution using repeated rb_erase() Cody P Schafer
2013-11-07  1:42   ` [PATCH v2 11/11] sh/dwarf: use rbtree postorder iteration helper instead of solution using repeated Cody P Schafer

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=527BE30F.7090108@linux.vnet.ibm.com \
    --to=cody@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=jack@suse.cz \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=sjenning@linux.vnet.ibm.com \
    --cc=walken@google.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.