lkml.org 
[lkml]   [2008]   [Apr]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectNET: Add preemption point in qdisc_run
    -stable review patch.  If anyone has any objections, please let us know.
    ---------------------

    From: Herbert Xu <herbert@gondor.apana.org.au>

    Upstream commit: 2ba2506ca7ca62c56edaa334b0fe61eb5eab6ab0

    The qdisc_run loop is currently unbounded and runs entirely in a
    softirq. This is bad as it may create an unbounded softirq run.

    This patch fixes this by calling need_resched and breaking out if
    necessary.

    It also adds a break out if the jiffies value changes since that would
    indicate we've been transmitting for too long which starves other
    softirqs.

    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Chris Wright <chrisw@sous-sol.org>
    ---
    net/sched/sch_generic.c | 18 +++++++++++++++---
    1 file changed, 15 insertions(+), 3 deletions(-)

    --- a/net/sched/sch_generic.c
    +++ b/net/sched/sch_generic.c
    @@ -178,10 +178,22 @@ static inline int qdisc_restart(struct n

    void __qdisc_run(struct net_device *dev)
    {
    - do {
    - if (!qdisc_restart(dev))
    + unsigned long start_time = jiffies;
    +
    + while (qdisc_restart(dev)) {
    + if (netif_queue_stopped(dev))
    + break;
    +
    + /*
    + * Postpone processing if
    + * 1. another process needs the CPU;
    + * 2. we've been doing it for too long.
    + */
    + if (need_resched() || jiffies != start_time) {
    + netif_schedule(dev);
    break;
    - } while (!netif_queue_stopped(dev));
    + }
    + }

    clear_bit(__LINK_STATE_QDISC_RUNNING, &dev->state);
    }
    --


    \
     
     \ /
      Last update: 2008-04-17 03:17    [W:4.467 / U:0.448 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site