x86, microcode: Conversion from sysdev class caused regression

From: Andreas Herrmann
Date: Wed Apr 11 2012 - 12:39:18 EST


Hi,

commit 8a25a2fd126c621f44f3aeaef80d51f00fc11639 (cpu: convert 'cpu'
and 'machinecheck' sysdev_class to a regular subsystem) causes a
regression in the CPU microcode loader.

Previous behaviour was that module loading failed if no appropriate
CPU was found. Now we get

[ 131.717212] WARNING: at fs/sysfs/group.c:138 mc_device_remove+0x5f/0x70 [microcode]()
[ 131.717218] Hardware name: 01972NG
[ 131.717223] sysfs group ffffffffa00013d0 not found for kobject 'cpu0'
[ 131.717228] Modules linked in: snd_hda_codec_hdmi snd_hda_codec_conexant snd_hda_intel
btusb snd_hda_codec bluetooth thinkpad_acpi rfkill microcode(-) [last unloaded: cfg80211]
[ 131.717254] Pid: 4560, comm: modprobe Not tainted 3.4.0-rc2-00002-g258f742 #5
[ 131.717260] Call Trace:
[ 131.717277] [<ffffffff8103113b>] ? warn_slowpath_common+0x7b/0xc0
[ 131.717287] [<ffffffff81031235>] ? warn_slowpath_fmt+0x45/0x50
[ 131.717300] [<ffffffff81120e74>] ? sysfs_remove_group+0x34/0x120
[ 131.717311] [<ffffffffa00000ef>] ? mc_device_remove+0x5f/0x70 [microcode]
[ 131.717325] [<ffffffff81331eb9>] ? subsys_interface_unregister+0x69/0xa0
[ 131.717336] [<ffffffff81563526>] ? mutex_lock+0x16/0x40
[ 131.717346] [<ffffffffa0000c3e>] ? microcode_exit+0x50/0x92 [microcode]
[ 131.717357] [<ffffffff8107051d>] ? sys_delete_module+0x16d/0x260
[ 131.717369] [<ffffffff810a0065>] ? wait_iff_congested+0x45/0x110
[ 131.717379] [<ffffffff815656af>] ? page_fault+0x1f/0x30
[ 131.717389] [<ffffffff81565ba2>] ? system_call_fastpath+0x16/0x1b


after loading the driver on an unsupported CPU and the subsequent
attempt to unload the driver.

The reason for the error is that subsys_interface_register() doesn't
handle the return value of sif->add_dev (and there's also no unwinding
of the interface registration). Instead subsys_interface_register
always returns 0. This is different to what we had for
sysdev_driver_register(). The latter properly handled return codes of
drv->add() functions.

See Boris' commit f4203e3032e5ae74c3e89df85a5a6d96022d0c49 (sysdev: Do
not register with sysdev when erroring on add).

I don't know whether the microcode driver is the only driver that
is affected.

What's your suggestion for a fix? Should subsys_interface_register()
be fixed or should each affected driver be adapted?


Regards,
Andreas


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/