On 10/04, Linus Torvalds wrote: > > On Fri, Oct 4, 2013 at 11:46 AM, Oleg Nesterov <o...@redhat.com> wrote: > > Add the new struct rcu_sync_ops which holds sync/call methods, and > > turn the function pointers in rcu_sync_struct into the single pointer > > to struct rcu_sync_ops. > > > > +struct rcu_sync_ops { > > + void (*sync)(void); > > + void (*call)(struct rcu_head *, void (*)(struct rcu_head *)); > > +}; > > + > > struct rcu_sync_struct { > > int gp_state; > > int gp_count; > > @@ -12,43 +17,9 @@ struct rcu_sync_struct { > > int cb_state; > > struct rcu_head cb_head; > > > > - void (*sync)(void); > > - void (*call)(struct rcu_head *, void (*)(struct rcu_head *)); > > + struct rcu_sync_ops *ops; > > Ugh. > > This interface pretty much guarantees that a compiler can never do > anything clever, like know that "hey, you used a static initializer on > this thing, and the fields are const, so now know statically what the > functions are, and I can just turn the indirect jumps into direct > jumps".
But we do not care? rcu_sync_struct->ops is only used by the writer (slow path). In this case the simpler the better, I think. > - instead, use a "static const" type descriptor for each type (it > approaches being your "rcu_sync_ops" structure). Pass this in as an > argument to all the functions (use a #define per type or something, so > that users don't need to do this by hand) > > - now every single user passes in that type descriptor. > > - together with using a few inline functions, suddenly the "indirect" > jumps through this type descriptor end up actually being nice direct > compile-time constants: iow, they get turned into direct jumps. Hmm. Can't understand, sorry... Could you spell?? I assume you do not suggest to pass the "type" to, say, rcu_sync_enter? Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/