public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@osdl.org>
To: johnpol@2ka.mipt.ru
Cc: linux-kernel@vger.kernel.org
Subject: Re: cn_queue.c
Date: Fri, 1 Apr 2005 02:43:12 -0800	[thread overview]
Message-ID: <20050401024312.641946e2.akpm@osdl.org> (raw)
In-Reply-To: <1112351791.9334.208.camel@uganda>

Evgeniy Polyakov <johnpol@2ka.mipt.ru> wrote:
>
> On Fri, 2005-04-01 at 01:50 -0800, Andrew Morton wrote:
> > Evgeniy Polyakov <johnpol@2ka.mipt.ru> wrote:
> > >
> > > cn_queue_free_dev() will wait until dev->refcnt hits zero 
> > >  before freeing any resources,
> > >  but it can happen only after cn_queue_del_callback() does 
> > >  it's work on given callback device [actually when all callbacks 
> > >  are removed].
> > >  When new callback is added into device, it's refcnt is incremented
> > >  [before adition btw, if addition fails in the middle, reference is
> > >  decremented], when callbak is removed, device's reference counter
> > >  is decremented aromically after all work is finished.
> > 
> > hm.
> > 
> > How come cn_queue_del_callback() uses all those barriers if no other CPU
> > can grab new references against cbq->cb->refcnt?
> 
> The work may be already assigned to that callback device, 
> new work cant, barriers are there to ensure that
> reference counters are updated in proper places, but not 
> before.

What are the "proper places"?  What other control paths could be inspecting
the refcount at this time?  (That's the problem with barriers - you can't
tell what they are barriering against).

> It would be a bug to update dev->refcnt before assigned work is finished
> and callback removed.
> 
> > cn_queue_free_callback() forgot to do flush_workqueue(), so
> > cn_queue_wrapper() can still be running while cn_queue_free_callback()
> > frees up the cn_callback_entry, I think.
> 
> cn_queue_wrapper() atomically increments cbq->cb->refcnt if runs, so it
> will
> be caught in 
> while (atomic_read(&cbq->cb->refcnt)) 
>   msleep(1000);
> in cn_queue_free_callback().
> If it does not run, then all will be ok.

But there's a time window on entry to cn_queue_wrapper() where the recsount
hasn't been incremented yet, and there's no locking.  If
cn_queue_free_callback() inspects the refcount in that window it will free
the cn_callback_entry() while cn_queue_wrapper() is playing with it?

> Btw, it looks like comments for del_timer_sync() and cancel_delayed_work
> ()
> are controversial - del_timer_sync() says that pending timer
> can not run on different CPU after returning, 
> but cancel_delayed_work() says, that work to be cancelled still 
> can run after returning.

Not controversial - the timer can have expired and have been successfully
deleted but the work_struct which the timer handler scheduled is still
pending, or has just started to run.


  reply	other threads:[~2005-04-01 10:43 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-04-01  1:32 cn_queue.c Andrew Morton
2005-04-01  7:40 ` cn_queue.c Evgeniy Polyakov
2005-04-01  7:57   ` cn_queue.c Andrew Morton
2005-04-01  8:40     ` cn_queue.c Evgeniy Polyakov
2005-04-01  8:48       ` cn_queue.c Andrew Morton
2005-04-01  9:34         ` cn_queue.c Evgeniy Polyakov
2005-04-01  9:50           ` cn_queue.c Andrew Morton
2005-04-01 10:36             ` cn_queue.c Evgeniy Polyakov
2005-04-01 10:43               ` Andrew Morton [this message]
2005-04-01 11:12                 ` cn_queue.c Evgeniy Polyakov
2005-04-01 11:15                   ` cn_queue.c Evgeniy Polyakov

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=20050401024312.641946e2.akpm@osdl.org \
    --to=akpm@osdl.org \
    --cc=johnpol@2ka.mipt.ru \
    --cc=linux-kernel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox