From: Erik van Konijnenburg <ekonijn@xs4all.nl>
To: linux-hotplug@vger.kernel.org
Subject: Re: [ANNOUNCE] hotplug-ng 001 release
Date: Wed, 23 Feb 2005 00:44:04 +0000 [thread overview]
Message-ID: <20050223014404.E2736@banaan.localdomain> (raw)
In-Reply-To: <20050211004033.GA26624@suse.de>
Some notes in the patch.
On Tue, Feb 22, 2005 at 01:35:03PM +0300, Roman Kagan wrote:
> On Mon, Feb 21, 2005 at 09:40:04PM +0100, Erik van Konijnenburg wrote:
> > Here are some samples from modules.alias:
> > alias usb:v097Ap0001dl0000dh0001dc*dsc*dp*ic*isc*ip* usb_storage
> > alias usb:v05A9p0511dl*dh*dc*dsc*dp*ic*isc*ip* ov511
> >
> > And the read_config_file function in modprobe.c simply does a shell
> > style wildcard match.
> >
> > How can wildcard matching in modprobe against these aliases give the same
> > result as a numeric range comparison on DEV_LO and DEV_HI in kernel and
> > hotplug agents?
> >
> > Since I don't know what modules.aliases was originally intended for,
> > I may be missing something obvious. Any hints appreciated.
>
> That wasn't you who missed something obvious :) Actually this problem
> existed since day 0 and presumably was due to the fact that USB was (and
> still is) the only kind which used numeric ranges and thus had two
> parameters to match a single value against, which was probably
> overlooked when scripts/mod/file2alias.c was written.
>
> The only solution I could come up with was to modify that file to
> generate multiple patterns (and thus MODULE_ALIAS strings) out of a
> usb_match_id which defined a range of bcdDevice values, e.g. given a
> range between 0x0001 and 0xa345 it would create 7 patterns:
>
> 000[1-F]*
> 00[1-F]*
> 0[1-F]*
> [1-9]*
> A[0-2]*
> A3[0-3]*
> A34[0-5]*
>
> Since bcdDevice is 2 bytes wide = 4 digits in hex representation, the
> max no. of patters is 2 * 4 - 1 = 7.
Nice! Far fewer patterns needed than I feared.
>
> The attached patch does this. Please comment and consider applying.
>
> Thanks,
> Roman.
>
>
> --- linux-2.6.11-rc4/scripts/mod/file2alias.c.orig 2005-02-13 10:06:23.000000000 +0300
> +++ linux-2.6.11-rc4/scripts/mod/file2alias.c 2005-02-22 12:58:05.849081056 +0300
> @@ -47,32 +47,19 @@
> sprintf(str + strlen(str), "*"); \
> } while(0)
>
> -/* Looks like "usb:vNpNdlNdhNdcNdscNdpNicNiscNipN" */
> -static int do_usb_entry(const char *filename,
> - struct usb_device_id *id, char *alias)
> +/* USB is special because the bcdDevice can be matched against a numeric range */
> +/* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipN" */
Hmm. A change in the alias pattern: dl*dh* => d*, but given the meaning of
the pattern it's probably the right thing. Who generates stuff
that needs to be matched against this?
> +static void do_usb_entry(struct usb_device_id *id, const char *bcdDevice_pattern,
> + struct module *mod)
> {
> - id->match_flags = TO_NATIVE(id->match_flags);
> - id->idVendor = TO_NATIVE(id->idVendor);
> - id->idProduct = TO_NATIVE(id->idProduct);
> - id->bcdDevice_lo = TO_NATIVE(id->bcdDevice_lo);
> - id->bcdDevice_hi = TO_NATIVE(id->bcdDevice_hi);
> -
> - /*
> - * Some modules (visor) have empty slots as placeholder for
> - * run-time specification that results in catch-all alias
> - */
> - if (!(id->idVendor | id->bDeviceClass | id->bInterfaceClass))
> - return 1;
> -
> + char alias[500];
> strcpy(alias, "usb:");
> ADD(alias, "v", id->match_flags&USB_DEVICE_ID_MATCH_VENDOR,
> id->idVendor);
> ADD(alias, "p", id->match_flags&USB_DEVICE_ID_MATCH_PRODUCT,
> id->idProduct);
> - ADD(alias, "dl", id->match_flags&USB_DEVICE_ID_MATCH_DEV_LO,
> - id->bcdDevice_lo);
> - ADD(alias, "dh", id->match_flags&USB_DEVICE_ID_MATCH_DEV_HI,
> - id->bcdDevice_hi);
> + strcat(alias, "d");
> + strcat(alias, bcdDevice_pattern);
> ADD(alias, "dc", id->match_flags&USB_DEVICE_ID_MATCH_DEV_CLASS,
> id->bDeviceClass);
> ADD(alias, "dsc",
> @@ -90,7 +77,104 @@
> ADD(alias, "ip",
> id->match_flags&USB_DEVICE_ID_MATCH_INT_PROTOCOL,
> id->bInterfaceProtocol);
> - return 1;
> +
> + /* Always end in a wildcard, for future extension */
> + if (alias[strlen(alias)-1] != '*')
> + strcat(alias, "*");
> + buf_printf(&mod->dev_table_buf,
> + "MODULE_ALIAS(\"%s\");\n", alias);
> +}
> +
> +
> +static inline size_t sprint_pattern(char *str, int ndigits, unsigned int initial,
> + unsigned char clo, unsigned char chi)
> +{
> + if (ndigits) {
> + if (clo = chi)
> + return sprintf(str, "%0*X%X*", ndigits, initial, clo);
> + if (clo = 0x0 && chi = 0xf)
> + return sprintf(str, "%0*X*", ndigits, initial);
> + return sprintf(str, "%0*X[%X-%X]*", ndigits, initial, clo, chi);
> + }
> + else {
> + if (clo = chi)
> + return sprintf(str, "%X*", clo);
> + if (clo = 0x0 && chi = 0xf)
> + return sprintf(str, "*");
> + return sprintf(str, "[%X-%X]*", clo, chi);
> + }
> +}
> +
> +static void do_usb_entry_multi(struct usb_device_id *id, struct module *mod)
> +{
> + unsigned int devlo, devhi;
> + unsigned char chi, clo;
> + int ndigits;
> + char pattern[32];
> +
> + id->match_flags = TO_NATIVE(id->match_flags);
> + id->idVendor = TO_NATIVE(id->idVendor);
> + id->idProduct = TO_NATIVE(id->idProduct);
> +
> + devlo = id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO ?
> + TO_NATIVE(id->bcdDevice_lo) : 0x0U;
> + devhi = id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI ?
> + TO_NATIVE(id->bcdDevice_hi) : ~0x0U;
> +
> + /*
> + * Some modules (visor) have empty slots as placeholder for
> + * run-time specification that results in catch-all alias
> + */
> + if (!(id->idVendor | id->bDeviceClass | id->bInterfaceClass))
> + return;
> +
> + /* Convert numeric bcdDevice range into fnmatch-able pattern(s) */
> + for (ndigits = sizeof(id->bcdDevice_lo) * 2 - 1; 1; ndigits--) {
By changing the termination condition to devhi < devlo, we could
avoid ghost matches for ranges such as 6009-4002. That's a useless but
well-defined range, and some driver author might find it convenient not to
filter such stuff from his array; silenty misinterpreting it seems unkind.
The loop body is tricky; at first sight it looks OK, but I did not do a full
blown analysis with loop invariants.
/* ndigits is the number of digits that is copied unchanged
* from the lo/hi numbers to the pattern in this iteration.
*/
> + clo = devlo & 0xf;
> + chi = devhi & 0xf;
> + devlo >>= 4;
> + devhi >>= 4;
> +
> + if (devlo = devhi || !ndigits) {
> + if (clo <= chi) {
> + sprint_pattern(pattern, ndigits, devlo, clo, chi);
> + do_usb_entry(id, pattern, mod);
> + printf("%s\n", pattern);
> + }
> + break;
> + }
> +
> + if (clo != 0x0) {
> + sprint_pattern(pattern, ndigits, devlo, clo, 0xf);
> + do_usb_entry(id, pattern, mod);
> + printf("%s\n", pattern);
> + devlo++;
> + }
> +
> + if (chi != 0xf) {
> + sprint_pattern(pattern, ndigits, devhi, 0x0, chi);
> + do_usb_entry(id, pattern, mod);
> + printf("%s\n", pattern);
> + devhi--;
Signedness issues? Consider the range 0001-0002: at start of the loop
body you split in 000 + 1, 000 + 2, here you decrement unsigned devhi
from 0 to 0xfffffff.
> + }
> + }
> +}
> +
> +static void do_usb_table(void *symval, unsigned long size,
> + struct module *mod)
> +{
> + unsigned int i;
> + const unsigned long id_size = sizeof(struct usb_device_id);
> +
> + if (size % id_size || size < id_size) {
> + fprintf(stderr, "*** Warning: %s ids %lu bad size "
> + "(each on %lu)\n", mod->name, size, id_size);
> + }
> + /* Leave last one: it's the terminator. */
> + size -= id_size;
> +
> + for (i = 0; i < size; i += id_size)
> + do_usb_entry_multi(symval + i, mod);
> }
>
> /* Looks like: ieee1394:venNmoNspNverN */
> @@ -262,8 +346,8 @@
> do_table(symval, sym->st_size, sizeof(struct pci_device_id),
> do_pci_entry, mod);
> else if (sym_is(symname, "__mod_usb_device_table"))
> - do_table(symval, sym->st_size, sizeof(struct usb_device_id),
> - do_usb_entry, mod);
> + /* special case to handle bcdDevice ranges */
> + do_usb_table(symval, sym->st_size, mod);
> else if (sym_is(symname, "__mod_ieee1394_device_table"))
> do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id),
> do_ieee1394_entry, mod);
Regards,
Erik
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_ide95&alloc_id\x14396&op=click
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel
next prev parent reply other threads:[~2005-02-23 0:44 UTC|newest]
Thread overview: 148+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-02-11 0:40 [ANNOUNCE] hotplug-ng 001 release Greg KH
2005-02-11 0:52 ` Greg KH
2005-02-11 1:30 ` Kasper Sandberg
2005-02-11 6:41 ` Greg KH
2005-02-11 11:47 ` Kasper Sandberg
2005-02-11 17:06 ` Greg KH
2005-02-12 0:02 ` Kasper Sandberg
2005-02-11 1:07 ` Patrick McFarland
2005-02-11 1:16 ` Greg KH
2005-02-11 20:40 ` Vojtech Pavlik
2005-02-14 4:06 ` Lee Revell
2005-02-14 8:32 ` Paolo Ciarrocchi
2005-02-14 8:51 ` Prakash Punnoor
2005-02-14 23:04 ` Lee Revell
2005-02-14 23:16 ` Greg KH
2005-02-14 23:28 ` Lee Revell
2005-02-15 15:15 ` Stefan Seyfried
2005-02-15 20:12 ` kernel
2005-02-14 23:21 ` Roland Dreier
2005-02-14 23:45 ` [OT] speeding boot process (was Re: [ANNOUNCE] hotplug-ng 001 Lee Revell
2005-02-15 0:16 ` Tim Bird
2005-02-15 1:17 ` Lee Revell
2005-02-15 1:45 ` [OT] speeding boot process (was Re: [ANNOUNCE] hotplug-ng 001 release) Kyle Moffett
2005-02-15 7:32 ` Gábor Lénárt
2005-02-15 8:34 ` Paolo Ciarrocchi
2005-02-15 9:27 ` [OT] speeding boot process Bernd Petrovitsch
2005-02-15 8:55 ` [OT] speeding boot process (was Re: [ANNOUNCE] hotplug-ng 001 Helge Hafting
2005-02-15 9:33 ` Bernd Petrovitsch
2005-02-15 13:20 ` Helge Hafting
2005-02-15 13:28 ` Paulo Marques
2005-02-15 13:50 ` Bernd Petrovitsch
2005-02-15 3:38 ` Jim Crilly
2005-02-15 5:52 ` Nigel Cunningham
2005-02-15 6:15 ` Jim Crilly
2005-02-15 6:39 ` Nigel Cunningham
2005-02-15 19:32 ` Lee Revell
2005-02-17 18:37 ` [OT] speeding boot process (was Re: [ANNOUNCE] hotplug-ng 001 release) jlnance
2005-02-17 19:18 ` Chris Larson
2005-02-19 5:53 ` [OT] speeding boot process (was Re: [ANNOUNCE] hotplug-ng 001 Jim Crilly
2005-02-17 19:58 ` [OT] speeding boot process (was Re: [ANNOUNCE] hotplug-ng 001 release) Helge Hafting
2005-02-19 5:56 ` [OT] speeding boot process (was Re: [ANNOUNCE] hotplug-ng 001 Jim Crilly
2005-02-19 22:47 ` [OT] speeding boot process (was Re: [ANNOUNCE] hotplug-ng 001 release) Helge Hafting
2005-02-20 2:09 ` [OT] speeding boot process (was Re: [ANNOUNCE] hotplug-ng 001 Jim Crilly
2005-02-15 8:33 ` [OT] speeding boot process (was Re: [ANNOUNCE] hotplug-ng 001 release) Paolo Ciarrocchi
2005-02-14 23:43 ` [ANNOUNCE] hotplug-ng 001 release Diego Calleja
2005-02-15 19:51 ` Lee Revell
2005-02-15 21:02 ` Diego Calleja
2005-02-15 21:32 ` Chris Friesen
2005-02-15 21:09 ` Valdis.Kletnieks
2005-02-15 19:56 ` Optimizing disk-I/O [was Re: [ANNOUNCE] hotplug-ng 001 release] Linas Vepstas
2005-02-15 20:46 ` Adam Goode
2005-02-15 21:11 ` Diego Calleja
2005-02-15 21:21 ` Valdis.Kletnieks
2005-02-11 3:18 ` [ANNOUNCE] hotplug-ng 001 release Bill Nottingham
2005-02-11 6:46 ` Greg KH
2005-02-11 16:19 ` Christian Bornträger
2005-02-11 17:01 ` Greg KH
2005-02-11 19:01 ` Erik Andersen
2005-02-11 19:23 ` Greg KH
2005-02-11 21:37 ` Erik van Konijnenburg
2005-02-11 21:49 ` Greg KH
2005-02-11 22:06 ` Erik van Konijnenburg
2005-02-11 22:13 ` Greg KH
2005-02-12 0:48 ` Ingo Oeser
2005-02-14 22:43 ` Greg KH
2005-02-11 8:10 ` Roman Kagan
2005-02-11 8:17 ` Greg KH
2005-02-11 9:52 ` Olivier Galibert
2005-02-11 17:08 ` Greg KH
2005-02-11 10:53 ` Roman Kagan
2005-02-11 17:41 ` Christian Bornträger
2005-02-11 18:15 ` Greg KH
2005-02-11 18:47 ` Marco d'Itri
2005-02-11 19:33 ` Greg KH
2005-02-11 19:36 ` Greg KH
2005-02-11 19:40 ` Marco d'Itri
2005-02-11 19:57 ` Greg KH
2005-02-11 20:06 ` Harald Dunkel
2005-02-11 21:01 ` Greg KH
2005-02-12 8:30 ` Harald Dunkel
2005-02-14 22:36 ` Greg KH
2005-02-15 5:39 ` Harald Dunkel
2005-02-15 7:14 ` Greg KH
2005-02-11 20:10 ` Marco d'Itri
2005-02-11 20:11 ` Roman Kagan
2005-02-11 20:20 ` Marco d'Itri
2005-02-11 20:44 ` Roman Kagan
2005-02-11 20:46 ` Roman Kagan
2005-02-11 20:56 ` Marco d'Itri
2005-02-11 21:01 ` Kay Sievers
2005-02-11 21:10 ` Greg KH
2005-02-17 6:46 ` Michael Tokarev
2005-02-11 21:21 ` Kay Sievers
2005-02-11 21:30 ` Greg KH
2005-02-11 21:33 ` Greg KH
2005-02-11 21:54 ` Marco d'Itri
2005-02-11 21:57 ` Greg KH
2005-02-11 22:05 ` Bill Nottingham
2005-02-11 22:12 ` Greg KH
2005-02-11 22:13 ` Roman Kagan
2005-02-11 22:16 ` Marco d'Itri
2005-02-11 22:18 ` Marco d'Itri
2005-02-11 22:45 ` Roman Kagan
2005-02-11 22:55 ` Roman Kagan
2005-02-11 23:05 ` Erik van Konijnenburg
2005-02-11 23:17 ` Marco d'Itri
2005-02-11 23:29 ` Roman Kagan
2005-02-11 23:35 ` Marco d'Itri
2005-02-12 0:10 ` Roman Kagan
2005-02-12 0:17 ` Marco d'Itri
2005-02-12 0:34 ` Roman Kagan
2005-02-12 11:43 ` Pozsár Balázs
2005-02-12 12:10 ` Roman Kagan
2005-02-12 16:27 ` Alexander E. Patrakov
2005-02-14 22:42 ` Greg KH
2005-02-15 7:34 ` Greg KH
2005-02-15 8:15 ` Christian Zoz
2005-02-15 10:25 ` Alexander E. Patrakov
2005-02-15 12:20 ` [sane-devel] " Julien BLACHE
2005-02-16 10:51 ` Roman Kagan
2005-02-16 11:07 ` Roman Kagan
2005-02-16 11:11 ` Marco d'Itri
2005-02-16 11:18 ` Roman Kagan
2005-02-16 11:27 ` Roman Kagan
2005-02-16 12:37 ` Kay Sievers
2005-02-16 15:17 ` Roman Kagan
2005-02-16 16:08 ` Kay Sievers
2005-02-16 23:02 ` Willem Riede
2005-02-16 23:17 ` Roman Kagan
2005-02-16 23:32 ` Willem Riede
2005-02-18 17:17 ` Patrick Mansfield
2005-02-18 18:11 ` Roman Kagan
2005-02-18 18:33 ` Patrick Mansfield
2005-02-18 19:41 ` Roman Kagan
2005-02-18 20:17 ` Patrick Mansfield
2005-02-17 9:12 ` Roman Kagan
2005-02-21 20:40 ` Erik van Konijnenburg
2005-02-22 10:35 ` Roman Kagan
2005-02-23 0:44 ` Erik van Konijnenburg [this message]
2005-02-23 11:40 ` Roman Kagan
2005-02-23 13:04 ` Erik van Konijnenburg
2005-02-24 6:27 ` Roman Kagan
2005-02-24 19:28 ` Erik van Konijnenburg
2005-02-25 22:07 ` Greg KH
2005-02-25 22:07 ` Greg KH
2005-02-25 22:11 ` Greg KH
2005-02-25 22:12 ` Greg KH
2005-02-26 17:13 ` Roman Kagan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050223014404.E2736@banaan.localdomain \
--to=ekonijn@xs4all.nl \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox