• Eric Dumazet's avatar
    gen_estimator: deadlock fix · 5d944c64
    Eric Dumazet authored
    One of my test machine got a deadlock during "tc" sessions,
    adding/deleting classes & filters, using traffic estimators.
    
    After some analysis, I believe we have a potential use after free case
    in est_timer() :
    
    spin_lock(e->stats_lock); << HERE >>
    read_lock(&est_lock);
    if (e->bstats == NULL)   << TEST >>
    	goto skip;
    
    Test is done a bit late, because after estimator is killed, and before
    rcu grace period elapsed, we might already have freed/reuse memory where
    e->stats_locks points to (some qdisc->q.lock)
    
    A possible fix is to respect a rcu grace period at Qdisc dismantle time.
    
    On 64bit, sizeof(struct Qdisc) is exactly 192 bytes. Adding 16 bytes to
    it (for struct rcu_head) is a problem because it might change
    performance, given QDISC_ALIGNTO is 32 bytes.
    
    This is why I also change QDISC_ALIGNTO to 64 bytes, to satisfy most
    current alignment requirements.
    Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5d944c64
sch_generic.c 19.9 KB