From: "Adam J. Richter" <adam@yggdrasil.com>
To: linux-hotplug@vger.kernel.org
Subject: Algorithm for hotplugging without an event queue (was: Adding PCMCIA support to the kernel tree -- d
Date: Thu, 08 Feb 2001 16:45:56 +0000 [thread overview]
Message-ID: <marc-linux-hotplug-98165081207796@msgid-missing> (raw)
>From: Oliver Neukum <Oliver.Neukum@lrz.uni-muenchen.de>
>> >You need to prevent any changes to the bus while you do the scanning.
>> >Running hotplug support is not enough. You need further kernel support
>> >to do racefree scanning.
>>
>> You cannot lock physical reality.
>To a certain extent you can. You cannot hide removal, but you can hide
>addition. That's enough.
You'll have to show me an example of where not hiding addition
casses trouble.
>> In any case, the doubt that I originally expressed was about
>> the need to queue hotplug events _before_ the hot plug system was
>> initialized. In your example, the events occur after the hot plug
>> system is initialized.
>No, it occurs while you are initialising the hotplug system.
In the timeline that you listed, the hot plug events occurred
*after* the hot plug system was initialized (but while the existing
hardware was being scanned). The doubt that I originally expressed
was about the need to queue hotplug events *before* the hot plug
system was initialized.
>You cannot scan a bus without locking it.
You have not shown that or even defined it well at this point.
>While you lock the bus what do you do with the events ?
While you *scan* the bus, the kernel would continue
to generate asynchronous calls to /sbin/hotplug, which would
block on the lock held by the currently running /sbin/hotplug
in the algorithm that I described. When the currently
running /sbin/hotplug finishes, the second /sbin/hotplug
that is waiting will catch any changes that happend while
the previous one was running.
>You could indeed do without queueing initial events, if you did
>scan the bus under lock.
>Provided that you give stable names (David's definition) to the agents
>in order to be able to loose information about ordering of events.
For the algorithm that I posted, a naming scheme like the
one used by /proc/bus/usb is sufficient and there is no need to
do anything more to preserve the order of events.
>> However, now that you mention it, let's talk about handling
>> events that occur after initialization. I think we can avoid the
>> need to queue those events too.
>>
>> First of all, we should recognize that for most hardware,
>> the events caused by unplugging are handled directly by the kernel,
>> not by the user level hot plugging code. For example, with a DHCP
>> configured ethernet, removal of the ethernet interface card should
>> cause the socket that dhcp has open on the ethernet interface to
>> return an IO exception condition, and dhclient should get -EIO
>> and abort when it tries to execute the ioctl to check the status.
>I am afraid I have to disagree. Most hardware is associated with device nodes
>in /dev which retain their permission bits. You have to reset them on removal.
I am not talking about returing -EPERM on open (which should
fail if a device is no longer present anyhow), I am talking about
returning -EIO or something similar on already open file descriptors.
>> Secondly, there is a way to get this processing right
>> where necessary without the need to queue events (which can overflow,
>> and involve maintiaining arbitrary large dynamic data strucutres).
>> All you need is a "new" flag that the kernel would set when on a device
>> when it is inserted. The hot plug code would be called by the kernel
>> with an argument indicating what device to check, without necessarily
>> even indicating whether it was a hot plug or a remove event.
>>
>> userland_hotplug_handler(dev)
>> {
>> // was_plugged_in[dev] is persistent data, perhaps
>> // stored in a file.
>>
>> acquire_lock(dev); // Flock some file; could just have
>> // one global lock. Whatever.
>> if (was_plugged_in[dev]
>> && (new[dev] || !is_plugged_in[dev])) {
> ^ race condition, the condition you check for might change
>> was_plugged_in[dev] = 0;
>> handle_remove_event(dev);
>> }
>and you may forget a removal event this way, which is bad
>> if (new[dev]) {
>> new[dev] = 0;
>> if (is_plugged_in[dev]) {
>> was_plugged_in[dev] = 1;
>> handle_insert_event(device);
>> }
>> }
>> release_lock(dev);
>> }
(Note: I have deleted the line near the bottom that read
"old_status[dev] = new_status;". It was left over from a previous
edit and did not belong in this listing.)
The "race condition" that you described is not a problem
because the kernel only *sets* new[dev], and only does so when
it detects an insertion, and then spawns a new /sbin/hotplug, which
will run after the currently running /sbin/hotplug releases its
lock and will process the new device if the previous /sbin/hotplug
instance did not already do so. /sbin/hotplug only *clears* new[dev].
If you do not understand, try making a timeline of an example.
Adam J. Richter __ ______________ 4880 Stevens Creek Blvd, Suite 104
adam@yggdrasil.com \ / San Jose, California 95129-1034
+1 408 261-6630 | g g d r a s i l United States of America
fax +1 408 261-6631 "Free Software For The Rest Of Us."
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel
next reply other threads:[~2001-02-08 16:45 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-02-08 16:45 Adam J. Richter [this message]
2001-02-08 18:37 ` Algorithm for hotplugging without an event queue (was: Adding PCMCIA support to the kernel tree Oliver Neukum
2001-02-08 20:40 ` Adam J. Richter
2001-02-08 22:02 ` Oliver Neukum
2001-02-09 20:34 ` Adam J. Richter
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=marc-linux-hotplug-98165081207796@msgid-missing \
--to=adam@yggdrasil.com \
--cc=linux-hotplug@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.