From 54ef68f584de6f12defa217ecc61fcf395ecd7e2 Mon Sep 17 00:00:00 2001 From: Thierry Vignaud Date: Wed, 12 Sep 2012 10:37:40 +0000 Subject: make ldetect 3x faster (and even faster on machines quite quite a lot of devices such as servers) (modalias_init) split it out of modalias_resolve_module() (modalias_cleanup) move libkmod related cleanups here (hid_probe,find_modules_through_aliases) only initialize libkmod once (which reduces user time from 0.26 to 0.08s & elapsed time from 0.28 to 0.9s) --- pciusb.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'pciusb.c') diff --git a/pciusb.c b/pciusb.c index 9f7f4d5..350b092 100644 --- a/pciusb.c +++ b/pciusb.c @@ -9,9 +9,10 @@ #include #include #include +#include #include "common.h" -static void set_modules_from_modalias_file(struct pciusb_entry *e, char *modalias_path) { +static void set_modules_from_modalias_file(struct kmod_ctx *ctx, struct pciusb_entry *e, char *modalias_path) { FILE *file; file = fopen(modalias_path, "r"); if (file) { @@ -28,7 +29,7 @@ static void set_modules_from_modalias_file(struct pciusb_entry *e, char *modalia modalias[size-1] = 0; ifree(e->module); - e->module = modalias_resolve_module(modalias); + e->module = modalias_resolve_module(ctx, modalias); free(modalias); } else { fprintf(stderr, "Unable to read modalias from %s\n", modalias_path); @@ -36,16 +37,16 @@ static void set_modules_from_modalias_file(struct pciusb_entry *e, char *modalia } } -static void find_pci_modules_through_aliases(struct pciusb_entry *e) { +static void find_pci_modules_through_aliases(struct kmod_ctx *ctx, struct pciusb_entry *e) { char *modalias_path; asprintf(&modalias_path, "/sys/bus/pci/devices/%04x:%02x:%02x.%x/modalias", e->pci_domain, e->pci_bus, e->pci_device, e->pci_function); - set_modules_from_modalias_file(e, modalias_path); + set_modules_from_modalias_file(ctx, e, modalias_path); free(modalias_path); } -static void find_usb_modules_through_aliases(struct pciusb_entry *e) { +static void find_usb_modules_through_aliases(struct kmod_ctx *ctx, struct pciusb_entry *e) { char *usb_prefix, *sysfs_path; DIR *dir; struct dirent *dent; @@ -63,7 +64,7 @@ static void find_usb_modules_through_aliases(struct pciusb_entry *e) { !strncmp(usb_prefix, dent->d_name, strlen(usb_prefix))) { char *modalias_path; asprintf(&modalias_path, "%s/%s/modalias", sysfs_path, dent->d_name); - set_modules_from_modalias_file(e, modalias_path); + set_modules_from_modalias_file(ctx, e, modalias_path); free(modalias_path); /* maybe we would need a "other_modules" field in pciusb_entry to list modules from all USB interfaces */ @@ -77,26 +78,27 @@ end: free(usb_prefix); } -static void find_modules_through_aliases_one(const char *bus, struct pciusb_entry *e) { +static void find_modules_through_aliases_one(struct kmod_ctx *ctx, const char *bus, struct pciusb_entry *e) { if (!strcmp("pci", bus)) { - find_pci_modules_through_aliases(e); + find_pci_modules_through_aliases(ctx, e); } else if (!strcmp("usb", bus)) { - find_usb_modules_through_aliases(e); + find_usb_modules_through_aliases(ctx, e); } } static void find_modules_through_aliases(const char *bus, struct pciusb_entries *entries) { unsigned int i; + struct kmod_ctx *ctx = modalias_init(); for (i = 0; i < entries->nb; i++) { struct pciusb_entry *e = &entries->entries[i]; // No special case found in pcitable ? Then lookup modalias for PCI devices if (e->module && strcmp(e->module, "unknown")) continue; - find_modules_through_aliases_one(bus, e); + find_modules_through_aliases_one(ctx, bus, e); } - modalias_cleanup(); + modalias_cleanup(ctx); } extern int pciusb_find_modules(struct pciusb_entries *entries, const char *fpciusbtable, const descr_lookup descr_lookup, int is_pci) { -- cgit v1.2.1