auto selects the default scheme, which automatically
enables eagerfpu restore for xsaveopt.
+ module.async_probe [KNL]
+ Enable asynchronous probe on this module.
+
early_ioremap_debug [KNL]
Enable debug messages in early_ioremap support. This
is useful for tracking down temporary early mappings
bool driver_allows_async_probing(struct device_driver *drv)
{
- return drv->probe_type == PROBE_PREFER_ASYNCHRONOUS;
+ if (drv->probe_type == PROBE_PREFER_ASYNCHRONOUS)
+ return true;
+
+ if (drv->owner && drv->owner->async_probe_requested)
+ return true;
+
+ return false;
}
struct device_attach_data {
* respective probe routines. This tells the core what to
* expect and prefer.
*
- * @PROBE_SYNCHRONOUS: Default. Drivers expect their probe routines
+ * @PROBE_DEFAULT_STRATEGY: Drivers expect their probe routines
* to run synchronously with driver and device registration
* (with the exception of -EPROBE_DEFER handling - re-probing
- * always ends up being done asynchronously).
+ * always ends up being done asynchronously) unless user
+ * explicitly requested asynchronous probing via module
+ * parameter.
* @PROBE_PREFER_ASYNCHRONOUS: Drivers for "slow" devices which
* probing order is not essential for booting the system may
* opt into executing their probes asynchronously.
* drivers.
*/
enum probe_type {
- PROBE_SYNCHRONOUS,
+ PROBE_DEFAULT_STRATEGY,
PROBE_PREFER_ASYNCHRONOUS,
};
bool sig_ok;
#endif
+ bool async_probe_requested;
+
/* symbols that will be GPL-only in the near future. */
const struct kernel_symbol *gpl_future_syms;
const unsigned long *gpl_future_crcs;
*
* http://thread.gmane.org/gmane.linux.kernel/1420814
*/
- if (current->flags & PF_USED_ASYNC)
+ if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC))
async_synchronize_full();
mutex_lock(&module_mutex);
static int unknown_module_param_cb(char *param, char *val, const char *modname,
void *arg)
{
+ struct module *mod = arg;
+ int ret;
+
+ if (strcmp(param, "async_probe") == 0) {
+ mod->async_probe_requested = true;
+ return 0;
+ }
+
/* Check for magic 'dyndbg' arg */
- int ret = ddebug_dyndbg_module_param_cb(param, val, modname);
+ ret = ddebug_dyndbg_module_param_cb(param, val, modname);
if (ret != 0)
pr_warn("%s: unknown parameter '%s' ignored\n", modname, param);
return 0;