FAILED: patch "[PATCH] 8021q: delete cleared egress QoS mappings" failed to apply to 6.12-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x 7dddc74af369478ba7f9bc136d0fc1dc4570cb66
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026050409-guts-implode-5a2a@gregkh' --subject-prefix 'PATCH 6.12.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 7dddc74af369478ba7f9bc136d0fc1dc4570cb66 Mon Sep 17 00:00:00 2001
From: Longxuan Yu <[email protected]>
Date: Mon, 20 Apr 2026 11:18:46 +0800
Subject: [PATCH] 8021q: delete cleared egress QoS mappings
vlan_dev_set_egress_priority() currently keeps cleared egress priority mappings in the hash as tombstones. Repeated set/clear cycles with distinct skb priorities therefore accumulate mapping nodes until device teardown and leak memory.
Delete mappings when vlan_prio is cleared instead of keeping tombstones. Now that the egress mapping lists are RCU protected, the node can be unlinked safely and freed after a grace period.
net/8021q/vlan_dev.c +14 -6
@@ -172,26 +172,34 @@ int vlan_dev_set_egress_priority(const struct net_device *dev, u32 skb_prio, u16 vlan_prio) {struct vlan_dev_priv *vlan =vlan_dev_priv (dev); +struct vlan_priority_tci_mapping __rcu **mpp;struct vlan_priority_tci_mapping *mp;struct vlan_priority_tci_mapping *np;u32 bucket = skb_prio &0xF ;u32 vlan_qos = (vlan_prio <<VLAN_PRIO_SHIFT ) &VLAN_PRIO_MASK ;/* See if a priority mapping exists.. */ - mp =rtnl_dereference (vlan->egress_priority_map[bucket]); + mpp = &vlan->egress_priority_map[bucket]; + mp =rtnl_dereference (*mpp);while (mp) {if (mp->priority == skb_prio) { -if (mp->vlan_qos && !vlan_qos) +if (!vlan_qos) { +rcu_assign_pointer (*mpp,rtnl_dereference (mp->next)); vlan->nr_egress_mappings--; -else if (!mp->vlan_qos && vlan_qos) - vlan->nr_egress_mappings++; -WRITE_ONCE (mp->vlan_qos, vlan_qos); +kfree_rcu (mp, rcu); + }else { +WRITE_ONCE (mp->vlan_qos, vlan_qos); + }return 0 ; } - mp =rtnl_dereference (mp->next); + mpp = &mp->next; + mp =rtnl_dereference (*mpp); }/* Create a new mapping then. */ +if (!vlan_qos) +return 0 ; + np = kmalloc_obj(struct vlan_priority_tci_mapping);if (!np)return -ENOBUFS ;
net/8021q/vlan_netlink.c +0 -4
@@ -263,10 +263,6 @@ static int vlan_fill_info(struct sk_buff *skb, const struct net_device *dev)for (pm =rcu_dereference_rtnl (vlan->egress_priority_map[i]); pm; pm =rcu_dereference_rtnl (pm->next)) {u16 vlan_qos =READ_ONCE (pm->vlan_qos); - -if (!vlan_qos) -continue ; - m.from = pm->priority; m.to = (vlan_qos >>13 ) &0x7 ; if (nla_put(skb, IFLA_VLAN_QOS_MAPPING,