On Mon, Mar 07, 2016 at 04:28:26PM -0800, Cong Wang wrote: > On Mon, Mar 7, 2016 at 4:26 PM, Cong Wang <xiyou.wangc...@gmail.com> wrote: > > On Fri, Mar 4, 2016 at 2:59 AM, Michal Kubecek <mkube...@suse.cz> wrote: > >> static void ipv6_route_seq_setup_walk(struct ipv6_route_iter *iter) > >> { > >> +#ifdef CONFIG_NET_NS > >> + struct net *net = iter->p.net; > >> +#else > >> + struct net *net = &init_net; > >> +#endif > >> + > > > > You should pass the struct net pointer to ipv6_route_seq_setup_walk() > > instead of reading it by yourself.
I considered this. While it probably wouldn't bring any extra overhead as the function is going to be inlined anyway, it didn't look really nice. I gues I'll use read_pnet() as David suggested; I just didn't realize the reason it's a macro in !CONFIG_NET_NS case is to allow passing a pointer to non-existent struct member. > > I don't find anyone actually using iter->p, it probably can be just removed. > > Er, seq_file_net() uses it... but callers already call it. Not only seq_file_net(). The whole infrastructure assumes private data start with an instance of struct seq_net_private and seq_open_net() initializes it. Michal Kubecek