From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (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 845463AE1B9 for ; Tue, 5 May 2026 17:44:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778003062; cv=none; b=g7NP8qWgTwv0+lg4InT8KbxUxbFGzd1MR+qp4r3xv/dKMn38+IvCVPxB7AL1hFWYSOTCniuTQoXF3gzmE1APSShHXGQ5itMfauCvjucNx6Ez1L8yVnfs7rbMJNWv06aOkab4KKsTVq915eDG+DZ5BtcY08OZV59b9Q89ASqQJDU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778003062; c=relaxed/simple; bh=y20cL5iZCiSFVhg8JJj9aG7733O1XsqG83retGM8OPE=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=KePTv05PzvTX9HBYhXK1K7Z5tmj+DqTvWxHTXOH4SmLxClBeCR5xyoEqo0nyOL/2nLO5zGHpeZcoPY23gcehIFFCs0/s/pu8e+ZVlF7ZFE1bXHbqxfii4SROSm0yT9Xg9mOooDXjQ4SpLP5IKn26/Y93dRhq/wsugU2+XuXz/P8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nROiCBya; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nROiCBya" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-4838c15e3cbso45100215e9.3 for ; Tue, 05 May 2026 10:44:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778003059; x=1778607859; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=VRVr8PiIFgnWbCMbwvqDK2cmVgiWGr+wh06H9kngd8w=; b=nROiCByawUbugqZAFMuSjqSLnmfgNq7GxPRgckX9lISKbhx7by3extcgQ5oaO1IxKT 4H+66iu+cQfoM3mmqOIM0rzxh7NMxcYLacWbJ2rTfyszTm9/CXujymDVJXFVT/i8C1Rv gtMWxPJ3i/EaJkA8xJpyXNDpyTz98wAgglBJBPEimSatr1oS8yiU30S5pAo24judo0y+ 169dHJgoD4K/4MMY25yUIuQuHraFN+uSxRqN5VWl6wv6B7dbb6I34X94rU9lu0M6nXOq pFp6J4B1i/NQN+CqvQw8fnsG671m80ZEr+vOx5+yBRXaVSFy/8MTsMxwWhPldYwxiuwJ YHfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778003059; x=1778607859; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=VRVr8PiIFgnWbCMbwvqDK2cmVgiWGr+wh06H9kngd8w=; b=XwiRXMdfNULKFXzH4Cuo0F3Fs2B6hlj0l5qIEBq0GRWBztIbJuexz90D+4x2vgGczs dLp1Pvd2EUYzRFUYIBo/XgRTNC3KRxEbc11nQ7/GmS8zVngOB2MP4CSkncHLeYZXpkx5 zpx2gJ7pWVAL1Ev+DGFD4yvjFL7T9FYOxmEuq4M25+vVFIXN1oVZp/o/JZ/WYQhNR1SE DyTJXqkbyBHiXMUzuQfbVCJuTTe8upMeoBCIbA5aPcwgmwrezDhXGfiEdbtkjAJgs3ff qssQAsvN4desP1FrRnSNE450aFMYN7TM+jf0CpI1xvUyYVmNlSgGotshFf/1fEW23p0x gLvg== X-Forwarded-Encrypted: i=1; AFNElJ/Fxkyb+DiSFjH9x3H45OhaNOd/qhwu6CRoPeVUxtsPHG0Bp7GvOsZ5SH2+eNUjylmxsBIqk4PBMByZjz8=@vger.kernel.org X-Gm-Message-State: AOJu0YzIJSA4S5i8UbF0D3KFVtezT5niAtmk2si9qK6iNAF40R1KWBsP oWKy2Z6qdSuueZzKUBrYPhdsLWqmJKz0mctdaA9OI7gHivgli8Qo1O+g X-Gm-Gg: AeBDieuvuoenjGPYnWCVC2qZqJoxzKwRZYV4caX6uc9989cEd+MT59a6m3GDLzAakVZ 1z82skcJpcQMpJp6cbpwPvpmqgRejDY01a9qDrYsgLQaTSuBIIrv+31SqmmfkBPnY/Jn7cofPak rploNmGQzJozY1O35Yfhwhn8+MePJJKqlr+NQmJ2ULce2eSB0f4UxlF4Re2v6gd3bjcc2sIbsFD lwsa3U1v1B015pCAAnF1lysO+EqIaEWm9ai/VicsbPHTUv3TFdLpB03rCtjg06113coshpUqwho vu9YbazsY3QitC+MaUovY2hy6ihapSZnKjBe2KIy0CKoFO/3TtEkVzqs0/JBveKGUHL2uXc/qRp I8eZq+E615XQ3JIQWqr+uqbgJFgy+Ny2aClfFs/cFAlT82WzR+z9/C9oWn0bbPds3v95q+ZWqZl sm2w3JSFnQ/xnfHENSdL7FOjfY8T6tyOY= X-Received: by 2002:a05:600c:354b:b0:48a:554d:b9a2 with SMTP id 5b1f17b1804b1-48e51e0c7c9mr4062065e9.6.1778003058809; Tue, 05 May 2026 10:44:18 -0700 (PDT) Received: from localhost ([2a03:2880:31ff:1f::]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a8eb69800sm359072365e9.2.2026.05.05.10.44.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 May 2026 10:44:18 -0700 (PDT) From: Mohsin Bashir To: netdev@vger.kernel.org Cc: alexanderduyck@gmail.com, davem@davemloft.net, edumazet@google.com, horms@kernel.org, kees@kernel.org, kuba@kernel.org, linux-kernel@vger.kernel.org, mohsin.bashr@gmail.com, p@1g4.org, pabeni@redhat.com Subject: [PATCH net] net: shaper: Reject reparenting of existing nodes Date: Tue, 5 May 2026 10:43:21 -0700 Message-ID: <20260505174321.1794689-1-mohsin.bashr@gmail.com> X-Mailer: git-send-email 2.52.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit When an existing node-scope shaper is moved to a different parent via the group operation, the framework fails to update the leaves count on both the old and new parent shapers. Only newly created nodes (handle.id == NET_SHAPER_ID_UNSPEC) trigger the parent leaves increment at line 1039. This causes the parent's leaves counter to diverge from the actual number of children in the xarray. When the node is later deleted, pre_del_node() allocates an array sized by the stale leaves count, but the xarray iteration finds more children than expected, hitting the WARN_ON_ONCE guard and returning -EINVAL. Rather than adding reparenting support with complex leaves count bookkeeping, reject group calls that attempt to change an existing node's parent. Updates to an existing node's rate or leaves under the same parent remain permitted. We expect that for any modification of the topology user should always create new groups and let the kernel garbage collect the leaf-less nodes. Fixes: 5d5d4700e75d ("net-shapers: implement NL group operation") Signed-off-by: Jakub Kicinski Signed-off-by: Mohsin Bashir --- net/shaper/shaper.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/net/shaper/shaper.c b/net/shaper/shaper.c index 94bc9c7382ea..81e32e91bade 100644 --- a/net/shaper/shaper.c +++ b/net/shaper/shaper.c @@ -966,13 +966,26 @@ static int __net_shaper_group(struct net_shaper_binding *binding, if (node->handle.scope == NET_SHAPER_SCOPE_NODE) { new_node = node->handle.id == NET_SHAPER_ID_UNSPEC; - if (!new_node && !net_shaper_lookup(binding, &node->handle)) { - /* The related attribute is not available when - * reaching here from the delete() op. - */ - NL_SET_ERR_MSG_FMT(extack, "Node shaper %d:%d does not exists", - node->handle.scope, node->handle.id); - return -ENOENT; + if (!new_node) { + struct net_shaper *cur; + + cur = net_shaper_lookup(binding, &node->handle); + if (!cur) { + /* The related attribute is not available + * when reaching here from the delete() op. + */ + NL_SET_ERR_MSG_FMT(extack, "Node shaper %d:%d does not exist", + node->handle.scope, + node->handle.id); + return -ENOENT; + } + if (net_shaper_handle_cmp(&cur->parent, + &node->parent)) { + NL_SET_ERR_MSG_FMT(extack, "Cannot reparent node shaper %d:%d", + node->handle.scope, + node->handle.id); + return -EOPNOTSUPP; + } } /* When unspecified, the node parent scope is inherited from -- 2.52.0