• L
    mv643xx_eth: fix double add_timer() on the receive oom timer · 92c70f27
    Lennert Buytenhek 提交于
    Commit 12e4ab79 ("mv643xx_eth: be
    more agressive about RX refill") changed the condition for the receive
    out-of-memory timer to be scheduled from "the receive ring is empty"
    to "the receive ring is not full".
    
    This can lead to a situation where the receive out-of-memory timer is
    pending because a previous rxq_refill() didn't manage to refill the
    receive ring entirely as a result of being out of memory, and
    rxq_refill() is then called again as a side effect of a packet receive
    interrupt, and that rxq_refill() call then again does not succeed to
    refill the entire receive ring with fresh empty skbuffs because we are
    still out of memory, and then tries to call add_timer() on the already
    scheduled out-of-memory timer.
    
    This patch fixes this issue by changing the add_timer() call in
    rxq_refill() to a mod_timer() call.  If the OOM timer was not already
    scheduled, this will behave as before, whereas if it was already
    scheduled, this patch will push back its firing time a bit, which is
    safe because we've (unsuccessfully) attempted to refill the receive
    ring just before we do this.
    Signed-off-by: NLennert Buytenhek <buytenh@marvell.com>
    92c70f27
mv643xx_eth.c 64.5 KB