All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Dumazet <dada1@cosmosbay.com>
To: Benjamin Thery <benjamin.thery@bull.net>
Cc: "David S. Miller" <davem@davemloft.net>, netdev@vger.kernel.org
Subject: Re: [PATCH 1/1] net: fix scheduling of dst_gc_task by __dst_free
Date: Fri, 12 Sep 2008 16:46:52 +0200	[thread overview]
Message-ID: <48CA80DC.9040408@cosmosbay.com> (raw)
In-Reply-To: <20080912123118.993434427@theryb.frec.bull.fr>

Benjamin Thery a écrit :
> The dst garbage collector dst_gc_task() may not be scheduled as we
> expect it to be in __dst_free().
> 
> Indeed, when the dst_gc_timer was replaced by the delayed_work
> dst_gc_work, the mod_timer() call used to schedule the garbage
> collector at an earlier date was replaced by a schedule_delayed_work()
> (see commit 86bba269d08f0c545ae76c90b56727f65d62d57f).
> 
> But, the behaviour of mod_timer() and schedule_delayed_work() is
> different in the way they handle the delay. 
> 
> mod_timer() stops the timer and re-arm it with the new given delay,
> whereas schedule_delayed_work() only check if the work is already
> queued in the workqueue (and queue it (with delay) if it is not)
> BUT it does NOT take into account the new delay (even if the new delay
> is earlier in time).
> schedule_delayed_work() returns 0 if it didn't queue the work,
> but we don't check the return code in __dst_free().
> 
> If I understand the code in __dst_free() correctly, we want dst_gc_task
> to be queued after DST_GC_INC jiffies if we pass the test (and not in
> some undetermined time in the future), so I think we should add a call
> to cancel_delayed_work() before schedule_delayed_work(). Patch below.
> 

Well, you are right that time is undetermined (but < ~120 seconds), so your patch
makes sense.

Acked-by: Eric Dumazet <dada1@cosmosbay.com>

Then we should ask why we reset the timer back to its minimum value
every time we call __dst_free(). On machines with many dormant tcp sessions, 
dst_garbage.list can contain huge number of non freeable entries :(

Maybe we should count the entries and change the timer only if really needed.


> Or we should at least test the return code of schedule_delayed_work(),
> and reset the values of dst_garbage.timer_inc and dst_garbage.timer_expires
> back to their former values if schedule_delayed_work() failed.
> Otherwise the subsequent calls to __dst_free will test the wrong values
> and assume wrong thing about when the garbage collector is supposed to
> be scheduled.
> 
> dst_gc_task() also calls schedule_delayed_work() without checking
> its return code (or calling cancel_scheduled_work() first), but it
> should fine there: dst_gc_task is the routine of the delayed_work, so
> no dst_gc_work should be pending in the queue when it's running.
>  
> This patch applies on top of net-2.6.
> 
> (Sorry, I think I've been a bit verbose to expose this simple issue :)
> 
> Signed-off-by: Benjamin Thery <benjamin.thery@bull.net>
> ---
>  net/core/dst.c |    1 +
>  1 file changed, 1 insertion(+)
> 
> Index: net-2.6/net/core/dst.c
> ===================================================================
> --- net-2.6.orig/net/core/dst.c
> +++ net-2.6/net/core/dst.c
> @@ -203,6 +203,7 @@ void __dst_free(struct dst_entry * dst)
>  	if (dst_garbage.timer_inc > DST_GC_INC) {
>  		dst_garbage.timer_inc = DST_GC_INC;
>  		dst_garbage.timer_expires = DST_GC_MIN;
> +		cancel_delayed_work(&dst_gc_work);
>  		schedule_delayed_work(&dst_gc_work, dst_garbage.timer_expires);
>  	}
>  	spin_unlock_bh(&dst_garbage.lock);
> 





  reply	other threads:[~2008-09-12 15:46 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20080912123113.770453085@theryb.frec.bull.fr>
2008-09-12 12:31 ` [PATCH 1/1] net: fix scheduling of dst_gc_task by __dst_free Benjamin Thery
2008-09-12 14:46   ` Eric Dumazet [this message]
2008-09-12 23:14     ` David Miller
2008-09-15 13:26       ` Benjamin Thery

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48CA80DC.9040408@cosmosbay.com \
    --to=dada1@cosmosbay.com \
    --cc=benjamin.thery@bull.net \
    --cc=davem@davemloft.net \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.