From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8DB4F2E7F17 for ; Sat, 28 Feb 2026 22:18:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772317101; cv=none; b=GSK/4BPF0D/70mihTR1inYgLafqMkBwH13XTArAbEzY+wyUg83WiEeUlglTN41idn7Y70PRdQgPMgUifPDgPWDrmTh5f6czxZl222M7iTeDiTIzdCf+wJZUpiAvDEjC2dpbhxuhpe2Jk65f3hIoSGM3JQ9+ayg6hGgDVptc3QzY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772317101; c=relaxed/simple; bh=KTFQ5hmwt4WxkuXItlD6TLl3N70u4v4ZO4TwWHxP8Ic=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=quBiMpacMH5oaDTwIjNJKNSp/ZXJ5b39LO98vYcAJ3Z9obK5/lUyv7DTkyE2YP3H8fdXPvs8oSLzn9uphM0w3G8ruDd/tHZ3bjO7fjuZgI7VkwPkVgP42a8bPVH+UCxi6Ivwa24tvHm7GgJZg4j2pEn+sjtK8KzJ0eOghIAZlIU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--kuniyu.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=AZTdfSbc; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--kuniyu.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="AZTdfSbc" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2adca7aba8bso27823775ad.0 for ; Sat, 28 Feb 2026 14:18:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1772317100; x=1772921900; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=4s4PId7mKY8txbYNQwLSXzK+BOYe30vIyNZf8VDMLyE=; b=AZTdfSbcYWu+iZt3LxqVlD7P84Pijx51dphkL4ogBtOUO/S3FT2e9/7ptsU3wWyazd Y1TOW1PiLy6vod/c7hHLUmAeUGJHrNphHovOkWR+a/9fs6vtNnPAiJ9sgfIBtHsMct6u JmdrEKXI8VL2MZ51MAf3iKJnQgQ1qCNVyO9hYYxRaVIxgi+EyTuvzMrDdK6JeIBFjhJW i5WROGzMGcJtz/qriACwhWi0bETItBfugmMIl0iNhmNRR/eCaCqvMroJ4RetlA78y4hi XQkqIFYlxMmhL652BILUPdm8QyOGolddwcaipYKiSMiNOX3GHOdsFDIKycinfaVyChRK d/8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772317100; x=1772921900; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4s4PId7mKY8txbYNQwLSXzK+BOYe30vIyNZf8VDMLyE=; b=mFb467foLNRmF4TGfF43/pGRZphiK2H6OFQ/mfIh2Zkb+bl7TH+6LoQ0GFLNeTu5PR jXSRZw1mAiAmTGh/yJLSKdgH4Yh2r6rNH/YoPwoUMEi85vYz7gI78OVghJ7lGqpERU+v 15gC+is5NuRnhZ9Bf5OPT1MmQ6p2cr6UrD9nk2LefMWmXzZZNpQ78Qg0XzUC+aouHxP/ QBiflc802Tj9prFqozovIdBo0jiGKmz8dqcgEpw2ap9XK0h+T6t0THoX7Mw4VtBABUra y0iQobefBQKazHCkBCYxE7plhEfeQyCoOqgh6VPsHhBbmD7OoozZGraKI0XBYKUPl1Cr VgCg== X-Forwarded-Encrypted: i=1; AJvYcCWYktQX79W33szSBhjNzSJ6tJEmbzG/Kr5Lw31Orud4dZC6I+VGI4hoZRTWzrH4MJWNh9VuP7I=@vger.kernel.org X-Gm-Message-State: AOJu0YyARex6QtnR2NvQnOeMkawepDkQH7FsuWNHHbqwW7UQ5A3GCiWJ g8lxtGZut55fnEJ7m7Lti2Wcz2Ax2du7WcfY0dWbictJl3wRw0XCPTnUFdd8mUBtc3n7150ob0U +GZNeww== X-Received: from plbky15.prod.google.com ([2002:a17:902:f98f:b0:2a9:48e5:ca1b]) (user=kuniyu job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:41cb:b0:2ad:9421:613c with SMTP id d9443c01a7336-2ae2e400d0fmr59345975ad.21.1772317099730; Sat, 28 Feb 2026 14:18:19 -0800 (PST) Date: Sat, 28 Feb 2026 22:17:28 +0000 In-Reply-To: <20260228221800.1082070-1-kuniyu@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260228221800.1082070-1-kuniyu@google.com> X-Mailer: git-send-email 2.53.0.473.g4a7958ca14-goog Message-ID: <20260228221800.1082070-11-kuniyu@google.com> Subject: [PATCH v3 net-next 10/15] ipmr: Remove RTNL in ipmr_rules_init() and ipmr_net_init(). From: Kuniyuki Iwashima To: "David S . Miller" , David Ahern , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Simon Horman , Kuniyuki Iwashima , Kuniyuki Iwashima , netdev@vger.kernel.org Content-Type: text/plain; charset="UTF-8" When ipmr_free_table() is called from ipmr_rules_init() or ipmr_net_init(), the netns is not yet published. Thus, no device should have been registered, and mroute_clean_tables() will not call vif_delete(), so unregister_netdevice_many() is unnecessary. unregister_netdevice_many() does nothing if the list is empty, but it requires RTNL due to the unconditional ASSERT_RTNL() at the entry of unregister_netdevice_many_notify(). Let's remove unnecessary RTNL and ASSERT_RTNL() and instead add WARN_ON_ONCE() in ipmr_free_table(). Note that we use a local list for the new WARN_ON_ONCE() because dev_kill_list passed from ipmr_rules_exit_rtnl() may have some devices when other ops->init() fails after ipmr durnig setup_net(). Signed-off-by: Kuniyuki Iwashima Reviewed-by: Eric Dumazet --- v2: Use a local list in ipmr_free_table() --- net/ipv4/ipmr.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 72761c8b2930..c22bcaead348 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c @@ -276,10 +276,7 @@ static int __net_init ipmr_rules_init(struct net *net) return 0; err2: - rtnl_lock(); ipmr_free_table(mrt, &dev_kill_list); - unregister_netdevice_many(&dev_kill_list); - rtnl_unlock(); err1: fib_rules_unregister(ops); return err; @@ -290,7 +287,6 @@ static void __net_exit ipmr_rules_exit_rtnl(struct net *net, { struct mr_table *mrt, *next; - ASSERT_RTNL(); list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) { list_del(&mrt->list); ipmr_free_table(mrt, dev_kill_list); @@ -355,8 +351,6 @@ static int __net_init ipmr_rules_init(struct net *net) static void __net_exit ipmr_rules_exit_rtnl(struct net *net, struct list_head *dev_kill_list) { - ASSERT_RTNL(); - ipmr_free_table(net->ipv4.mrt, dev_kill_list); net->ipv4.mrt = NULL; @@ -436,15 +430,19 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id) static void ipmr_free_table(struct mr_table *mrt, struct list_head *dev_kill_list) { struct net *net = read_pnet(&mrt->net); + LIST_HEAD(ipmr_dev_kill_list); WARN_ON_ONCE(!mr_can_free_table(net)); timer_shutdown_sync(&mrt->ipmr_expire_timer); mroute_clean_tables(mrt, MRT_FLUSH_VIFS | MRT_FLUSH_VIFS_STATIC | MRT_FLUSH_MFC | MRT_FLUSH_MFC_STATIC, - dev_kill_list); + &ipmr_dev_kill_list); rhltable_destroy(&mrt->mfc_hash); kfree(mrt); + + WARN_ON_ONCE(!net_initialized(net) && !list_empty(&ipmr_dev_kill_list)); + list_splice(&ipmr_dev_kill_list, dev_kill_list); } /* Service routines creating virtual interfaces: DVMRP tunnels and PIMREG */ @@ -3287,10 +3285,7 @@ static int __net_init ipmr_net_init(struct net *net) proc_cache_fail: remove_proc_entry("ip_mr_vif", net->proc_net); proc_vif_fail: - rtnl_lock(); ipmr_rules_exit_rtnl(net, &dev_kill_list); - unregister_netdevice_many(&dev_kill_list); - rtnl_unlock(); #endif ipmr_rules_fail: ipmr_notifier_exit(net); -- 2.53.0.473.g4a7958ca14-goog