summaryrefslogtreecommitdiffstats
path: root/pciusb.c
diff options
context:
space:
mode:
authorThierry Vignaud <tv@mageia.org>2012-09-12 10:37:40 +0000
committerThierry Vignaud <tv@mageia.org>2012-09-12 10:37:40 +0000
commit54ef68f584de6f12defa217ecc61fcf395ecd7e2 (patch)
tree19a8bd7b24cdf96ff3b5d5e58369aa9e8f4c6a23 /pciusb.c
parent42b81d579dc2f0323c6728e4d12002b1b8ed349b (diff)
downloadldetect-54ef68f584de6f12defa217ecc61fcf395ecd7e2.tar
ldetect-54ef68f584de6f12defa217ecc61fcf395ecd7e2.tar.gz
ldetect-54ef68f584de6f12defa217ecc61fcf395ecd7e2.tar.bz2
ldetect-54ef68f584de6f12defa217ecc61fcf395ecd7e2.tar.xz
ldetect-54ef68f584de6f12defa217ecc61fcf395ecd7e2.zip
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)
Diffstat (limited to 'pciusb.c')
-rw-r--r--pciusb.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/pciusb.c b/pciusb.c
index 9f7f4d5..350b092 100644
--- a/pciusb.c
+++ b/pciusb.c
@@ -9,9 +9,10 @@
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
+#include <libkmod.h>
#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) {