mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: Rodolfo Giometti <giometti@enneenne.com>
Cc: linux-kernel@vger.kernel.org, dwmw2@infradead.org,
	davej@redhat.com, sam@ravnborg.org, greg@kroah.com,
	randy.dunlap@oracle.com
Subject: Re: [PATCH 1/7] LinuxPPS core support.
Date: Thu, 27 Mar 2008 20:25:31 -0700	[thread overview]
Message-ID: <20080327202531.a924e5d9.akpm@linux-foundation.org> (raw)
In-Reply-To: <20080325144400.GG8959@enneenne.com>

On Tue, 25 Mar 2008 15:44:00 +0100 Rodolfo Giometti <giometti@enneenne.com> wrote:

> > > +void pps_unregister_source(int source)
> > > +{
> > > +	struct pps_device *pps;
> > > +
> > > +	spin_lock_irq(&idr_lock);
> > > +	pps = idr_find(&pps_idr, source);
> > > +
> > > +	if (!pps) {
> > > +		spin_unlock_irq(&idr_lock);
> > > +		return;
> > > +	}
> > > +
> > > +	/* This should be done first in order to deny IRQ handlers
> > > +	 * to access PPS structs
> > > +	 */
> > > +
> > > +	idr_remove(&pps_idr, pps->id);
> > > +	spin_unlock_irq(&idr_lock);
> > > +
> > > +	wait_event(pps->usage_queue, atomic_read(&pps->usage) == 0);
> > > +
> > > +	pps_sysfs_remove_source_entry(pps);
> > > +	pps_unregister_cdev(pps);
> > > +	kfree(pps);
> > > +}
> > > +EXPORT_SYMBOL(pps_unregister_source);
> > 
> > The wait_event() stuff really shouldn't be here: it should be integral to
> > the refcounting:
> > 
> > void pps_dev_put(struct pps_device *pps)
> > {
> > 	spin_lock_irq(&pps_lock);
> > 	if (atomic_dec_and_test(&pps->usage))
> > 		idr_remove(&pps_idr, pps->id);
> > 	else
> > 		pps = NULL;
> > 	spin_unlock_irq(&pps_lock);
> > 	if (pps) {
> > 		/*
> > 		 * Might need to do the below via schedule_work() if
> > 		 * pps_dev_put() is to be callable from atomic context
> > 		 */
> > 		pps_sysfs_remove_source_entry(pps);
> > 		pps_unregister_cdev(pps);
> > 		kfree(pps);
> > 	}
> > }
> 
> I don't understand where I should use this function... :'(

This is boilerplate standard linux kernel reference counting.

> > 
> > As it stands, there might be deadlocks such as when a process which itself
> > holds a ref on the pps_device (with an open fd?) calls
> > pps_unregister_source.
> 
> I can add a wait_event_interruptible in order to allow userland to
> continue by receiving a signal. It could be acceptable?

There should be no need to "wait" for anything.  When the final reference
to an object is released, that object is cleaned up.  Just like we do for
inodes, dentries, pages, files, and 100 other kernel objects.

The need to wait for something else to go away is a big red flag with
"busted refcounting" written on it.

> > Also, we need to take care that all processes which were waiting in
> > pps_unregister_source() get to finish their cleanup before we permit rmmod
> > to proceed.  Is that handled somewhere?
> 
> I don't understand the problem... this code as been added in order to
> avoid the case where a pps_event() is called while a process executes
> the pps_unregister_source(). If more processes try to execute this
> code the first which enters will execute idr_remove() which prevents
> another process to reach the wait_event()... is that wrong? =:-o

I was asking you!

We should get the reference counting and object lifetimes sorted out first. 
There should be no "wait for <object> to be released" code.  Once that is
in place, things like rmmod will also sort themselves out: it just won't be
possible to remove the module while there are live references to objects.



  reply	other threads:[~2008-03-28  3:27 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-06 12:08 LinuxPPS (RESUBMIT 2): the PPS Linux implementation Rodolfo Giometti
2008-03-06 12:09 ` [PATCH 1/7] LinuxPPS core support Rodolfo Giometti
2008-03-06 12:09   ` [PATCH 2/7] PPS: userland header file for PPS API Rodolfo Giometti
2008-03-06 12:09     ` [PATCH 3/7] PPS: documentation programs and examples Rodolfo Giometti
2008-03-06 12:09       ` [PATCH 4/7] PPS: LinuxPPS clients support Rodolfo Giometti
2008-03-06 12:09         ` [PATCH 5/7] PPS: serial " Rodolfo Giometti
2008-03-06 12:09           ` [PATCH 6/7] PPS: example program to enable PPS support on serial ports Rodolfo Giometti
2008-03-06 12:09             ` [PATCH 7/7] PPS: parallel port clients support Rodolfo Giometti
2008-03-20 20:04           ` [PATCH 5/7] PPS: serial " Andrew Morton
2008-03-21 11:17             ` Rodolfo Giometti
2008-03-21 17:41               ` Andrew Morton
2008-03-25 10:38                 ` Rodolfo Giometti
2008-03-20 20:03   ` [PATCH 1/7] LinuxPPS core support Andrew Morton
2008-03-25 14:44     ` Rodolfo Giometti
2008-03-28  3:25       ` Andrew Morton [this message]
2008-04-01  8:42         ` Rodolfo Giometti
2008-04-01  8:55           ` Andrew Morton
2008-04-01  9:50             ` Rodolfo Giometti
2008-04-01 21:45             ` Rodolfo Giometti
2008-04-01 21:57               ` Andrew Morton
2008-03-21  3:36   ` Kay Sievers
2008-03-21 10:56     ` Rodolfo Giometti
2008-03-21 17:00       ` Kay Sievers
2008-03-25 10:48         ` Rodolfo Giometti
2008-03-21  3:50   ` Kay Sievers
2008-03-21 10:57     ` Rodolfo Giometti
2008-03-21 17:01       ` Kay Sievers
2008-03-25 10:53     ` Rodolfo Giometti
2008-03-28 10:21   ` Andrew Morton
2008-04-01  8:59     ` Rodolfo Giometti
2008-04-01  9:09       ` Andrew Morton
2008-04-01  9:40         ` Rodolfo Giometti
2008-03-19 17:29 ` LinuxPPS (RESUBMIT 2): the PPS Linux implementation john stultz
2008-03-19 21:21   ` Andrew Morton
2008-03-19 21:55     ` Dave Jones
2008-04-10 15:15 LinuxPPS (RESUBMIT 3): " Rodolfo Giometti
2008-04-10 15:15 ` [PATCH 1/7] LinuxPPS core support Rodolfo Giometti
2008-04-10 16:06 [PATCH 5/7] PPS: serial clients support Rodolfo Giometti
2008-04-10 18:22 ` LinuxPPS (RESUBMIT 4): the PPS Linux implementation Rodolfo Giometti
2008-04-10 18:22   ` [PATCH 1/7] LinuxPPS core support Rodolfo Giometti

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=20080327202531.a924e5d9.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=davej@redhat.com \
    --cc=dwmw2@infradead.org \
    --cc=giometti@enneenne.com \
    --cc=greg@kroah.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=randy.dunlap@oracle.com \
    --cc=sam@ravnborg.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

Powered by JetHome