[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
/*
2008-09-10 04:40:42 +04:00
* Copyright ( C ) 2004 - 2008 Kay Sievers < kay . sievers @ vrfy . org >
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote:
>
> Kay, you said "unless we can get rid of _all_ the threads or at least
> getting faster, I don't want to change it."
>
> Well how about we get rid of all the threads, *and* we get faster?
Yes, we are twice as fast now on my box :)
> This patch applies to current bk trees, and does the following:
>
> 1) Switch to DGRAM sockets rather than STREAM. This simplifies things
> as mentioned in the previous message.
>
> 2) Invalid sequence numbers are mapped to -1 rather than zero, since
> zero is a valid sequence number (I think). Also, this allows for real
> speed tests using scripts starting at a zero sequence number, since that
> is what the initial expected sequence number is.
>
> 3) Get rid of all threading. This is the biggie. Some highlights:
> a) timeout using setitimer() and SIGALRM
> b) async child death notification via SIGCHLD
> c) these two signal handlers do nothing but raise volatile flags,
> all the
> work is done in the main loop
> d) locking no longer required
I cleaned up the rest of the comments, the whitespace and a few names to match
the whole thing. Please recheck it. Test script is switched to work on subsystem
'test' to let udev ignore it.
2004-02-07 09:21:15 +03:00
* Copyright ( C ) 2004 Chris Friesen < chris_friesen @ sympatico . ca >
2009-03-10 16:00:16 +03:00
* Copyright ( C ) 2009 Canonical Ltd .
* Copyright ( C ) 2009 Scott James Remnant < scott @ netsplit . com >
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
*
2008-09-10 04:40:42 +04:00
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 2 of the License , or
* ( at your option ) any later version .
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
*
2008-09-10 04:40:42 +04:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
*
2008-09-10 04:40:42 +04:00
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
*/
2004-01-27 05:19:33 +03:00
# include <stddef.h>
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
# include <signal.h>
# include <unistd.h>
# include <errno.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
2005-01-17 02:53:08 +03:00
# include <ctype.h>
# include <fcntl.h>
2005-11-07 04:22:44 +03:00
# include <time.h>
2006-09-08 13:27:03 +04:00
# include <getopt.h>
2008-11-06 19:43:12 +03:00
# include <dirent.h>
2005-03-10 02:58:01 +03:00
# include <sys/select.h>
2009-01-20 14:49:20 +03:00
# include <sys/poll.h>
2005-03-10 02:58:01 +03:00
# include <sys/wait.h>
2004-10-14 09:37:59 +04:00
# include <sys/stat.h>
2005-10-27 23:04:38 +04:00
# include <sys/ioctl.h>
2008-07-30 03:45:23 +04:00
# ifdef HAVE_INOTIFY
# include <sys/inotify.h>
# endif
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
# include "udev.h"
2008-09-08 19:59:00 +04:00
# define UDEVD_PRIORITY -4
# define UDEV_PRIORITY -2
/* maximum limit of forked childs */
# define UDEVD_MAX_CHILDS 256
2008-04-20 23:07:06 +04:00
static int debug ;
2006-09-08 13:28:38 +04:00
2008-09-06 17:45:31 +04:00
static void log_fn ( struct udev * udev , int priority ,
const char * file , int line , const char * fn ,
const char * format , va_list args )
{
if ( debug ) {
fprintf ( stderr , " [%d] %s: " , ( int ) getpid ( ) , fn ) ;
vfprintf ( stderr , format , args ) ;
} else {
vsyslog ( priority , format , args ) ;
}
}
2009-01-21 13:17:11 +03:00
static void reap_sigchilds ( void ) ;
2008-09-06 17:45:31 +04:00
static int debug_trace ;
2008-10-18 17:02:01 +04:00
static struct udev_rules * rules ;
2008-09-08 19:59:00 +04:00
static struct udev_ctrl * udev_ctrl ;
2008-10-16 19:16:58 +04:00
static struct udev_monitor * kernel_monitor ;
2004-10-19 15:37:30 +04:00
static volatile int sigchilds_waiting ;
2005-08-08 07:07:36 +04:00
static volatile int udev_exit ;
2005-10-27 23:04:38 +04:00
static volatile int reload_config ;
2009-01-20 14:49:20 +03:00
static volatile int signal_received ;
2009-03-10 16:00:16 +03:00
static volatile pid_t settle_pid ;
2004-04-01 11:03:07 +04:00
static int run_exec_q ;
2005-06-05 06:41:09 +04:00
static int stop_exec_q ;
2005-06-05 06:53:17 +04:00
static int max_childs ;
2008-10-29 19:32:13 +03:00
static int childs ;
static struct udev_list_node event_list ;
2005-06-05 06:53:17 +04:00
2005-11-16 06:12:53 +03:00
enum event_state {
EVENT_QUEUED ,
EVENT_FINISHED ,
EVENT_FAILED ,
} ;
2008-10-17 20:59:27 +04:00
static struct udev_event * node_to_event ( struct udev_list_node * node )
{
char * event ;
event = ( char * ) node ;
event - = offsetof ( struct udev_event , node ) ;
return ( struct udev_event * ) event ;
}
2008-10-16 19:16:58 +04:00
static void export_event_state ( struct udev_event * event , enum event_state state )
2005-11-16 06:12:53 +03:00
{
2008-09-10 23:50:21 +04:00
char filename [ UTIL_PATH_SIZE ] ;
char filename_failed [ UTIL_PATH_SIZE ] ;
2007-03-14 23:41:33 +03:00
size_t start ;
2005-11-16 06:12:53 +03:00
2007-08-26 07:22:35 +04:00
/* location of queue file */
2008-10-16 19:16:58 +04:00
snprintf ( filename , sizeof ( filename ) , " %s/.udev/queue/%llu " ,
udev_get_dev_path ( event - > udev ) , udev_device_get_seqnum ( event - > dev ) ) ;
2005-11-16 06:12:53 +03:00
2007-08-26 07:22:35 +04:00
/* location of failed file */
2008-10-16 19:16:58 +04:00
util_strlcpy ( filename_failed , udev_get_dev_path ( event - > udev ) , sizeof ( filename_failed ) ) ;
2008-09-10 20:59:42 +04:00
util_strlcat ( filename_failed , " / " , sizeof ( filename_failed ) ) ;
start = util_strlcat ( filename_failed , " .udev/failed/ " , sizeof ( filename_failed ) ) ;
2008-10-16 19:16:58 +04:00
util_strlcat ( filename_failed , udev_device_get_devpath ( event - > dev ) , sizeof ( filename_failed ) ) ;
2008-09-10 20:39:23 +04:00
util_path_encode ( & filename_failed [ start ] , sizeof ( filename_failed ) - start ) ;
2005-11-16 06:12:53 +03:00
switch ( state ) {
case EVENT_QUEUED :
2008-10-18 16:39:04 +04:00
if ( unlink ( filename_failed ) = = 0 )
2008-10-18 22:12:55 +04:00
util_delete_path ( event - > udev , filename_failed ) ;
util_create_path ( event - > udev , filename ) ;
2008-10-16 19:16:58 +04:00
udev_selinux_setfscreatecon ( event - > udev , filename , S_IFLNK ) ;
symlink ( udev_device_get_devpath ( event - > dev ) , filename ) ;
udev_selinux_resetfscreatecon ( event - > udev ) ;
2007-09-20 02:41:54 +04:00
break ;
2005-11-16 06:12:53 +03:00
case EVENT_FINISHED :
2008-10-16 19:16:58 +04:00
if ( udev_device_get_devpath_old ( event - > dev ) ! = NULL ) {
2007-08-26 07:22:35 +04:00
/* "move" event - rename failed file to current name, do not delete failed */
2008-09-10 23:50:21 +04:00
char filename_failed_old [ UTIL_PATH_SIZE ] ;
2007-08-26 07:22:35 +04:00
2008-10-16 19:16:58 +04:00
util_strlcpy ( filename_failed_old , udev_get_dev_path ( event - > udev ) , sizeof ( filename_failed_old ) ) ;
2008-09-10 20:59:42 +04:00
util_strlcat ( filename_failed_old , " / " , sizeof ( filename_failed_old ) ) ;
start = util_strlcat ( filename_failed_old , " .udev/failed/ " , sizeof ( filename_failed_old ) ) ;
2008-10-16 19:16:58 +04:00
util_strlcat ( filename_failed_old , udev_device_get_devpath_old ( event - > dev ) , sizeof ( filename_failed_old ) ) ;
2008-09-10 20:39:23 +04:00
util_path_encode ( & filename_failed_old [ start ] , sizeof ( filename ) - start ) ;
2007-08-26 07:22:35 +04:00
if ( rename ( filename_failed_old , filename_failed ) = = 0 )
2008-10-16 19:16:58 +04:00
info ( event - > udev , " renamed devpath, moved failed state of '%s' to %s' \n " ,
udev_device_get_devpath_old ( event - > dev ) , udev_device_get_devpath ( event - > dev ) ) ;
2007-08-26 07:22:35 +04:00
} else {
2008-10-18 16:39:04 +04:00
if ( unlink ( filename_failed ) = = 0 )
2008-10-18 22:12:55 +04:00
util_delete_path ( event - > udev , filename_failed ) ;
2007-08-26 07:22:35 +04:00
}
2005-11-16 06:12:53 +03:00
2007-09-20 02:41:54 +04:00
unlink ( filename ) ;
2008-10-18 16:39:04 +04:00
/* clean up possibly empty queue directory */
2008-10-29 19:32:13 +03:00
if ( udev_list_is_empty ( & event_list ) )
2008-10-18 22:12:55 +04:00
util_delete_path ( event - > udev , filename ) ;
2007-09-20 02:41:54 +04:00
break ;
case EVENT_FAILED :
2007-08-26 07:22:35 +04:00
/* move failed event to the failed directory */
2008-10-18 22:12:55 +04:00
util_create_path ( event - > udev , filename_failed ) ;
2007-09-20 02:41:54 +04:00
rename ( filename , filename_failed ) ;
2005-11-22 17:49:49 +03:00
2007-08-26 07:22:35 +04:00
/* clean up possibly empty queue directory */
2008-10-29 19:32:13 +03:00
if ( udev_list_is_empty ( & event_list ) )
2008-10-18 22:12:55 +04:00
util_delete_path ( event - > udev , filename ) ;
2007-09-20 02:41:54 +04:00
break ;
2005-11-16 06:12:53 +03:00
}
2007-09-20 02:41:54 +04:00
return ;
2005-11-16 06:12:53 +03:00
}
2008-10-16 19:16:58 +04:00
static void event_queue_delete ( struct udev_event * event )
2005-11-07 16:10:09 +03:00
{
2008-10-17 20:59:27 +04:00
udev_list_node_remove ( & event - > node ) ;
2005-11-16 06:12:53 +03:00
2007-08-26 07:22:35 +04:00
/* mark as failed, if "add" event returns non-zero */
2008-10-16 19:16:58 +04:00
if ( event - > exitstatus & & strcmp ( udev_device_get_action ( event - > dev ) , " add " ) = = 0 )
export_event_state ( event , EVENT_FAILED ) ;
2005-11-16 06:12:53 +03:00
else
2008-10-16 19:16:58 +04:00
export_event_state ( event , EVENT_FINISHED ) ;
udev_device_unref ( event - > dev ) ;
udev_event_unref ( event ) ;
}
2005-11-16 06:12:53 +03:00
2008-10-16 19:16:58 +04:00
static void asmlinkage event_sig_handler ( int signum )
{
if ( signum = = SIGALRM )
exit ( 1 ) ;
2005-11-07 16:10:09 +03:00
}
2008-10-16 19:16:58 +04:00
static void event_fork ( struct udev_event * event )
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
{
2004-01-23 15:01:09 +03:00
pid_t pid ;
2008-10-16 19:16:58 +04:00
struct sigaction act ;
int err ;
2004-01-23 15:01:09 +03:00
2008-10-29 19:32:13 +03:00
if ( debug_trace ) {
event - > trace = 1 ;
2008-10-31 18:22:55 +03:00
fprintf ( stderr , " fork %s (%llu) \n " ,
2008-10-29 19:32:13 +03:00
udev_device_get_syspath ( event - > dev ) ,
udev_device_get_seqnum ( event - > dev ) ) ;
}
2004-01-23 15:01:09 +03:00
pid = fork ( ) ;
switch ( pid ) {
case 0 :
[PATCH] udev - next round of udev event order daemon
Here is the next round of udevd/udevsend:
udevsend - If the IPC message we send is not catched by a receiver we fork
the udevd daemon to process this and the following events
udevd - We reorder the events we receive and execute our current udev for
every event. If one or more events are missing, we wait
10 seconds and then go ahead in the queue.
If the queue is empty and we don't receive any event for the next
30 seconds, the daemon exits.
The next incoming event will fork the daemon again.
config - The path's to the executable are specified in udevd.h
Now they are pointing to the current directory only.
I don't like daemons hiding secrets (and mem leaks :)) inside,
so I want to try this model. It should be enough logic to get all possible
hotplug events executed in the right order.
If no event, then no daemon! So everybody should be happy :)
Here we see:
1. the daemon fork,
2. the udev work,
3. the 10 sec timeout and the skipped events,
4. the udev work,
...,
5. and the 30 sec timeout and exit.
EVENTS:
pim:/home/kay/src/udev.kay# test/udevd_test.sh
pim:/home/kay/src/udev.kay# SEQNUM=15 ./udevsend block
pim:/home/kay/src/udev.kay# SEQNUM=16 ./udevsend block
pim:/home/kay/src/udev.kay# SEQNUM=17 ./udevsend block
pim:/home/kay/src/udev.kay# SEQNUM=18 ./udevsend block
pim:/home/kay/src/udev.kay# SEQNUM=20 ./udevsend block
pim:/home/kay/src/udev.kay# SEQNUM=21 ./udevsend block
LOG:
Jan 23 15:35:35 pim udev[11795]: message is still in the ipc queue, starting daemon...
Jan 23 15:35:35 pim udev[11799]: configured rule in '/etc/udev/udev.rules' at line 19 applied, 'sda' becomes '%k-flash'
Jan 23 15:35:35 pim udev[11799]: creating device node '/udev/sda-flash'
Jan 23 15:35:35 pim udev[11800]: creating device node '/udev/sdb'
Jan 23 15:35:35 pim udev[11804]: creating device node '/udev/sdc'
Jan 23 15:35:35 pim udev[11805]: removing device node '/udev/sda-flash'
Jan 23 15:35:35 pim udev[11808]: removing device node '/udev/sdb'
Jan 23 15:35:35 pim udev[11809]: removing device node '/udev/sdc'
Jan 23 15:35:45 pim udev[11797]: timeout reached, skip events 7 - 7
Jan 23 15:35:45 pim udev[11811]: creating device node '/udev/sdb'
Jan 23 15:35:45 pim udev[11812]: creating device node '/udev/sdc'
Jan 23 15:36:01 pim udev[11797]: timeout reached, skip events 10 - 14
Jan 23 15:36:01 pim udev[11814]: creating device node '/udev/sdc'
Jan 23 15:36:04 pim udev[11816]: creating device node '/udev/sdc'
Jan 23 15:36:12 pim udev[11818]: creating device node '/udev/sdc'
Jan 23 15:36:16 pim udev[11820]: creating device node '/udev/sdc'
Jan 23 15:36:38 pim udev[11797]: timeout reached, skip events 19 - 19
Jan 23 15:36:38 pim udev[11823]: creating device node '/udev/sdc'
Jan 23 15:36:38 pim udev[11824]: creating device node '/udev/sdc'
Jan 23 15:37:08 pim udev[11797]: we have nothing to do, so daemon exits...
2004-01-24 08:25:17 +03:00
/* child */
2008-09-08 19:59:00 +04:00
udev_ctrl_unref ( udev_ctrl ) ;
2004-11-23 05:30:13 +03:00
logging_close ( ) ;
2005-10-27 23:04:38 +04:00
logging_init ( " udevd-event " ) ;
2005-01-17 02:53:08 +03:00
setpriority ( PRIO_PROCESS , 0 , UDEV_PRIORITY ) ;
2006-07-25 16:45:09 +04:00
2008-10-16 19:16:58 +04:00
/* set signal handlers */
memset ( & act , 0x00 , sizeof ( act ) ) ;
act . sa_handler = ( void ( * ) ( int ) ) event_sig_handler ;
sigemptyset ( & act . sa_mask ) ;
act . sa_flags = 0 ;
sigaction ( SIGALRM , & act , NULL ) ;
/* reset to default */
act . sa_handler = SIG_DFL ;
sigaction ( SIGINT , & act , NULL ) ;
sigaction ( SIGTERM , & act , NULL ) ;
sigaction ( SIGCHLD , & act , NULL ) ;
sigaction ( SIGHUP , & act , NULL ) ;
/* set timeout to prevent hanging processes */
alarm ( UDEV_EVENT_TIMEOUT ) ;
/* apply rules, create node, symlinks */
2008-10-18 17:46:55 +04:00
err = udev_event_execute_rules ( event , rules ) ;
2008-10-16 19:16:58 +04:00
/* rules may change/disable the timeout */
if ( udev_device_get_event_timeout ( event - > dev ) > = 0 )
alarm ( udev_device_get_event_timeout ( event - > dev ) ) ;
/* execute RUN= */
if ( err = = 0 & & ! event - > ignore_device & & udev_get_run ( event - > udev ) )
2008-10-18 17:50:16 +04:00
udev_event_execute_run ( event ) ;
2008-10-29 19:32:13 +03:00
2009-02-23 20:17:20 +03:00
/* apply/restore inotify watch */
2009-02-24 17:11:17 +03:00
if ( err = = 0 & & event - > inotify_watch ) {
2009-02-23 20:17:20 +03:00
udev_watch_begin ( event - > udev , event - > dev ) ;
2009-02-24 17:11:17 +03:00
udev_device_update_db ( event - > dev ) ;
}
2009-02-23 20:17:20 +03:00
2009-03-29 06:24:39 +04:00
/* send processed event back to the kernel netlink socket */
udev_monitor_send_device ( kernel_monitor , event - > dev ) ;
2008-10-17 18:49:27 +04:00
info ( event - > udev , " seq %llu exit with %i \n " , udev_device_get_seqnum ( event - > dev ) , err ) ;
2005-10-27 23:04:38 +04:00
logging_close ( ) ;
2008-10-16 19:16:58 +04:00
if ( err ! = 0 )
2005-11-16 04:06:46 +03:00
exit ( 1 ) ;
2005-10-27 23:04:38 +04:00
exit ( 0 ) ;
2004-01-23 15:01:09 +03:00
case - 1 :
2008-10-16 19:16:58 +04:00
err ( event - > udev , " fork of child failed: %m \n " ) ;
event_queue_delete ( event ) ;
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote:
>
> Kay, you said "unless we can get rid of _all_ the threads or at least
> getting faster, I don't want to change it."
>
> Well how about we get rid of all the threads, *and* we get faster?
Yes, we are twice as fast now on my box :)
> This patch applies to current bk trees, and does the following:
>
> 1) Switch to DGRAM sockets rather than STREAM. This simplifies things
> as mentioned in the previous message.
>
> 2) Invalid sequence numbers are mapped to -1 rather than zero, since
> zero is a valid sequence number (I think). Also, this allows for real
> speed tests using scripts starting at a zero sequence number, since that
> is what the initial expected sequence number is.
>
> 3) Get rid of all threading. This is the biggie. Some highlights:
> a) timeout using setitimer() and SIGALRM
> b) async child death notification via SIGCHLD
> c) these two signal handlers do nothing but raise volatile flags,
> all the
> work is done in the main loop
> d) locking no longer required
I cleaned up the rest of the comments, the whitespace and a few names to match
the whole thing. Please recheck it. Test script is switched to work on subsystem
'test' to let udev ignore it.
2004-02-07 09:21:15 +03:00
break ;
2004-01-23 15:01:09 +03:00
default :
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote:
>
> Kay, you said "unless we can get rid of _all_ the threads or at least
> getting faster, I don't want to change it."
>
> Well how about we get rid of all the threads, *and* we get faster?
Yes, we are twice as fast now on my box :)
> This patch applies to current bk trees, and does the following:
>
> 1) Switch to DGRAM sockets rather than STREAM. This simplifies things
> as mentioned in the previous message.
>
> 2) Invalid sequence numbers are mapped to -1 rather than zero, since
> zero is a valid sequence number (I think). Also, this allows for real
> speed tests using scripts starting at a zero sequence number, since that
> is what the initial expected sequence number is.
>
> 3) Get rid of all threading. This is the biggie. Some highlights:
> a) timeout using setitimer() and SIGALRM
> b) async child death notification via SIGCHLD
> c) these two signal handlers do nothing but raise volatile flags,
> all the
> work is done in the main loop
> d) locking no longer required
I cleaned up the rest of the comments, the whitespace and a few names to match
the whole thing. Please recheck it. Test script is switched to work on subsystem
'test' to let udev ignore it.
2004-02-07 09:21:15 +03:00
/* get SIGCHLD in main loop */
2008-10-16 19:16:58 +04:00
info ( event - > udev , " seq %llu forked, pid [%d], '%s' '%s', %ld seconds old \n " ,
udev_device_get_seqnum ( event - > dev ) ,
pid ,
udev_device_get_action ( event - > dev ) ,
udev_device_get_subsystem ( event - > dev ) ,
time ( NULL ) - event - > queue_time ) ;
event - > pid = pid ;
2008-10-29 19:32:13 +03:00
childs + + ;
2004-01-23 15:01:09 +03:00
}
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
}
2008-10-16 19:16:58 +04:00
static void event_queue_insert ( struct udev_event * event )
2005-11-07 16:10:09 +03:00
{
2008-09-10 23:50:21 +04:00
char filename [ UTIL_PATH_SIZE ] ;
2006-04-05 02:08:10 +04:00
int fd ;
2008-10-16 19:16:58 +04:00
event - > queue_time = time ( NULL ) ;
2006-04-05 02:08:10 +04:00
2008-10-16 19:16:58 +04:00
export_event_state ( event , EVENT_QUEUED ) ;
2008-10-17 18:49:27 +04:00
info ( event - > udev , " seq %llu queued, '%s' '%s' \n " , udev_device_get_seqnum ( event - > dev ) ,
udev_device_get_action ( event - > dev ) , udev_device_get_subsystem ( event - > dev ) ) ;
2008-05-30 11:43:58 +04:00
2008-10-16 19:16:58 +04:00
util_strlcpy ( filename , udev_get_dev_path ( event - > udev ) , sizeof ( filename ) ) ;
2008-09-10 20:59:42 +04:00
util_strlcat ( filename , " /.udev/uevent_seqnum " , sizeof ( filename ) ) ;
2006-04-05 02:08:10 +04:00
fd = open ( filename , O_WRONLY | O_TRUNC | O_CREAT , 0644 ) ;
2006-04-25 20:50:56 +04:00
if ( fd > = 0 ) {
2006-04-05 02:08:10 +04:00
char str [ 32 ] ;
int len ;
2008-10-16 19:16:58 +04:00
len = sprintf ( str , " %llu \n " , udev_device_get_seqnum ( event - > dev ) ) ;
2006-04-05 02:08:10 +04:00
write ( fd , str , len ) ;
close ( fd ) ;
}
2005-11-07 16:10:09 +03:00
2008-10-29 19:32:13 +03:00
udev_list_node_append ( & event - > node , & event_list ) ;
run_exec_q = 1 ;
2006-09-08 13:30:00 +04:00
2005-11-07 16:10:09 +03:00
/* run all events with a timeout set immediately */
2008-10-16 19:16:58 +04:00
if ( udev_device_get_timeout ( event - > dev ) > 0 ) {
event_fork ( event ) ;
2005-11-07 16:10:09 +03:00
return ;
}
}
2006-08-10 14:50:53 +04:00
static int mem_size_mb ( void )
{
2009-04-17 00:34:26 +04:00
FILE * f ;
2007-05-04 01:21:11 +04:00
char buf [ 4096 ] ;
long int memsize = - 1 ;
2006-08-10 14:50:53 +04:00
2007-05-04 01:21:11 +04:00
f = fopen ( " /proc/meminfo " , " r " ) ;
if ( f = = NULL )
2006-08-10 14:50:53 +04:00
return - 1 ;
2007-05-04 01:21:11 +04:00
while ( fgets ( buf , sizeof ( buf ) , f ) ! = NULL ) {
long int value ;
2006-08-10 14:50:53 +04:00
2007-05-04 01:21:11 +04:00
if ( sscanf ( buf , " MemTotal: %ld kB " , & value ) = = 1 ) {
memsize = value / 1024 ;
break ;
}
}
2006-08-10 14:50:53 +04:00
2007-05-11 18:53:56 +04:00
fclose ( f ) ;
2007-05-04 01:21:11 +04:00
return memsize ;
2006-08-10 14:50:53 +04:00
}
2005-01-05 07:35:24 +03:00
static int compare_devpath ( const char * running , const char * waiting )
{
2008-10-25 20:01:21 +04:00
int i = 0 ;
2005-01-05 07:35:24 +03:00
2008-10-29 19:32:13 +03:00
while ( running [ i ] ! = ' \0 ' & & running [ i ] = = waiting [ i ] )
2008-10-25 20:01:21 +04:00
i + + ;
2005-01-05 07:35:24 +03:00
2008-10-25 20:01:21 +04:00
/* identical device event found */
if ( running [ i ] = = ' \0 ' & & waiting [ i ] = = ' \0 ' )
return 1 ;
2005-01-05 07:35:24 +03:00
2008-10-25 20:01:21 +04:00
/* parent device event found */
if ( running [ i ] = = ' \0 ' & & waiting [ i ] = = ' / ' )
return 2 ;
2005-01-05 07:35:24 +03:00
2008-10-25 20:01:21 +04:00
/* child device event found */
if ( running [ i ] = = ' / ' & & waiting [ i ] = = ' \0 ' )
return 3 ;
2005-01-05 07:35:24 +03:00
2008-10-25 20:01:21 +04:00
/* no matching event */
2005-01-05 07:35:24 +03:00
return 0 ;
}
2007-04-20 00:21:05 +04:00
/* lookup event for identical, parent, child, or physical device */
2008-10-29 19:32:13 +03:00
static int devpath_busy ( struct udev_event * event )
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
{
2008-10-17 20:59:27 +04:00
struct udev_list_node * loop ;
2005-01-05 07:35:24 +03:00
2008-10-29 19:32:13 +03:00
if ( event - > delaying_seqnum > 0 ) {
}
/* check if queue contains events we depend on */
udev_list_node_foreach ( loop , & event_list ) {
2008-10-17 20:59:27 +04:00
struct udev_event * loop_event = node_to_event ( loop ) ;
2008-10-29 19:32:13 +03:00
/* we already found a later event, earlier can not block us, no need to check again */
if ( udev_device_get_seqnum ( loop_event - > dev ) < event - > delaying_seqnum )
continue ;
/* event we checked earlier still exists, no need to check again */
if ( udev_device_get_seqnum ( loop_event - > dev ) = = event - > delaying_seqnum )
return 2 ;
/* found ourself, no later event can block us */
2008-10-16 19:16:58 +04:00
if ( udev_device_get_seqnum ( loop_event - > dev ) > = udev_device_get_seqnum ( event - > dev ) )
2007-04-20 00:21:05 +04:00
break ;
2007-08-26 07:22:35 +04:00
/* check our old name */
2008-10-16 19:16:58 +04:00
if ( udev_device_get_devpath_old ( event - > dev ) ! = NULL )
2008-10-29 19:32:13 +03:00
if ( strcmp ( udev_device_get_devpath ( loop_event - > dev ) , udev_device_get_devpath_old ( event - > dev ) ) = = 0 ) {
event - > delaying_seqnum = udev_device_get_seqnum ( loop_event - > dev ) ;
return 3 ;
}
2007-08-26 07:22:35 +04:00
2007-04-20 00:21:05 +04:00
/* check identical, parent, or child device event */
2008-10-16 19:16:58 +04:00
if ( compare_devpath ( udev_device_get_devpath ( loop_event - > dev ) , udev_device_get_devpath ( event - > dev ) ) ! = 0 ) {
dbg ( event - > udev , " %llu, device event still pending %llu (%s) \n " ,
udev_device_get_seqnum ( event - > dev ) ,
udev_device_get_seqnum ( loop_event - > dev ) ,
udev_device_get_devpath ( loop_event - > dev ) ) ;
2008-10-29 19:32:13 +03:00
event - > delaying_seqnum = udev_device_get_seqnum ( loop_event - > dev ) ;
2008-04-02 06:32:17 +04:00
return 4 ;
}
/* check for our major:minor number */
2008-10-16 19:16:58 +04:00
if ( major ( udev_device_get_devnum ( event - > dev ) ) > 0 & &
udev_device_get_devnum ( loop_event - > dev ) = = udev_device_get_devnum ( event - > dev ) & &
strcmp ( udev_device_get_subsystem ( event - > dev ) , udev_device_get_subsystem ( loop_event - > dev ) ) = = 0 ) {
dbg ( event - > udev , " %llu, device event still pending %llu (%d:%d) \n " ,
udev_device_get_seqnum ( event - > dev ) ,
udev_device_get_seqnum ( loop_event - > dev ) ,
major ( udev_device_get_devnum ( loop_event - > dev ) ) , minor ( udev_device_get_devnum ( loop_event - > dev ) ) ) ;
2008-10-29 19:32:13 +03:00
event - > delaying_seqnum = udev_device_get_seqnum ( loop_event - > dev ) ;
return 5 ;
2008-04-02 06:32:17 +04:00
}
2007-04-20 00:21:05 +04:00
/* check physical device event (special case of parent) */
2008-10-16 19:16:58 +04:00
if ( udev_device_get_physdevpath ( event - > dev ) ! = NULL & &
strcmp ( udev_device_get_action ( event - > dev ) , " add " ) = = 0 )
if ( compare_devpath ( udev_device_get_devpath ( loop_event - > dev ) ,
udev_device_get_physdevpath ( event - > dev ) ) ! = 0 ) {
dbg ( event - > udev , " %llu, physical device event still pending %llu (%s) \n " ,
udev_device_get_seqnum ( event - > dev ) ,
udev_device_get_seqnum ( loop_event - > dev ) ,
udev_device_get_devpath ( loop_event - > dev ) ) ;
2008-10-29 19:32:13 +03:00
event - > delaying_seqnum = udev_device_get_seqnum ( loop_event - > dev ) ;
return 6 ;
2005-06-05 06:53:17 +04:00
}
2004-11-19 05:49:13 +03:00
}
2005-06-05 06:53:17 +04:00
return 0 ;
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
}
2007-04-20 00:21:05 +04:00
/* serializes events for the identical and parent and child devices */
2008-10-16 19:16:58 +04:00
static void event_queue_manager ( struct udev * udev )
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
{
2008-10-17 20:59:27 +04:00
struct udev_list_node * loop ;
struct udev_list_node * tmp ;
2005-01-17 02:53:08 +03:00
2009-01-21 13:17:11 +03:00
start_over :
2008-10-29 19:32:13 +03:00
if ( udev_list_is_empty ( & event_list ) ) {
if ( childs > 0 ) {
err ( udev , " event list empty, but childs count is %i " , childs ) ;
childs = 0 ;
}
2005-06-16 03:58:47 +04:00
return ;
2008-10-29 19:32:13 +03:00
}
2005-06-16 03:58:47 +04:00
2008-10-29 19:32:13 +03:00
udev_list_node_foreach_safe ( loop , tmp , & event_list ) {
2008-10-17 20:59:27 +04:00
struct udev_event * loop_event = node_to_event ( loop ) ;
2008-10-29 19:32:13 +03:00
if ( childs > = max_childs ) {
info ( udev , " maximum number (%i) of childs reached \n " , childs ) ;
break ;
}
if ( loop_event - > pid ! = 0 )
continue ;
/* do not start event if parent or child event is still running */
if ( devpath_busy ( loop_event ) ! = 0 ) {
2008-10-16 19:16:58 +04:00
dbg ( udev , " delay seq %llu (%s) \n " ,
udev_device_get_seqnum ( loop_event - > dev ) ,
udev_device_get_devpath ( loop_event - > dev ) ) ;
2005-11-07 16:10:09 +03:00
continue ;
}
2008-10-16 19:16:58 +04:00
event_fork ( loop_event ) ;
dbg ( udev , " moved seq %llu to running list \n " , udev_device_get_seqnum ( loop_event - > dev ) ) ;
2009-01-21 13:17:11 +03:00
/* retry if events finished in the meantime */
if ( sigchilds_waiting ) {
sigchilds_waiting = 0 ;
reap_sigchilds ( ) ;
goto start_over ;
}
2005-11-16 02:13:28 +03:00
}
2005-06-05 06:38:10 +04:00
}
2005-06-05 06:41:09 +04:00
/* receive the udevd message from userspace */
2008-09-08 19:59:00 +04:00
static void handle_ctrl_msg ( struct udev_ctrl * uctrl )
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
{
2008-09-08 19:59:00 +04:00
struct udev * udev = udev_ctrl_get_udev ( uctrl ) ;
struct udev_ctrl_msg * ctrl_msg ;
const char * str ;
int i ;
2004-02-12 12:23:59 +03:00
2008-09-08 19:59:00 +04:00
ctrl_msg = udev_ctrl_receive_msg ( uctrl ) ;
if ( ctrl_msg = = NULL )
2006-07-25 16:45:09 +04:00
return ;
2004-11-06 16:30:15 +03:00
2008-09-08 19:59:00 +04:00
i = udev_ctrl_get_set_log_level ( ctrl_msg ) ;
if ( i > = 0 ) {
info ( udev , " udevd message (SET_LOG_PRIORITY) received, log_priority=%i \n " , i ) ;
udev_set_log_priority ( udev , i ) ;
2004-02-12 09:32:11 +03:00
}
2008-09-08 19:59:00 +04:00
if ( udev_ctrl_get_stop_exec_queue ( ctrl_msg ) > 0 ) {
2008-09-06 17:45:31 +04:00
info ( udev , " udevd message (STOP_EXEC_QUEUE) received \n " ) ;
2005-06-05 06:41:09 +04:00
stop_exec_q = 1 ;
2008-09-08 19:59:00 +04:00
}
if ( udev_ctrl_get_start_exec_queue ( ctrl_msg ) > 0 ) {
2008-09-06 17:45:31 +04:00
info ( udev , " udevd message (START_EXEC_QUEUE) received \n " ) ;
2005-06-05 06:41:09 +04:00
stop_exec_q = 0 ;
2008-10-16 19:16:58 +04:00
event_queue_manager ( udev ) ;
2008-09-08 19:59:00 +04:00
}
if ( udev_ctrl_get_reload_rules ( ctrl_msg ) > 0 ) {
2008-09-06 17:45:31 +04:00
info ( udev , " udevd message (RELOAD_RULES) received \n " ) ;
2005-10-27 23:04:38 +04:00
reload_config = 1 ;
2005-06-05 06:41:09 +04:00
}
2008-09-08 19:59:00 +04:00
str = udev_ctrl_get_set_env ( ctrl_msg ) ;
if ( str ! = NULL ) {
2008-10-16 19:16:58 +04:00
char * key ;
key = strdup ( str ) ;
if ( key ! = NULL ) {
char * val ;
val = strchr ( key , ' = ' ) ;
if ( val ! = NULL ) {
val [ 0 ] = ' \0 ' ;
val = & val [ 1 ] ;
if ( val [ 0 ] = = ' \0 ' ) {
info ( udev , " udevd message (ENV) received, unset '%s' \n " , key ) ;
udev_add_property ( udev , key , NULL ) ;
} else {
info ( udev , " udevd message (ENV) received, set '%s=%s' \n " , key , val ) ;
udev_add_property ( udev , key , val ) ;
}
2008-09-08 19:59:00 +04:00
} else {
2008-10-16 19:16:58 +04:00
err ( udev , " wrong key format '%s' \n " , key ) ;
2008-09-08 19:59:00 +04:00
}
2008-10-16 19:16:58 +04:00
free ( key ) ;
2008-09-08 19:59:00 +04:00
}
}
i = udev_ctrl_get_set_max_childs ( ctrl_msg ) ;
if ( i > = 0 ) {
info ( udev , " udevd message (SET_MAX_CHILDS) received, max_childs=%i \n " , i ) ;
max_childs = i ;
}
2009-03-10 16:00:16 +03:00
settle_pid = udev_ctrl_get_settle ( ctrl_msg ) ;
if ( settle_pid > 0 ) {
info ( udev , " udevd message (SETTLE) received \n " ) ;
}
2008-09-08 19:59:00 +04:00
udev_ctrl_msg_unref ( ctrl_msg ) ;
2005-06-05 06:38:10 +04:00
}
2004-11-06 16:30:15 +03:00
2009-02-11 20:38:56 +03:00
/* read inotify messages */
static int handle_inotify ( struct udev * udev )
{
int nbytes , pos ;
char * buf ;
struct inotify_event * ev ;
if ( ( ioctl ( inotify_fd , FIONREAD , & nbytes ) < 0 ) | | ( nbytes < = 0 ) )
return 0 ;
buf = malloc ( nbytes ) ;
if ( buf = = NULL ) {
err ( udev , " error getting buffer for inotify, disable watching \n " ) ;
close ( inotify_fd ) ;
inotify_fd = - 1 ;
return 0 ;
}
read ( inotify_fd , buf , nbytes ) ;
2009-02-23 21:33:49 +03:00
for ( pos = 0 ; pos < nbytes ; pos + = sizeof ( struct inotify_event ) + ev - > len ) {
2009-02-23 20:43:53 +03:00
struct udev_device * dev ;
2009-02-11 20:38:56 +03:00
2009-02-23 21:33:49 +03:00
ev = ( struct inotify_event * ) ( buf + pos ) ;
2009-02-23 20:59:01 +03:00
if ( ev - > len ) {
dbg ( udev , " inotify event: %x for %s \n " , ev - > mask , ev - > name ) ;
reload_config = 1 ;
continue ;
}
2009-02-23 20:43:53 +03:00
dev = udev_watch_lookup ( udev , ev - > wd ) ;
if ( dev ! = NULL ) {
dbg ( udev , " inotify event: %x for %s \n " , ev - > mask , udev_device_get_devnode ( dev ) ) ;
2009-02-11 20:38:56 +03:00
if ( ev - > mask & IN_CLOSE_WRITE ) {
char filename [ UTIL_PATH_SIZE ] ;
int fd ;
2009-02-23 20:43:53 +03:00
info ( udev , " device %s closed, synthesising 'change' \n " , udev_device_get_devnode ( dev ) ) ;
util_strlcpy ( filename , udev_device_get_syspath ( dev ) , sizeof ( filename ) ) ;
2009-02-11 20:38:56 +03:00
util_strlcat ( filename , " /uevent " , sizeof ( filename ) ) ;
fd = open ( filename , O_WRONLY ) ;
if ( fd < 0 | | write ( fd , " change " , 6 ) < 0 )
info ( udev , " error writing uevent: %m \n " ) ;
close ( fd ) ;
}
if ( ev - > mask & IN_IGNORED )
2009-02-23 20:43:53 +03:00
udev_watch_end ( udev , dev ) ;
udev_device_unref ( dev ) ;
2009-02-11 20:38:56 +03:00
}
2009-02-23 20:59:01 +03:00
2009-02-11 20:38:56 +03:00
}
free ( buf ) ;
2009-02-11 23:56:35 +03:00
return 0 ;
2009-02-11 20:38:56 +03:00
}
2004-10-14 09:38:15 +04:00
static void asmlinkage sig_handler ( int signum )
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
{
[PATCH] udevd - cleanup and better timeout handling
On Thu, Jan 29, 2004 at 04:55:11PM +0100, Kay Sievers wrote:
> On Thu, Jan 29, 2004 at 02:56:25AM +0100, Kay Sievers wrote:
> > On Wed, Jan 28, 2004 at 10:47:36PM +0100, Kay Sievers wrote:
> > > Oh, couldn't resist to try threads.
> > > It's a multithreaded udevd that communicates through a localhost socket.
> > > The message includes a magic with the udev version, so we don't accept
> > > older udevsend's.
> > >
> > > No need for locking, cause we can't bind two sockets on the same address.
> > > The daemon tries to connect and if it fails it starts the daemon.
> > >
> > > We create a thread for every incoming connection, handle over the socket,
> > > sort the messages in the global message queue and exit the thread.
> > > Huh, that was easy with threads :)
> > >
> > > With the addition of a message we wakeup the queue manager thread and
> > > handle timeouts or move the message to the global exec list. This wakes
> > > up the exec list manager who looks if a process is already running for this
> > > device path.
> > > If yes, the exec is delayed otherwise we create a thread that execs udev.
> > > n the background. With the return of udev we free the message and wakeup
> > > the exec list manager to look if something is pending.
> > >
> > > It is just a quick shot, cause I couldn't solve the problems with fork an
> > > scheduling and I wanted to see if I'm to stupid :)
> > > But if anybody with a better idea or more experience with I/O scheduling
> > > we may go another way. The remaining problem is that klibc doesn't support
> > > threads.
> > >
> > > By now, we don't exec anything, it's just a sleep 3 for every exec,
> > > but you can see the queue management by watching syslog and do:
> > >
> > > DEVPATH=/abc ACTION=add SEQNUM=0 ./udevsend /abc
>
> Next version, switched to unix domain sockets.
Next cleaned up version. Hey, nobody wants to try it :)
Works for me, It's funny if I connect/disconnect my 4in1-usb-flash-reader
every two seconds. The 2.6 usb rocks! I can connect/diconnect a hub with 3
devices plugged in every second and don't run into any problem but a _very_
big udevd queue.
2004-02-01 20:12:36 +03:00
switch ( signum ) {
case SIGINT :
case SIGTERM :
2005-08-08 07:07:36 +04:00
udev_exit = 1 ;
[PATCH] udevd - cleanup and better timeout handling
On Thu, Jan 29, 2004 at 04:55:11PM +0100, Kay Sievers wrote:
> On Thu, Jan 29, 2004 at 02:56:25AM +0100, Kay Sievers wrote:
> > On Wed, Jan 28, 2004 at 10:47:36PM +0100, Kay Sievers wrote:
> > > Oh, couldn't resist to try threads.
> > > It's a multithreaded udevd that communicates through a localhost socket.
> > > The message includes a magic with the udev version, so we don't accept
> > > older udevsend's.
> > >
> > > No need for locking, cause we can't bind two sockets on the same address.
> > > The daemon tries to connect and if it fails it starts the daemon.
> > >
> > > We create a thread for every incoming connection, handle over the socket,
> > > sort the messages in the global message queue and exit the thread.
> > > Huh, that was easy with threads :)
> > >
> > > With the addition of a message we wakeup the queue manager thread and
> > > handle timeouts or move the message to the global exec list. This wakes
> > > up the exec list manager who looks if a process is already running for this
> > > device path.
> > > If yes, the exec is delayed otherwise we create a thread that execs udev.
> > > n the background. With the return of udev we free the message and wakeup
> > > the exec list manager to look if something is pending.
> > >
> > > It is just a quick shot, cause I couldn't solve the problems with fork an
> > > scheduling and I wanted to see if I'm to stupid :)
> > > But if anybody with a better idea or more experience with I/O scheduling
> > > we may go another way. The remaining problem is that klibc doesn't support
> > > threads.
> > >
> > > By now, we don't exec anything, it's just a sleep 3 for every exec,
> > > but you can see the queue management by watching syslog and do:
> > >
> > > DEVPATH=/abc ACTION=add SEQNUM=0 ./udevsend /abc
>
> Next version, switched to unix domain sockets.
Next cleaned up version. Hey, nobody wants to try it :)
Works for me, It's funny if I connect/disconnect my 4in1-usb-flash-reader
every two seconds. The 2.6 usb rocks! I can connect/diconnect a hub with 3
devices plugged in every second and don't run into any problem but a _very_
big udevd queue.
2004-02-01 20:12:36 +03:00
break ;
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote:
>
> Kay, you said "unless we can get rid of _all_ the threads or at least
> getting faster, I don't want to change it."
>
> Well how about we get rid of all the threads, *and* we get faster?
Yes, we are twice as fast now on my box :)
> This patch applies to current bk trees, and does the following:
>
> 1) Switch to DGRAM sockets rather than STREAM. This simplifies things
> as mentioned in the previous message.
>
> 2) Invalid sequence numbers are mapped to -1 rather than zero, since
> zero is a valid sequence number (I think). Also, this allows for real
> speed tests using scripts starting at a zero sequence number, since that
> is what the initial expected sequence number is.
>
> 3) Get rid of all threading. This is the biggie. Some highlights:
> a) timeout using setitimer() and SIGALRM
> b) async child death notification via SIGCHLD
> c) these two signal handlers do nothing but raise volatile flags,
> all the
> work is done in the main loop
> d) locking no longer required
I cleaned up the rest of the comments, the whitespace and a few names to match
the whole thing. Please recheck it. Test script is switched to work on subsystem
'test' to let udev ignore it.
2004-02-07 09:21:15 +03:00
case SIGCHLD :
2004-04-01 11:03:07 +04:00
/* set flag, then write to pipe if needed */
2004-10-19 15:37:30 +04:00
sigchilds_waiting = 1 ;
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote:
>
> Kay, you said "unless we can get rid of _all_ the threads or at least
> getting faster, I don't want to change it."
>
> Well how about we get rid of all the threads, *and* we get faster?
Yes, we are twice as fast now on my box :)
> This patch applies to current bk trees, and does the following:
>
> 1) Switch to DGRAM sockets rather than STREAM. This simplifies things
> as mentioned in the previous message.
>
> 2) Invalid sequence numbers are mapped to -1 rather than zero, since
> zero is a valid sequence number (I think). Also, this allows for real
> speed tests using scripts starting at a zero sequence number, since that
> is what the initial expected sequence number is.
>
> 3) Get rid of all threading. This is the biggie. Some highlights:
> a) timeout using setitimer() and SIGALRM
> b) async child death notification via SIGCHLD
> c) these two signal handlers do nothing but raise volatile flags,
> all the
> work is done in the main loop
> d) locking no longer required
I cleaned up the rest of the comments, the whitespace and a few names to match
the whole thing. Please recheck it. Test script is switched to work on subsystem
'test' to let udev ignore it.
2004-02-07 09:21:15 +03:00
break ;
2005-10-27 23:04:38 +04:00
case SIGHUP :
reload_config = 1 ;
break ;
2004-04-01 11:03:07 +04:00
}
2004-11-05 15:16:32 +03:00
2009-01-20 14:49:20 +03:00
signal_received = 1 ;
[PATCH] udev - next round of udev event order daemon
Here is the next round of udevd/udevsend:
udevsend - If the IPC message we send is not catched by a receiver we fork
the udevd daemon to process this and the following events
udevd - We reorder the events we receive and execute our current udev for
every event. If one or more events are missing, we wait
10 seconds and then go ahead in the queue.
If the queue is empty and we don't receive any event for the next
30 seconds, the daemon exits.
The next incoming event will fork the daemon again.
config - The path's to the executable are specified in udevd.h
Now they are pointing to the current directory only.
I don't like daemons hiding secrets (and mem leaks :)) inside,
so I want to try this model. It should be enough logic to get all possible
hotplug events executed in the right order.
If no event, then no daemon! So everybody should be happy :)
Here we see:
1. the daemon fork,
2. the udev work,
3. the 10 sec timeout and the skipped events,
4. the udev work,
...,
5. and the 30 sec timeout and exit.
EVENTS:
pim:/home/kay/src/udev.kay# test/udevd_test.sh
pim:/home/kay/src/udev.kay# SEQNUM=15 ./udevsend block
pim:/home/kay/src/udev.kay# SEQNUM=16 ./udevsend block
pim:/home/kay/src/udev.kay# SEQNUM=17 ./udevsend block
pim:/home/kay/src/udev.kay# SEQNUM=18 ./udevsend block
pim:/home/kay/src/udev.kay# SEQNUM=20 ./udevsend block
pim:/home/kay/src/udev.kay# SEQNUM=21 ./udevsend block
LOG:
Jan 23 15:35:35 pim udev[11795]: message is still in the ipc queue, starting daemon...
Jan 23 15:35:35 pim udev[11799]: configured rule in '/etc/udev/udev.rules' at line 19 applied, 'sda' becomes '%k-flash'
Jan 23 15:35:35 pim udev[11799]: creating device node '/udev/sda-flash'
Jan 23 15:35:35 pim udev[11800]: creating device node '/udev/sdb'
Jan 23 15:35:35 pim udev[11804]: creating device node '/udev/sdc'
Jan 23 15:35:35 pim udev[11805]: removing device node '/udev/sda-flash'
Jan 23 15:35:35 pim udev[11808]: removing device node '/udev/sdb'
Jan 23 15:35:35 pim udev[11809]: removing device node '/udev/sdc'
Jan 23 15:35:45 pim udev[11797]: timeout reached, skip events 7 - 7
Jan 23 15:35:45 pim udev[11811]: creating device node '/udev/sdb'
Jan 23 15:35:45 pim udev[11812]: creating device node '/udev/sdc'
Jan 23 15:36:01 pim udev[11797]: timeout reached, skip events 10 - 14
Jan 23 15:36:01 pim udev[11814]: creating device node '/udev/sdc'
Jan 23 15:36:04 pim udev[11816]: creating device node '/udev/sdc'
Jan 23 15:36:12 pim udev[11818]: creating device node '/udev/sdc'
Jan 23 15:36:16 pim udev[11820]: creating device node '/udev/sdc'
Jan 23 15:36:38 pim udev[11797]: timeout reached, skip events 19 - 19
Jan 23 15:36:38 pim udev[11823]: creating device node '/udev/sdc'
Jan 23 15:36:38 pim udev[11824]: creating device node '/udev/sdc'
Jan 23 15:37:08 pim udev[11797]: we have nothing to do, so daemon exits...
2004-01-24 08:25:17 +03:00
}
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
2005-11-16 04:06:46 +03:00
static void udev_done ( int pid , int exitstatus )
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote:
>
> Kay, you said "unless we can get rid of _all_ the threads or at least
> getting faster, I don't want to change it."
>
> Well how about we get rid of all the threads, *and* we get faster?
Yes, we are twice as fast now on my box :)
> This patch applies to current bk trees, and does the following:
>
> 1) Switch to DGRAM sockets rather than STREAM. This simplifies things
> as mentioned in the previous message.
>
> 2) Invalid sequence numbers are mapped to -1 rather than zero, since
> zero is a valid sequence number (I think). Also, this allows for real
> speed tests using scripts starting at a zero sequence number, since that
> is what the initial expected sequence number is.
>
> 3) Get rid of all threading. This is the biggie. Some highlights:
> a) timeout using setitimer() and SIGALRM
> b) async child death notification via SIGCHLD
> c) these two signal handlers do nothing but raise volatile flags,
> all the
> work is done in the main loop
> d) locking no longer required
I cleaned up the rest of the comments, the whitespace and a few names to match
the whole thing. Please recheck it. Test script is switched to work on subsystem
'test' to let udev ignore it.
2004-02-07 09:21:15 +03:00
{
2008-10-17 20:59:27 +04:00
struct udev_list_node * loop ;
2008-10-16 19:16:58 +04:00
/* find event associated with pid and delete it */
2008-10-29 19:32:13 +03:00
udev_list_node_foreach ( loop , & event_list ) {
2008-10-17 20:59:27 +04:00
struct udev_event * loop_event = node_to_event ( loop ) ;
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote:
>
> Kay, you said "unless we can get rid of _all_ the threads or at least
> getting faster, I don't want to change it."
>
> Well how about we get rid of all the threads, *and* we get faster?
Yes, we are twice as fast now on my box :)
> This patch applies to current bk trees, and does the following:
>
> 1) Switch to DGRAM sockets rather than STREAM. This simplifies things
> as mentioned in the previous message.
>
> 2) Invalid sequence numbers are mapped to -1 rather than zero, since
> zero is a valid sequence number (I think). Also, this allows for real
> speed tests using scripts starting at a zero sequence number, since that
> is what the initial expected sequence number is.
>
> 3) Get rid of all threading. This is the biggie. Some highlights:
> a) timeout using setitimer() and SIGALRM
> b) async child death notification via SIGCHLD
> c) these two signal handlers do nothing but raise volatile flags,
> all the
> work is done in the main loop
> d) locking no longer required
I cleaned up the rest of the comments, the whitespace and a few names to match
the whole thing. Please recheck it. Test script is switched to work on subsystem
'test' to let udev ignore it.
2004-02-07 09:21:15 +03:00
2008-10-17 20:59:27 +04:00
if ( loop_event - > pid = = pid ) {
info ( loop_event - > udev , " seq %llu cleanup, pid [%d], status %i, %ld seconds old \n " ,
udev_device_get_seqnum ( loop_event - > dev ) , loop_event - > pid ,
exitstatus , time ( NULL ) - loop_event - > queue_time ) ;
loop_event - > exitstatus = exitstatus ;
2008-10-29 19:32:13 +03:00
if ( debug_trace )
2008-10-31 18:22:55 +03:00
fprintf ( stderr , " exit %s (%llu) \n " ,
2008-10-29 19:32:13 +03:00
udev_device_get_syspath ( loop_event - > dev ) ,
udev_device_get_seqnum ( loop_event - > dev ) ) ;
2008-10-17 20:59:27 +04:00
event_queue_delete ( loop_event ) ;
2008-10-29 19:32:13 +03:00
childs - - ;
2004-09-05 20:05:29 +04:00
2008-10-29 19:32:13 +03:00
/* there may be dependent events waiting */
2004-04-01 11:03:07 +04:00
run_exec_q = 1 ;
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote:
>
> Kay, you said "unless we can get rid of _all_ the threads or at least
> getting faster, I don't want to change it."
>
> Well how about we get rid of all the threads, *and* we get faster?
Yes, we are twice as fast now on my box :)
> This patch applies to current bk trees, and does the following:
>
> 1) Switch to DGRAM sockets rather than STREAM. This simplifies things
> as mentioned in the previous message.
>
> 2) Invalid sequence numbers are mapped to -1 rather than zero, since
> zero is a valid sequence number (I think). Also, this allows for real
> speed tests using scripts starting at a zero sequence number, since that
> is what the initial expected sequence number is.
>
> 3) Get rid of all threading. This is the biggie. Some highlights:
> a) timeout using setitimer() and SIGALRM
> b) async child death notification via SIGCHLD
> c) these two signal handlers do nothing but raise volatile flags,
> all the
> work is done in the main loop
> d) locking no longer required
I cleaned up the rest of the comments, the whitespace and a few names to match
the whole thing. Please recheck it. Test script is switched to work on subsystem
'test' to let udev ignore it.
2004-02-07 09:21:15 +03:00
return ;
}
}
}
2004-10-19 15:37:30 +04:00
static void reap_sigchilds ( void )
2004-04-01 11:03:07 +04:00
{
2005-08-15 13:57:04 +04:00
pid_t pid ;
2005-11-16 04:06:46 +03:00
int status ;
2005-01-16 06:39:02 +03:00
2005-08-15 13:57:04 +04:00
while ( 1 ) {
2005-11-16 04:06:46 +03:00
pid = waitpid ( - 1 , & status , WNOHANG ) ;
2005-08-15 13:57:04 +04:00
if ( pid < = 0 )
2004-04-01 11:03:07 +04:00
break ;
2005-11-16 04:06:46 +03:00
if ( WIFEXITED ( status ) )
status = WEXITSTATUS ( status ) ;
2005-11-17 18:34:37 +03:00
else if ( WIFSIGNALED ( status ) )
status = WTERMSIG ( status ) + 128 ;
2005-11-16 04:06:46 +03:00
else
status = 0 ;
udev_done ( pid , status ) ;
2004-04-01 11:03:07 +04:00
}
}
2008-11-06 19:43:12 +03:00
static void cleanup_queue_dir ( struct udev * udev )
{
char dirname [ UTIL_PATH_SIZE ] ;
char filename [ UTIL_PATH_SIZE ] ;
DIR * dir ;
util_strlcpy ( filename , udev_get_dev_path ( udev ) , sizeof ( filename ) ) ;
util_strlcat ( filename , " /.udev/uevent_seqnum " , sizeof ( filename ) ) ;
unlink ( filename ) ;
util_strlcpy ( dirname , udev_get_dev_path ( udev ) , sizeof ( dirname ) ) ;
util_strlcat ( dirname , " /.udev/queue " , sizeof ( dirname ) ) ;
dir = opendir ( dirname ) ;
if ( dir ! = NULL ) {
while ( 1 ) {
struct dirent * dent ;
dent = readdir ( dir ) ;
if ( dent = = NULL | | dent - > d_name [ 0 ] = = ' \0 ' )
break ;
if ( dent - > d_name [ 0 ] = = ' . ' )
continue ;
util_strlcpy ( filename , dirname , sizeof ( filename ) ) ;
util_strlcat ( filename , " / " , sizeof ( filename ) ) ;
util_strlcat ( filename , dent - > d_name , sizeof ( filename ) ) ;
unlink ( filename ) ;
}
closedir ( dir ) ;
rmdir ( dirname ) ;
}
}
2008-09-06 17:45:31 +04:00
static void export_initial_seqnum ( struct udev * udev )
2006-04-25 20:50:56 +04:00
{
2008-09-10 23:50:21 +04:00
char filename [ UTIL_PATH_SIZE ] ;
2006-04-25 20:50:56 +04:00
int fd ;
char seqnum [ 32 ] ;
ssize_t len = 0 ;
2008-09-10 20:59:42 +04:00
util_strlcpy ( filename , udev_get_sys_path ( udev ) , sizeof ( filename ) ) ;
util_strlcat ( filename , " /kernel/uevent_seqnum " , sizeof ( filename ) ) ;
2006-04-25 20:50:56 +04:00
fd = open ( filename , O_RDONLY ) ;
if ( fd > = 0 ) {
len = read ( fd , seqnum , sizeof ( seqnum ) - 1 ) ;
close ( fd ) ;
}
if ( len < = 0 ) {
strcpy ( seqnum , " 0 \n " ) ;
len = 3 ;
}
2008-09-10 20:59:42 +04:00
util_strlcpy ( filename , udev_get_dev_path ( udev ) , sizeof ( filename ) ) ;
util_strlcat ( filename , " /.udev/uevent_seqnum " , sizeof ( filename ) ) ;
2008-10-18 22:12:55 +04:00
util_create_path ( udev , filename ) ;
2006-04-25 20:50:56 +04:00
fd = open ( filename , O_WRONLY | O_TRUNC | O_CREAT , 0644 ) ;
if ( fd > = 0 ) {
write ( fd , seqnum , len ) ;
close ( fd ) ;
}
}
2009-04-19 05:25:04 +04:00
/* create the nodes the we depend on to properly start up */
static void setup_initial_nodes ( struct udev * udev )
{
struct udev_device * dev ;
dev = udev_device_new_from_subsystem_sysname ( udev , " mem " , " null " ) ;
if ( dev ! = NULL ) {
udev_node_mknod ( dev , " null " , makedev ( 0 , 0 ) , 0666 , 0 , 0 ) ;
udev_device_unref ( dev ) ;
}
dev = udev_device_new_from_subsystem_sysname ( udev , " mem " , " kmsg " ) ;
if ( dev ! = NULL ) {
udev_node_mknod ( dev , " kmsg " , makedev ( 0 , 0 ) , 0660 , 0 , 0 ) ;
udev_device_unref ( dev ) ;
}
dev = udev_device_new_from_subsystem_sysname ( udev , " tty " , " console " ) ;
if ( dev ! = NULL ) {
udev_node_mknod ( dev , " console " , makedev ( 0 , 0 ) , 0600 , 0 , 0 ) ;
udev_device_unref ( dev ) ;
}
}
2009-04-17 00:34:26 +04:00
static void startup_log ( struct udev * udev )
{
FILE * f ;
char path [ UTIL_PATH_SIZE ] ;
struct stat statbuf ;
f = fopen ( " /dev/kmsg " , " w " ) ;
if ( f ! = NULL )
fprintf ( f , " <6>udev: starting version " VERSION " \n " ) ;
util_strlcpy ( path , udev_get_sys_path ( udev ) , sizeof ( path ) ) ;
util_strlcat ( path , " /class/mem/null " , sizeof ( path ) ) ;
if ( lstat ( path , & statbuf ) = = 0 & & S_ISDIR ( statbuf . st_mode ) ) {
const char * depr_str =
" udev: missing sysfs features; please update the kernel "
" or disable the kernel's CONFIG_SYSFS_DEPRECATED option; "
" udev may fail to work correctly " ;
if ( f ! = NULL )
fprintf ( f , " <3>%s \n " , depr_str ) ;
err ( udev , " %s \n " , depr_str ) ;
sleep ( 3 ) ;
}
if ( f ! = NULL )
fclose ( f ) ;
}
2008-09-03 01:19:36 +04:00
int main ( int argc , char * argv [ ] )
2005-01-16 06:08:54 +03:00
{
2008-09-06 17:45:31 +04:00
struct udev * udev ;
2005-11-05 21:41:00 +03:00
int fd ;
2004-02-12 09:29:15 +03:00
struct sigaction act ;
2005-06-05 06:53:17 +04:00
const char * value ;
2005-06-08 13:57:53 +04:00
int daemonize = 0 ;
2009-01-21 00:33:02 +03:00
int resolve_names = 1 ;
2006-09-08 13:27:03 +04:00
static const struct option options [ ] = {
2008-10-02 18:49:05 +04:00
{ " daemon " , no_argument , NULL , ' d ' } ,
{ " debug-trace " , no_argument , NULL , ' t ' } ,
{ " debug " , no_argument , NULL , ' D ' } ,
{ " help " , no_argument , NULL , ' h ' } ,
{ " version " , no_argument , NULL , ' V ' } ,
2009-01-21 00:33:02 +03:00
{ " resolve-names " , required_argument , NULL , ' N ' } ,
2006-09-08 13:27:03 +04:00
{ }
} ;
2006-08-21 04:38:20 +04:00
int rc = 1 ;
[PATCH] udevd - cleanup and better timeout handling
On Thu, Jan 29, 2004 at 04:55:11PM +0100, Kay Sievers wrote:
> On Thu, Jan 29, 2004 at 02:56:25AM +0100, Kay Sievers wrote:
> > On Wed, Jan 28, 2004 at 10:47:36PM +0100, Kay Sievers wrote:
> > > Oh, couldn't resist to try threads.
> > > It's a multithreaded udevd that communicates through a localhost socket.
> > > The message includes a magic with the udev version, so we don't accept
> > > older udevsend's.
> > >
> > > No need for locking, cause we can't bind two sockets on the same address.
> > > The daemon tries to connect and if it fails it starts the daemon.
> > >
> > > We create a thread for every incoming connection, handle over the socket,
> > > sort the messages in the global message queue and exit the thread.
> > > Huh, that was easy with threads :)
> > >
> > > With the addition of a message we wakeup the queue manager thread and
> > > handle timeouts or move the message to the global exec list. This wakes
> > > up the exec list manager who looks if a process is already running for this
> > > device path.
> > > If yes, the exec is delayed otherwise we create a thread that execs udev.
> > > n the background. With the return of udev we free the message and wakeup
> > > the exec list manager to look if something is pending.
> > >
> > > It is just a quick shot, cause I couldn't solve the problems with fork an
> > > scheduling and I wanted to see if I'm to stupid :)
> > > But if anybody with a better idea or more experience with I/O scheduling
> > > we may go another way. The remaining problem is that klibc doesn't support
> > > threads.
> > >
> > > By now, we don't exec anything, it's just a sleep 3 for every exec,
> > > but you can see the queue management by watching syslog and do:
> > >
> > > DEVPATH=/abc ACTION=add SEQNUM=0 ./udevsend /abc
>
> Next version, switched to unix domain sockets.
Next cleaned up version. Hey, nobody wants to try it :)
Works for me, It's funny if I connect/disconnect my 4in1-usb-flash-reader
every two seconds. The 2.6 usb rocks! I can connect/diconnect a hub with 3
devices plugged in every second and don't run into any problem but a _very_
big udevd queue.
2004-02-01 20:12:36 +03:00
2008-09-06 17:45:31 +04:00
udev = udev_new ( ) ;
if ( udev = = NULL )
goto exit ;
2004-10-19 05:15:10 +04:00
logging_init ( " udevd " ) ;
2008-09-06 17:45:31 +04:00
udev_set_log_fn ( udev , log_fn ) ;
2008-10-16 19:16:58 +04:00
info ( udev , " version %s \n " , VERSION ) ;
2008-10-18 21:30:42 +04:00
udev_selinux_init ( udev ) ;
2004-02-02 19:19:41 +03:00
2006-09-08 13:27:03 +04:00
while ( 1 ) {
2008-09-06 17:45:31 +04:00
int option ;
2008-04-20 23:07:06 +04:00
option = getopt_long ( argc , argv , " dDthV " , options , NULL ) ;
2006-09-08 13:27:03 +04:00
if ( option = = - 1 )
break ;
switch ( option ) {
case ' d ' :
2005-06-08 13:57:53 +04:00
daemonize = 1 ;
2006-09-08 13:27:03 +04:00
break ;
2006-09-08 13:30:00 +04:00
case ' t ' :
debug_trace = 1 ;
break ;
2008-04-20 23:07:06 +04:00
case ' D ' :
debug = 1 ;
2008-09-06 17:45:31 +04:00
if ( udev_get_log_priority ( udev ) < LOG_INFO )
udev_set_log_priority ( udev , LOG_INFO ) ;
2006-09-08 13:28:38 +04:00
break ;
2009-01-21 00:33:02 +03:00
case ' N ' :
if ( strcmp ( optarg , " early " ) = = 0 ) {
resolve_names = 1 ;
2009-01-21 00:36:09 +03:00
} else if ( strcmp ( optarg , " late " ) = = 0 ) {
resolve_names = 0 ;
2009-01-21 00:33:02 +03:00
} else if ( strcmp ( optarg , " never " ) = = 0 ) {
resolve_names = - 1 ;
} else {
2009-01-21 00:36:09 +03:00
fprintf ( stderr , " resolve-names must be early, late or never \n " ) ;
err ( udev , " resolve-names must be early, late or never \n " ) ;
2009-01-21 00:33:02 +03:00
goto exit ;
}
break ;
2006-09-08 13:27:03 +04:00
case ' h ' :
2009-01-21 17:11:38 +03:00
printf ( " Usage: udevd [--help] [--daemon] [--debug-trace] [--debug] "
" [--resolve-names=early|late|never] [--version] \n " ) ;
2007-02-25 01:43:36 +03:00
goto exit ;
case ' V ' :
2008-07-30 03:45:23 +04:00
printf ( " %s \n " , VERSION ) ;
2006-08-21 04:38:20 +04:00
goto exit ;
2006-09-08 13:27:03 +04:00
default :
goto exit ;
2005-06-08 13:57:53 +04:00
}
}
2005-08-15 13:57:04 +04:00
2006-09-03 05:04:20 +04:00
if ( getuid ( ) ! = 0 ) {
fprintf ( stderr , " root privileges required \n " ) ;
2008-09-06 17:45:31 +04:00
err ( udev , " root privileges required \n " ) ;
2006-09-03 05:04:20 +04:00
goto exit ;
}
2009-04-19 05:25:04 +04:00
setup_initial_nodes ( udev ) ;
2007-03-14 00:27:21 +03:00
/* make sure std{in,out,err} fd's are in a sane state */
fd = open ( " /dev/null " , O_RDWR ) ;
if ( fd < 0 ) {
fprintf ( stderr , " cannot open /dev/null \n " ) ;
2008-09-06 17:45:31 +04:00
err ( udev , " cannot open /dev/null \n " ) ;
2007-03-14 00:27:21 +03:00
}
if ( write ( STDOUT_FILENO , 0 , 0 ) < 0 )
dup2 ( fd , STDOUT_FILENO ) ;
if ( write ( STDERR_FILENO , 0 , 0 ) < 0 )
dup2 ( fd , STDERR_FILENO ) ;
2008-09-08 19:59:00 +04:00
/* init control socket, bind() ensures, that only one udevd instance is running */
udev_ctrl = udev_ctrl_new_from_socket ( udev , UDEV_CTRL_SOCK_PATH ) ;
if ( udev_ctrl = = NULL ) {
fprintf ( stderr , " error initializing control socket " ) ;
err ( udev , " error initializing udevd socket " ) ;
rc = 1 ;
goto exit ;
}
if ( udev_ctrl_enable_receiving ( udev_ctrl ) < 0 ) {
fprintf ( stderr , " error binding control socket, seems udevd is already running \n " ) ;
err ( udev , " error binding control socket, seems udevd is already running \n " ) ;
rc = 1 ;
2005-11-04 07:25:15 +03:00
goto exit ;
}
2009-03-29 22:08:52 +04:00
kernel_monitor = udev_monitor_new_from_netlink ( udev , " kernel " ) ;
2008-10-16 19:16:58 +04:00
if ( kernel_monitor = = NULL | | udev_monitor_enable_receiving ( kernel_monitor ) < 0 ) {
2006-08-21 04:38:20 +04:00
fprintf ( stderr , " error initializing netlink socket \n " ) ;
2008-09-06 17:45:31 +04:00
err ( udev , " error initializing netlink socket \n " ) ;
2005-11-04 07:25:15 +03:00
rc = 3 ;
goto exit ;
}
2008-10-17 18:49:27 +04:00
udev_monitor_set_receive_buffer_size ( kernel_monitor , 128 * 1024 * 1024 ) ;
2005-11-04 07:25:15 +03:00
2009-01-21 00:33:02 +03:00
rules = udev_rules_new ( udev , resolve_names ) ;
2008-10-18 17:02:01 +04:00
if ( rules = = NULL ) {
err ( udev , " error reading rules \n " ) ;
goto exit ;
}
2008-10-29 19:32:13 +03:00
udev_list_init ( & event_list ) ;
2008-11-06 19:43:12 +03:00
cleanup_queue_dir ( udev ) ;
2008-09-06 17:45:31 +04:00
export_initial_seqnum ( udev ) ;
2006-04-25 20:50:56 +04:00
2005-06-08 13:57:53 +04:00
if ( daemonize ) {
2005-01-16 06:06:22 +03:00
pid_t pid ;
pid = fork ( ) ;
switch ( pid ) {
case 0 :
2008-09-06 17:45:31 +04:00
dbg ( udev , " daemonized fork running \n " ) ;
2005-01-16 06:06:22 +03:00
break ;
case - 1 :
2008-09-29 19:01:32 +04:00
err ( udev , " fork of daemon failed: %m \n " ) ;
2005-11-04 07:25:15 +03:00
rc = 4 ;
2005-01-16 06:06:22 +03:00
goto exit ;
default :
2008-09-06 17:45:31 +04:00
dbg ( udev , " child [%u] running, parent exits \n " , pid ) ;
2006-08-23 01:20:15 +04:00
rc = 0 ;
2005-11-04 07:25:15 +03:00
goto exit ;
2005-01-16 06:06:22 +03:00
}
}
2008-09-08 19:59:00 +04:00
/* redirect std{out,err} */
2008-10-29 19:32:13 +03:00
if ( ! debug & & ! debug_trace ) {
dup2 ( fd , STDIN_FILENO ) ;
2007-03-14 00:27:21 +03:00
dup2 ( fd , STDOUT_FILENO ) ;
2008-09-08 19:59:00 +04:00
dup2 ( fd , STDERR_FILENO ) ;
}
2007-03-14 00:27:21 +03:00
if ( fd > STDERR_FILENO )
close ( fd ) ;
2006-08-21 04:38:20 +04:00
2005-11-05 21:41:00 +03:00
/* set scheduling priority for the daemon */
2005-01-17 02:53:08 +03:00
setpriority ( PRIO_PROCESS , 0 , UDEVD_PRIORITY ) ;
2005-11-05 21:41:00 +03:00
chdir ( " / " ) ;
2005-11-06 00:02:21 +03:00
umask ( 022 ) ;
2008-09-09 17:14:38 +04:00
setsid ( ) ;
2005-11-05 21:41:00 +03:00
/* OOM_DISABLE == -17 */
fd = open ( " /proc/self/oom_adj " , O_RDWR ) ;
if ( fd < 0 )
2008-09-29 19:01:32 +04:00
err ( udev , " error disabling OOM: %m \n " ) ;
2005-11-05 21:41:00 +03:00
else {
write ( fd , " -17 " , 3 ) ;
close ( fd ) ;
}
2009-04-17 00:34:26 +04:00
startup_log ( udev ) ;
2008-04-10 23:35:40 +04:00
2004-04-01 11:03:07 +04:00
/* set signal handlers */
2005-02-06 02:09:34 +03:00
memset ( & act , 0x00 , sizeof ( struct sigaction ) ) ;
2005-03-27 03:11:03 +04:00
act . sa_handler = ( void ( * ) ( int ) ) sig_handler ;
2004-04-01 11:03:07 +04:00
sigemptyset ( & act . sa_mask ) ;
2009-01-21 20:55:59 +03:00
act . sa_flags = SA_RESTART ;
2004-02-12 09:29:15 +03:00
sigaction ( SIGINT , & act , NULL ) ;
sigaction ( SIGTERM , & act , NULL ) ;
sigaction ( SIGCHLD , & act , NULL ) ;
2005-08-08 07:07:36 +04:00
sigaction ( SIGHUP , & act , NULL ) ;
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
2005-10-27 23:04:38 +04:00
/* watch rules directory */
2009-02-11 20:38:56 +03:00
udev_watch_init ( udev ) ;
2007-07-15 21:10:06 +04:00
if ( inotify_fd > = 0 ) {
2008-09-06 17:45:31 +04:00
if ( udev_get_rules_path ( udev ) ! = NULL ) {
inotify_add_watch ( inotify_fd , udev_get_rules_path ( udev ) ,
2008-07-18 17:56:03 +04:00
IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE ) ;
} else {
2008-10-29 19:32:13 +03:00
char filename [ UTIL_PATH_SIZE ] ;
2008-07-18 17:56:03 +04:00
2008-07-30 03:45:23 +04:00
inotify_add_watch ( inotify_fd , UDEV_PREFIX " /lib/udev/rules.d " ,
2008-07-18 17:56:03 +04:00
IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE ) ;
2008-07-30 03:45:23 +04:00
inotify_add_watch ( inotify_fd , SYSCONFDIR " /udev/rules.d " ,
2008-07-18 17:56:03 +04:00
IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE ) ;
/* watch dynamic rules directory */
2008-09-10 20:59:42 +04:00
util_strlcpy ( filename , udev_get_dev_path ( udev ) , sizeof ( filename ) ) ;
util_strlcat ( filename , " /.udev/rules.d " , sizeof ( filename ) ) ;
2008-07-18 17:56:03 +04:00
inotify_add_watch ( inotify_fd , filename ,
IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE ) ;
}
2009-02-11 20:38:56 +03:00
udev_watch_restore ( udev ) ;
}
2004-02-12 09:32:11 +03:00
2008-10-29 19:32:13 +03:00
/* in trace mode run one event after the other */
if ( debug_trace ) {
max_childs = 1 ;
} else {
2006-08-10 14:50:53 +04:00
int memsize = mem_size_mb ( ) ;
if ( memsize > 0 )
max_childs = 128 + ( memsize / 4 ) ;
else
max_childs = UDEVD_MAX_CHILDS ;
}
2008-10-29 19:32:13 +03:00
/* possibly overwrite maximum limit of executed events */
value = getenv ( " UDEVD_MAX_CHILDS " ) ;
if ( value )
max_childs = strtoul ( value , NULL , 10 ) ;
2008-09-06 17:45:31 +04:00
info ( udev , " initialize max_childs to %u \n " , max_childs ) ;
2005-06-05 06:53:17 +04:00
2005-08-08 07:07:36 +04:00
while ( ! udev_exit ) {
2009-01-20 14:49:20 +03:00
sigset_t blocked_mask , orig_mask ;
2009-01-21 13:09:27 +03:00
struct pollfd pfd [ 4 ] ;
2009-01-20 14:49:20 +03:00
struct pollfd * ctrl_poll , * monitor_poll , * inotify_poll = NULL ;
2009-01-21 13:09:27 +03:00
int nfds = 0 ;
int fdcount ;
2009-01-20 14:49:20 +03:00
sigfillset ( & blocked_mask ) ;
sigprocmask ( SIG_SETMASK , & blocked_mask , & orig_mask ) ;
if ( signal_received ) {
sigprocmask ( SIG_SETMASK , & orig_mask , NULL ) ;
goto handle_signals ;
}
2005-01-05 07:37:50 +03:00
2009-01-21 13:09:27 +03:00
ctrl_poll = & pfd [ nfds + + ] ;
ctrl_poll - > fd = udev_ctrl_get_fd ( udev_ctrl ) ;
ctrl_poll - > events = POLLIN ;
monitor_poll = & pfd [ nfds + + ] ;
monitor_poll - > fd = udev_monitor_get_fd ( kernel_monitor ) ;
monitor_poll - > events = POLLIN ;
if ( inotify_fd > = 0 ) {
inotify_poll = & pfd [ nfds + + ] ;
inotify_poll - > fd = inotify_fd ;
inotify_poll - > events = POLLIN ;
}
2009-01-20 14:49:20 +03:00
fdcount = ppoll ( pfd , nfds , NULL , & orig_mask ) ;
sigprocmask ( SIG_SETMASK , & orig_mask , NULL ) ;
2005-08-15 13:57:04 +04:00
if ( fdcount < 0 ) {
2009-01-20 14:49:20 +03:00
if ( errno = = EINTR )
goto handle_signals ;
err ( udev , " error in select: %m \n " ) ;
2004-04-01 11:03:07 +04:00
continue ;
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote:
>
> Kay, you said "unless we can get rid of _all_ the threads or at least
> getting faster, I don't want to change it."
>
> Well how about we get rid of all the threads, *and* we get faster?
Yes, we are twice as fast now on my box :)
> This patch applies to current bk trees, and does the following:
>
> 1) Switch to DGRAM sockets rather than STREAM. This simplifies things
> as mentioned in the previous message.
>
> 2) Invalid sequence numbers are mapped to -1 rather than zero, since
> zero is a valid sequence number (I think). Also, this allows for real
> speed tests using scripts starting at a zero sequence number, since that
> is what the initial expected sequence number is.
>
> 3) Get rid of all threading. This is the biggie. Some highlights:
> a) timeout using setitimer() and SIGALRM
> b) async child death notification via SIGCHLD
> c) these two signal handlers do nothing but raise volatile flags,
> all the
> work is done in the main loop
> d) locking no longer required
I cleaned up the rest of the comments, the whitespace and a few names to match
the whole thing. Please recheck it. Test script is switched to work on subsystem
'test' to let udev ignore it.
2004-02-07 09:21:15 +03:00
}
2004-04-01 11:03:46 +04:00
2006-08-05 15:22:44 +04:00
/* get control message */
2009-01-20 14:49:20 +03:00
if ( ctrl_poll - > revents & POLLIN )
2008-09-08 19:59:00 +04:00
handle_ctrl_msg ( udev_ctrl ) ;
2005-06-05 06:38:10 +04:00
2008-10-16 19:16:58 +04:00
/* get kernel uevent */
2009-01-20 14:49:20 +03:00
if ( monitor_poll - > revents & POLLIN ) {
2008-10-16 19:16:58 +04:00
struct udev_device * dev ;
dev = udev_monitor_receive_device ( kernel_monitor ) ;
if ( dev ! = NULL ) {
struct udev_event * event ;
event = udev_event_new ( dev ) ;
if ( event ! = NULL )
event_queue_insert ( event ) ;
else
udev_device_unref ( dev ) ;
}
2005-01-05 07:37:50 +03:00
}
2004-04-01 11:03:46 +04:00
2005-10-27 23:04:38 +04:00
/* rules directory inotify watch */
2009-02-11 20:38:56 +03:00
if ( inotify_poll & & ( inotify_poll - > revents & POLLIN ) )
2009-02-11 23:56:35 +03:00
handle_inotify ( udev ) ;
2005-10-27 23:04:38 +04:00
2009-01-20 14:49:20 +03:00
handle_signals :
signal_received = 0 ;
2006-08-21 04:38:20 +04:00
/* rules changed, set by inotify or a HUP signal */
2005-10-27 23:04:38 +04:00
if ( reload_config ) {
2008-10-18 17:02:01 +04:00
struct udev_rules * rules_new ;
2005-10-27 23:04:38 +04:00
reload_config = 0 ;
2009-01-21 00:33:02 +03:00
rules_new = udev_rules_new ( udev , resolve_names ) ;
2008-10-18 17:02:01 +04:00
if ( rules_new ! = NULL ) {
udev_rules_unref ( rules ) ;
rules = rules_new ;
}
2005-10-27 23:04:38 +04:00
}
2004-10-19 15:37:30 +04:00
if ( sigchilds_waiting ) {
sigchilds_waiting = 0 ;
reap_sigchilds ( ) ;
2004-04-01 11:03:07 +04:00
}
2004-04-01 11:03:46 +04:00
2004-04-01 11:03:07 +04:00
if ( run_exec_q ) {
run_exec_q = 0 ;
2005-06-05 06:41:09 +04:00
if ( ! stop_exec_q )
2008-10-16 19:16:58 +04:00
event_queue_manager ( udev ) ;
[PATCH] udevd - cleanup and better timeout handling
On Thu, Jan 29, 2004 at 04:55:11PM +0100, Kay Sievers wrote:
> On Thu, Jan 29, 2004 at 02:56:25AM +0100, Kay Sievers wrote:
> > On Wed, Jan 28, 2004 at 10:47:36PM +0100, Kay Sievers wrote:
> > > Oh, couldn't resist to try threads.
> > > It's a multithreaded udevd that communicates through a localhost socket.
> > > The message includes a magic with the udev version, so we don't accept
> > > older udevsend's.
> > >
> > > No need for locking, cause we can't bind two sockets on the same address.
> > > The daemon tries to connect and if it fails it starts the daemon.
> > >
> > > We create a thread for every incoming connection, handle over the socket,
> > > sort the messages in the global message queue and exit the thread.
> > > Huh, that was easy with threads :)
> > >
> > > With the addition of a message we wakeup the queue manager thread and
> > > handle timeouts or move the message to the global exec list. This wakes
> > > up the exec list manager who looks if a process is already running for this
> > > device path.
> > > If yes, the exec is delayed otherwise we create a thread that execs udev.
> > > n the background. With the return of udev we free the message and wakeup
> > > the exec list manager to look if something is pending.
> > >
> > > It is just a quick shot, cause I couldn't solve the problems with fork an
> > > scheduling and I wanted to see if I'm to stupid :)
> > > But if anybody with a better idea or more experience with I/O scheduling
> > > we may go another way. The remaining problem is that klibc doesn't support
> > > threads.
> > >
> > > By now, we don't exec anything, it's just a sleep 3 for every exec,
> > > but you can see the queue management by watching syslog and do:
> > >
> > > DEVPATH=/abc ACTION=add SEQNUM=0 ./udevsend /abc
>
> Next version, switched to unix domain sockets.
Next cleaned up version. Hey, nobody wants to try it :)
Works for me, It's funny if I connect/disconnect my 4in1-usb-flash-reader
every two seconds. The 2.6 usb rocks! I can connect/diconnect a hub with 3
devices plugged in every second and don't run into any problem but a _very_
big udevd queue.
2004-02-01 20:12:36 +03:00
}
2009-03-10 16:00:16 +03:00
if ( settle_pid > 0 ) {
kill ( settle_pid , SIGUSR1 ) ;
settle_pid = 0 ;
}
[PATCH] udevd - cleanup and better timeout handling
On Thu, Jan 29, 2004 at 04:55:11PM +0100, Kay Sievers wrote:
> On Thu, Jan 29, 2004 at 02:56:25AM +0100, Kay Sievers wrote:
> > On Wed, Jan 28, 2004 at 10:47:36PM +0100, Kay Sievers wrote:
> > > Oh, couldn't resist to try threads.
> > > It's a multithreaded udevd that communicates through a localhost socket.
> > > The message includes a magic with the udev version, so we don't accept
> > > older udevsend's.
> > >
> > > No need for locking, cause we can't bind two sockets on the same address.
> > > The daemon tries to connect and if it fails it starts the daemon.
> > >
> > > We create a thread for every incoming connection, handle over the socket,
> > > sort the messages in the global message queue and exit the thread.
> > > Huh, that was easy with threads :)
> > >
> > > With the addition of a message we wakeup the queue manager thread and
> > > handle timeouts or move the message to the global exec list. This wakes
> > > up the exec list manager who looks if a process is already running for this
> > > device path.
> > > If yes, the exec is delayed otherwise we create a thread that execs udev.
> > > n the background. With the return of udev we free the message and wakeup
> > > the exec list manager to look if something is pending.
> > >
> > > It is just a quick shot, cause I couldn't solve the problems with fork an
> > > scheduling and I wanted to see if I'm to stupid :)
> > > But if anybody with a better idea or more experience with I/O scheduling
> > > we may go another way. The remaining problem is that klibc doesn't support
> > > threads.
> > >
> > > By now, we don't exec anything, it's just a sleep 3 for every exec,
> > > but you can see the queue management by watching syslog and do:
> > >
> > > DEVPATH=/abc ACTION=add SEQNUM=0 ./udevsend /abc
>
> Next version, switched to unix domain sockets.
Next cleaned up version. Hey, nobody wants to try it :)
Works for me, It's funny if I connect/disconnect my 4in1-usb-flash-reader
every two seconds. The 2.6 usb rocks! I can connect/diconnect a hub with 3
devices plugged in every second and don't run into any problem but a _very_
big udevd queue.
2004-02-01 20:12:36 +03:00
}
2008-11-17 16:43:58 +03:00
cleanup_queue_dir ( udev ) ;
2006-08-21 04:38:20 +04:00
rc = 0 ;
[PATCH] udevd - cleanup and better timeout handling
On Thu, Jan 29, 2004 at 04:55:11PM +0100, Kay Sievers wrote:
> On Thu, Jan 29, 2004 at 02:56:25AM +0100, Kay Sievers wrote:
> > On Wed, Jan 28, 2004 at 10:47:36PM +0100, Kay Sievers wrote:
> > > Oh, couldn't resist to try threads.
> > > It's a multithreaded udevd that communicates through a localhost socket.
> > > The message includes a magic with the udev version, so we don't accept
> > > older udevsend's.
> > >
> > > No need for locking, cause we can't bind two sockets on the same address.
> > > The daemon tries to connect and if it fails it starts the daemon.
> > >
> > > We create a thread for every incoming connection, handle over the socket,
> > > sort the messages in the global message queue and exit the thread.
> > > Huh, that was easy with threads :)
> > >
> > > With the addition of a message we wakeup the queue manager thread and
> > > handle timeouts or move the message to the global exec list. This wakes
> > > up the exec list manager who looks if a process is already running for this
> > > device path.
> > > If yes, the exec is delayed otherwise we create a thread that execs udev.
> > > n the background. With the return of udev we free the message and wakeup
> > > the exec list manager to look if something is pending.
> > >
> > > It is just a quick shot, cause I couldn't solve the problems with fork an
> > > scheduling and I wanted to see if I'm to stupid :)
> > > But if anybody with a better idea or more experience with I/O scheduling
> > > we may go another way. The remaining problem is that klibc doesn't support
> > > threads.
> > >
> > > By now, we don't exec anything, it's just a sleep 3 for every exec,
> > > but you can see the queue management by watching syslog and do:
> > >
> > > DEVPATH=/abc ACTION=add SEQNUM=0 ./udevsend /abc
>
> Next version, switched to unix domain sockets.
Next cleaned up version. Hey, nobody wants to try it :)
Works for me, It's funny if I connect/disconnect my 4in1-usb-flash-reader
every two seconds. The 2.6 usb rocks! I can connect/diconnect a hub with 3
devices plugged in every second and don't run into any problem but a _very_
big udevd queue.
2004-02-01 20:12:36 +03:00
exit :
2008-10-18 17:02:01 +04:00
udev_rules_unref ( rules ) ;
2008-09-08 19:59:00 +04:00
udev_ctrl_unref ( udev_ctrl ) ;
2006-04-25 20:50:56 +04:00
if ( inotify_fd > = 0 )
2005-10-27 23:04:38 +04:00
close ( inotify_fd ) ;
2008-10-16 19:16:58 +04:00
udev_monitor_unref ( kernel_monitor ) ;
2008-10-18 21:30:42 +04:00
udev_selinux_exit ( udev ) ;
2008-10-02 20:48:40 +04:00
udev_unref ( udev ) ;
2004-10-19 05:15:10 +04:00
logging_close ( ) ;
2005-11-04 07:25:15 +03:00
return rc ;
[PATCH] spilt udev into pieces
On Thu, Jan 22, 2004 at 01:27:45AM +0100, Kay Sievers wrote:
> On Wed, Jan 21, 2004 at 02:38:25PM +0100, Kay Sievers wrote:
> > On Thu, Jan 15, 2004 at 01:45:10PM -0800, Greg KH wrote:
> > > On Thu, Jan 15, 2004 at 10:36:25PM +0800, Ling, Xiaofeng wrote:
> > > > Hi, Greg
> > > > I wrote a simple implementation for the two pieces
> > > > of send and receive hotplug event,
> > > > use a message queue and a list for the out of order
> > > > hotplug event. It also has a timeout timer of 3 seconds.
> > > > They are now separate program. the file nseq is the test script.
> > > > Could you have a look to see wether it is feasible?
> > > > If so, I'll continue to merge with udev.
> > >
> > > Yes, very nice start. Please continue on.
> > >
> > > One minor comment, please stick with the kernel coding style when you
> > > are writing new code for udev.
> >
> > I took the code from Xiaofeng, cleaned the whitespace, renamed some bits,
> > tweaked the debugging, added the udev exec and created a patch for the current tree.
> >
> > It seems functional now, by simply executing our current udev (dirty hack).
> > It reorders the incoming events and if one is missing it delays the
> > execution of the following ones up to a maximum of 10 seconds.
> >
> > Test script is included, but you can't mix hotplug sequence numbers and
> > test script numbers, it will result in waiting for the missing numbers :)
>
> Hey, nobody want's to play with me?
> So here I'm chatting with myself :)
>
> This is the next version with signal handling for resetting the expected
> signal number. I changed the behaviour of the timeout to skip all
> missing events at once and to proceed with the next event in the queue.
>
> So it's now possible to use the test script at any time, cause it resets
> the daemon, if real hotplug event coming in later all missing nimbers will
> be skipped after a timeout of 10 seconds and the queued events are applied.
Here is the next updated updated version to apply to the lastet udev.
I've added infrastructure for getting the state of the IPC queue in the
sender and set the program to exec by the daemon. Also the magic key id
is replaced by the usual key generation by path/nr.
It looks promising, I use it on my machine and my 4in1 USB-flash-reader
connect/disconnect emits the events "randomly" but udevd is able to
reorder it and calls our normal udev in the right order.
2004-01-23 11:28:57 +03:00
}