Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 55956
b: refs/heads/master
c: d9568ba
h: refs/heads/master
v: v3
  • Loading branch information
Herbert Xu authored and David S. Miller committed May 11, 2007
1 parent 7ac7802 commit f626b4b
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: db0ccffed91e234cad99a35f07d5a322f410baa2
refs/heads/master: d9568ba91b1fdd1ea4fdbf9fcc76b867cca6c1d5
60 changes: 41 additions & 19 deletions trunk/net/core/link_watch.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@


enum lw_bits {
LW_RUNNING = 0,
LW_URGENT = 0,
};

static unsigned long linkwatch_flags;
Expand Down Expand Up @@ -95,18 +95,41 @@ static void linkwatch_add_event(struct net_device *dev)
}


static void linkwatch_schedule_work(unsigned long delay)
static void linkwatch_schedule_work(int urgent)
{
if (test_and_set_bit(LW_RUNNING, &linkwatch_flags))
unsigned long delay = linkwatch_nextevent - jiffies;

if (test_bit(LW_URGENT, &linkwatch_flags))
return;

/* If we wrap around we'll delay it by at most HZ. */
if (delay > HZ) {
linkwatch_nextevent = jiffies;
/* Minimise down-time: drop delay for up event. */
if (urgent) {
if (test_and_set_bit(LW_URGENT, &linkwatch_flags))
return;
delay = 0;
}

schedule_delayed_work(&linkwatch_work, delay);
/* If we wrap around we'll delay it by at most HZ. */
if (delay > HZ)
delay = 0;

/*
* This is true if we've scheduled it immeditately or if we don't
* need an immediate execution and it's already pending.
*/
if (schedule_delayed_work(&linkwatch_work, delay) == !delay)
return;

/* Don't bother if there is nothing urgent. */
if (!test_bit(LW_URGENT, &linkwatch_flags))
return;

/* It's already running which is good enough. */
if (!cancel_delayed_work(&linkwatch_work))
return;

/* Otherwise we reschedule it again for immediate exection. */
schedule_delayed_work(&linkwatch_work, 0);
}


Expand All @@ -123,7 +146,11 @@ static void __linkwatch_run_queue(int urgent_only)
*/
if (!urgent_only)
linkwatch_nextevent = jiffies + HZ;
clear_bit(LW_RUNNING, &linkwatch_flags);
/* Limit wrap-around effect on delay. */
else if (time_after(linkwatch_nextevent, jiffies + HZ))
linkwatch_nextevent = jiffies;

clear_bit(LW_URGENT, &linkwatch_flags);

spin_lock_irq(&lweventlist_lock);
next = lweventlist;
Expand Down Expand Up @@ -166,7 +193,7 @@ static void __linkwatch_run_queue(int urgent_only)
}

if (lweventlist)
linkwatch_schedule_work(linkwatch_nextevent - jiffies);
linkwatch_schedule_work(0);
}


Expand All @@ -187,21 +214,16 @@ static void linkwatch_event(struct work_struct *dummy)

void linkwatch_fire_event(struct net_device *dev)
{
if (!test_and_set_bit(__LINK_STATE_LINKWATCH_PENDING, &dev->state)) {
unsigned long delay;
int urgent = linkwatch_urgent_event(dev);

if (!test_and_set_bit(__LINK_STATE_LINKWATCH_PENDING, &dev->state)) {
dev_hold(dev);

linkwatch_add_event(dev);
} else if (!urgent)
return;

delay = linkwatch_nextevent - jiffies;

/* Minimise down-time: drop delay for up event. */
if (linkwatch_urgent_event(dev))
delay = 0;

linkwatch_schedule_work(delay);
}
linkwatch_schedule_work(urgent);
}

EXPORT_SYMBOL(linkwatch_fire_event);

0 comments on commit f626b4b

Please sign in to comment.