• Jamal Hadi Salim's avatar
    net sched actions: fix refcnt when GETing of action after bind · 0faa9cb5
    Jamal Hadi Salim authored
    Demonstrating the issue:
    
    .. add a drop action
    $sudo $TC actions add action drop index 10
    
    .. retrieve it
    $ sudo $TC -s actions get action gact index 10
    
    	action order 1: gact action drop
    	 random type none pass val 0
    	 index 10 ref 2 bind 0 installed 29 sec used 29 sec
     	Action statistics:
    	Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    	backlog 0b 0p requeues 0
    
    ... bug 1 above: reference is two.
        Reference is actually 1 but we forget to subtract 1.
    
    ... do a GET again and we see the same issue
        try a few times and nothing changes
    ~$ sudo $TC -s actions get action gact index 10
    
    	action order 1: gact action drop
    	 random type none pass val 0
    	 index 10 ref 2 bind 0 installed 31 sec used 31 sec
     	Action statistics:
    	Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    	backlog 0b 0p requeues 0
    
    ... lets try to bind the action to a filter..
    $ sudo $TC qdisc add dev lo ingress
    $ sudo $TC filter add dev lo parent ffff: protocol ip prio 1 \
      u32 match ip dst 127.0.0.1/32 flowid 1:1 action gact index 10
    
    ... and now a few GETs:
    $ sudo $TC -s actions get action gact index 10
    
    	action order 1: gact action drop
    	 random type none pass val 0
    	 index 10 ref 3 bind 1 installed 204 sec used 204 sec
     	Action statistics:
    	Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    	backlog 0b 0p requeues 0
    
    $ sudo $TC -s actions get action gact index 10
    
    	action order 1: gact action drop
    	 random type none pass val 0
    	 index 10 ref 4 bind 1 installed 206 sec used 206 sec
     	Action statistics:
    	Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    	backlog 0b 0p requeues 0
    
    $ sudo $TC -s actions get action gact index 10
    
    	action order 1: gact action drop
    	 random type none pass val 0
    	 index 10 ref 5 bind 1 installed 235 sec used 235 sec
     	Action statistics:
    	Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    	backlog 0b 0p requeues 0
    
    .... as can be observed the reference count keeps going up.
    
    After the fix
    
    $ sudo $TC actions add action drop index 10
    $ sudo $TC -s actions get action gact index 10
    
    	action order 1: gact action drop
    	 random type none pass val 0
    	 index 10 ref 1 bind 0 installed 4 sec used 4 sec
     	Action statistics:
    	Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    	backlog 0b 0p requeues 0
    
    $ sudo $TC -s actions get action gact index 10
    
    	action order 1: gact action drop
    	 random type none pass val 0
    	 index 10 ref 1 bind 0 installed 6 sec used 6 sec
     	Action statistics:
    	Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    	backlog 0b 0p requeues 0
    
    $ sudo $TC qdisc add dev lo ingress
    $ sudo $TC filter add dev lo parent ffff: protocol ip prio 1 \
      u32 match ip dst 127.0.0.1/32 flowid 1:1 action gact index 10
    
    $ sudo $TC -s actions get action gact index 10
    
    	action order 1: gact action drop
    	 random type none pass val 0
    	 index 10 ref 2 bind 1 installed 32 sec used 32 sec
     	Action statistics:
    	Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    	backlog 0b 0p requeues 0
    
    $ sudo $TC -s actions get action gact index 10
    
    	action order 1: gact action drop
    	 random type none pass val 0
    	 index 10 ref 2 bind 1 installed 33 sec used 33 sec
     	Action statistics:
    	Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    	backlog 0b 0p requeues 0
    
    Fixes: aecc5cef ("net sched actions: fix GETing actions")
    Signed-off-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    0faa9cb5
act_api.c 23.8 KB