udev performance
Jakub Jelinek
jakub at redhat.com
Wed Sep 12 07:23:31 UTC 2007
On Wed, Sep 12, 2007 at 09:04:09AM +0200, Harald Hoyer wrote:
> Using a modprobe wrapper, I count 56 /sbin/modprobe calls taking ~4s
> (non-profiling udev) on my laptop, from which 23 are not found.
> 23 * /sbin/modprobe with a modalias, which is not found, sums up to ~1s
> (25%) of the time.
> So we can easily eliminate 25% of the modprobe time (on my laptop), by
> collecting all /sys/***/modalias at depmod time, which cannot be resolved,
> and store them in /lib/modules/$(uname -r)/modules.unresolved, which could
> be searched first by modprobe.
BTW, each read_depends below will scan the whole modules.dep (if unsuccessful)
or first part thereof. In the modprobes that take most of the time, is
modules.dep read just once or multiple times?
/* Returns the resolved alias, options */
read_toplevel_config(config, modulearg, 0,
remove, &modoptions, &commands, &aliases, &blacklist);
/* No luck? Try symbol names, if starts with symbol:. */
if (!aliases
&& strncmp(modulearg, "symbol:", strlen("symbol:")) == 0)
read_config(symfilename, modulearg, 0,
remove, &modoptions, &commands,
&aliases, &blacklist);
if (!aliases) {
/* We only use canned aliases as last resort. */
read_depends(dirname, modulearg, &list);
if (list_empty(&list)
&& !find_command(modulearg, commands))
{
read_config(aliasfilename, modulearg, 0,
remove, &modoptions, &commands,
&aliases, &blacklist);
aliases = apply_blacklist(aliases, blacklist);
}
}
if (aliases) {
errfn_t err = error;
/* More than one alias? Don't bail out on failure. */
if (aliases->next)
err = warn;
while (aliases) {
/* Add the options for this alias. */
char *opts = NOFAIL(strdup(optstring));
opts = add_extra_options(modulearg,
opts, modoptions);
read_depends(dirname, aliases->module, &list);
handle_module(aliases->module, &list, newname,
remove, opts, first_time, err,
dry_run, verbose, modoptions,
commands, ignore_commands,
ignore_proc, strip_vermagic,
strip_modversion,
unknown_silent,
optstring);
aliases = aliases->next;
INIT_LIST_HEAD(&list);
}
} else {
if (use_blacklist
&& find_blacklist(modulearg, blacklist))
continue;
handle_module(modulearg, &list, newname, remove,
optstring, first_time, error, dry_run,
verbose, modoptions, commands,
ignore_commands, ignore_proc,
strip_vermagic, strip_modversion,
unknown_silent, optstring);
}
Jakub
More information about the fedora-devel-list
mailing list