Patch "net: sched: cls_u32: Undo refcount decrement in case update failed" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: sched: cls_u32: Undo refcount decrement in case update failed

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-sched-cls_u32-undo-refcount-decrement-in-case-up.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 30ac61ca94fe6221447d2e6ad43c9620bc035240
Author: Victor Nogueira <victor@xxxxxxxxxxxx>
Date:   Thu Jul 13 15:05:12 2023 -0300

    net: sched: cls_u32: Undo refcount decrement in case update failed
    
    [ Upstream commit e8d3d78c19be0264a5692bed477c303523aead31 ]
    
    In the case of an update, when TCA_U32_LINK is set, u32_set_parms will
    decrement the refcount of the ht_down (struct tc_u_hnode) pointer
    present in the older u32 filter which we are replacing. However, if
    u32_replace_hw_knode errors out, the update command fails and that
    ht_down pointer continues decremented. To fix that, when
    u32_replace_hw_knode fails, check if ht_down's refcount was decremented
    and undo the decrement.
    
    Fixes: d34e3e181395 ("net: cls_u32: Add support for skip-sw flag to tc u32 classifier.")
    Signed-off-by: Victor Nogueira <victor@xxxxxxxxxxxx>
    Acked-by: Jamal Hadi Salim <jhs@xxxxxxxxxxxx>
    Reviewed-by: Pedro Tammela <pctammela@xxxxxxxxxxxx>
    Reviewed-by: Simon Horman <simon.horman@xxxxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index ed358466d042a..5abf31e432caf 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -928,6 +928,13 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
 		if (err) {
 			u32_unbind_filter(tp, new, tb);
 
+			if (tb[TCA_U32_LINK]) {
+				struct tc_u_hnode *ht_old;
+
+				ht_old = rtnl_dereference(n->ht_down);
+				if (ht_old)
+					ht_old->refcnt++;
+			}
 			__u32_destroy_key(new);
 			return err;
 		}



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux