On Wed, Jul 10, 2013 at 3:52 PM, Jesse Gross <je...@nicira.com> wrote: > On Mon, Jul 1, 2013 at 3:28 PM, Pravin B Shelar <pshe...@nicira.com> wrote: >> diff --git a/datapath/linux/compat/net_namespace.c >> b/datapath/linux/compat/net_namespace.c >> index 4e8a891..39b4a28 100644 >> --- a/datapath/linux/compat/net_namespace.c >> +++ b/datapath/linux/compat/net_namespace.c >> int rpl_register_pernet_##PNET_TYPE(struct rpl_pernet_operations *rpl_pnet) >> \ >> { >> \ >> pnet_##PNET_TYPE = rpl_pnet; >> \ >> - return register_pernet_##PNET_TYPE(pnet_##PNET_TYPE->id, >> &pnet_compat_##PNET_TYPE); \ >> + rpl_pnet->ops = pnet_compat_##PNET_TYPE; >> \ >> + return register_pernet_##PNET_TYPE(pnet_##PNET_TYPE->id, >> &rpl_pnet->ops); \ >> } > > I think this works for initializing the device for existing namespaces > but if a new namespace is brought up then it will have problems. In > that case, it will call the registration function for the last device > repeatedly. > right.
> We could avoid this issue if we just used contain_of instead of a set > of global variables to recover the original ops. That might also allow > us to significantly reduce the amount of token pasting, which would > also make this easier to read. I am not sure what are you suggesting. problem is compat-per-net-init function has net as parameter and it need id to get private net obj. but there is no way to get net_id/net-obj for this compat function without global pointer, but that does not work as you explained. I can think of some more macro tricks to hide this compat code, that will involve moving this code to header and using file-name (and may be line no) to build specific compat functions rather than sharing same functions for multiple net-ops. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev