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