From patchwork Fri Jul 10 19:51:33 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Berg X-Patchwork-Id: 29688 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@bilbo.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from ozlabs.org (ozlabs.org [203.10.76.45]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mx.ozlabs.org", Issuer "CA Cert Signing Authority" (verified OK)) by bilbo.ozlabs.org (Postfix) with ESMTPS id E274BB7082 for ; Sat, 11 Jul 2009 05:58:02 +1000 (EST) Received: by ozlabs.org (Postfix) id D5AB8DDE01; Sat, 11 Jul 2009 05:58:02 +1000 (EST) Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 6B1CBDDDFD for ; Sat, 11 Jul 2009 05:58:02 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757002AbZGJT5d (ORCPT ); Fri, 10 Jul 2009 15:57:33 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756966AbZGJT5c (ORCPT ); Fri, 10 Jul 2009 15:57:32 -0400 Received: from xc.sipsolutions.net ([83.246.72.84]:46292 "EHLO sipsolutions.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756937AbZGJT53 (ORCPT ); Fri, 10 Jul 2009 15:57:29 -0400 Received: by sipsolutions.net with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.69) (envelope-from ) id 1MPMDn-00011Q-DK; Fri, 10 Jul 2009 21:57:27 +0200 Message-Id: <20090710195536.341132270@sipsolutions.net> References: <20090710195131.504091075@sipsolutions.net> User-Agent: quilt/0.46-1 Date: Fri, 10 Jul 2009 21:51:33 +0200 From: Johannes Berg To: netdev@vger.kernel.org Cc: linux-wireless@vger.kernel.org, tgraf@suug.ch, "Eric W. Biederman" Subject: [PATCH 2/4] net: make namespace iteration possible under RCU Content-Disposition: inline; filename=028-netns-rcu.patch Mime-Version: 1.0 X-Mailer: Evolution 2.26.2 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org All we need to take care of is using proper RCU list add/del primitives and inserting a synchronize_rcu() at one place to make sure the exit notifiers are run after everybody has stopped iterating the list. Signed-off-by: Johannes Berg --- include/net/net_namespace.h | 3 +++ net/core/net_namespace.c | 14 +++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) --- wireless-testing.orig/include/net/net_namespace.h 2009-07-07 04:14:39.000000000 +0200 +++ wireless-testing/include/net/net_namespace.h 2009-07-07 12:17:17.000000000 +0200 @@ -211,6 +211,9 @@ static inline struct net *read_pnet(stru #define for_each_net(VAR) \ list_for_each_entry(VAR, &net_namespace_list, list) +#define for_each_net_rcu(VAR) \ + list_for_each_entry_rcu(VAR, &net_namespace_list, list) + #ifdef CONFIG_NET_NS #define __net_init #define __net_exit --- wireless-testing.orig/net/core/net_namespace.c 2009-07-07 03:43:35.000000000 +0200 +++ wireless-testing/net/core/net_namespace.c 2009-07-07 12:18:19.000000000 +0200 @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -127,7 +128,7 @@ static struct net *net_create(void) rv = setup_net(net); if (rv == 0) { rtnl_lock(); - list_add_tail(&net->list, &net_namespace_list); + list_add_tail_rcu(&net->list, &net_namespace_list); rtnl_unlock(); } mutex_unlock(&net_mutex); @@ -156,9 +157,16 @@ static void cleanup_net(struct work_stru /* Don't let anyone else find us. */ rtnl_lock(); - list_del(&net->list); + list_del_rcu(&net->list); rtnl_unlock(); + /* + * Another CPU might be rcu-iterating the list, wait for it. + * This needs to be before calling the exit() notifiers, so + * the rcu_barrier() below isn't sufficient alone. + */ + synchronize_rcu(); + /* Run all of the network namespace exit methods */ list_for_each_entry_reverse(ops, &pernet_list, list) { if (ops->exit) @@ -219,7 +227,7 @@ static int __init net_ns_init(void) panic("Could not setup the initial network namespace"); rtnl_lock(); - list_add_tail(&init_net.list, &net_namespace_list); + list_add_tail_rcu(&init_net.list, &net_namespace_list); rtnl_unlock(); mutex_unlock(&net_mutex);