On Sat, 2013-03-30 at 16:57 +0100, Jiri Pirko wrote: > No need to have two pointers in struct netdevice for rx_handler func and > priv data. Just embed rx_handler structure into driver port_priv and > have ->func pointer there. This introduces no performance penalty, > reduces struct netdevice by one pointer and reduces number of needed > rcu_dereference calls from 2 to 1. >
Thats not true. > Note this also fixes the race bug pointed out by Steven Rostedt and > fixed by patch "[PATCH] net: add a synchronize_net() in > netdev_rx_handler_unregister()" by Eric Dumazet. This is based on > current net-next tree where the patch is not applied yet. > I can rebase it on whatever tree/state, just say so. > > Smoke tested with all drivers who use rx_handler. > > Reported-by: Steven Rostedt <rost...@goodmis.org> > Signed-off-by: Jiri Pirko <j...@resnulli.us> > --- I see no value for this patch. It obfuscates things for no good reason. Once again rcu_dereference(dev->field) has no cost, its a memory read, like dev->field. I fear you don't understand enough RCU to make so invasive changes. Your patch adds a double dereference on fast path, and its more expensive than two single deref. dev->rx_handler actually gets the function pointer, and after your patch we would have to do dev->rx_handler->func instead, which is bad on many cpus. I'll send a patch reordering some fields of net_device, because as time passed, it seems a lot of junk broke work done in commit cd13539b8bc9ae884 (net: shrinks struct net_device) offsetof(struct net_device,dev_addr)=0x258 offsetof(struct net_device,rx_handler)=0x2b8 offsetof(struct net_device,ingress_queue)=0x2c8 offsetof(struct net_device,broadcast)=0x278 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev