On Mon, Mar 19, 2018 at 02:53:09PM +0300, Kirill Tkhai wrote: > Thanks for doing this. One small comment below. > > On 17.03.2018 14:08, Christian Brauner wrote: > > This commit adds struct uevent_sock to struct net. Since struct uevent_sock > > records the position of the uevent socket in the uevent socket list we can > > trivially remove it from the uevent socket list during cleanup. This speeds > > up the old removal codepath. > > Note, list_del() will hit __list_del_entry_valid() in its call chain which > > will validate that the element is a member of the list. If it isn't it will > > take care that the list is not modified. > > > > Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> > > --- > > Changelog v2->v3: > > * patch added > > This patch was split out of the follow up patch > > Subject: [PATCH 2/2 v3] netns: send uevent messages > > > > Changelog v1->v2: > > * patch not present > > > > Changelog v0->v1: > > * patch not present > > --- > > include/net/net_namespace.h | 4 +++- > > lib/kobject_uevent.c | 19 +++++++++---------- > > 2 files changed, 12 insertions(+), 11 deletions(-) > > > > diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h > > index f306b2aa15a4..abd7d91bffac 100644 > > --- a/include/net/net_namespace.h > > +++ b/include/net/net_namespace.h > > @@ -40,7 +40,7 @@ struct net_device; > > struct sock; > > struct ctl_table_header; > > struct net_generic; > > -struct sock; > > +struct uevent_sock; > > struct netns_ipvs; > > > > > > @@ -79,6 +79,8 @@ struct net { > > struct sock *rtnl; /* rtnetlink socket */ > > struct sock *genl_sock; > > > > + struct uevent_sock *uevent_sock; /* uevent socket */ > > + > > struct list_head dev_base_head; > > struct hlist_head *dev_name_head; > > struct hlist_head *dev_index_head; > > diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c > > index 9fe6ec8fda28..cbdc60542cab 100644 > > --- a/lib/kobject_uevent.c > > +++ b/lib/kobject_uevent.c > > @@ -32,11 +32,13 @@ u64 uevent_seqnum; > > #ifdef CONFIG_UEVENT_HELPER > > char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH; > > #endif > > -#ifdef CONFIG_NET > > + > > struct uevent_sock { > > struct list_head list; > > struct sock *sk; > > }; > > + > > +#ifdef CONFIG_NET > > static LIST_HEAD(uevent_sock_list); > > #endif > > > > @@ -621,6 +623,9 @@ static int uevent_net_init(struct net *net) > > kfree(ue_sk); > > return -ENODEV; > > } > > + > > + net->uevent_sock = ue_sk; > > + > > mutex_lock(&uevent_sock_mutex); > > list_add_tail(&ue_sk->list, &uevent_sock_list); > > mutex_unlock(&uevent_sock_mutex); > > @@ -629,22 +634,16 @@ static int uevent_net_init(struct net *net) > > > > static void uevent_net_exit(struct net *net) > > { > > - struct uevent_sock *ue_sk; > > + struct uevent_sock *ue_sk = net->uevent_sock; > > > > mutex_lock(&uevent_sock_mutex); > > - list_for_each_entry(ue_sk, &uevent_sock_list, list) { > > - if (sock_net(ue_sk->sk) == net) > > - goto found; > > - } > > - mutex_unlock(&uevent_sock_mutex); > > - return; > > - > > -found: > > list_del(&ue_sk->list); > > mutex_unlock(&uevent_sock_mutex); > > > > netlink_kernel_release(ue_sk->sk); > > kfree(ue_sk); > > + > > + return; > > There is end of function. Doesn't return is excess here?
Yeah, I can remove it and resend it now. Christian > > > } > > > > static struct pernet_operations uevent_net_ops = { > > > > Kirill