2012-06-18 03:10:57 |
Eric Miao |
bug |
|
|
added bug |
2012-06-18 03:11:34 |
Eric Miao |
attachment added |
|
fix-race-condition-of-serio-driver-module-not-loading.patch https://bugs.launchpad.net/ubuntu/+source/udev/+bug/1014460/+attachment/3194080/+files/fix-race-condition-of-serio-driver-module-not-loading.patch |
|
2012-06-18 03:12:28 |
Eric Miao |
bug |
|
|
added subscriber Sebastien Bacher |
2012-06-18 03:12:36 |
Eric Miao |
bug |
|
|
added subscriber Martin Pitt |
2012-06-18 03:14:07 |
Eric Miao |
bug |
|
|
added subscriber Canonical Hardware Enablement Team |
2012-06-18 03:14:20 |
Eric Miao |
tags |
|
blocks-hwcert-enablement |
|
2012-06-18 04:22:50 |
Ubuntu Foundations Team Bug Bot |
tags |
blocks-hwcert-enablement |
blocks-hwcert-enablement patch |
|
2012-06-18 04:23:00 |
Ubuntu Foundations Team Bug Bot |
bug |
|
|
added subscriber Ubuntu Review Team |
2012-06-18 05:28:46 |
Eric Miao |
nominated for series |
|
Ubuntu Oneiric |
|
2012-06-18 05:28:46 |
Eric Miao |
nominated for series |
|
Ubuntu Precise |
|
2012-06-18 05:28:46 |
Eric Miao |
nominated for series |
|
Ubuntu Quantal |
|
2012-06-18 13:15:20 |
Sebastien Bacher |
bug |
|
|
added subscriber Ubuntu Sponsors Team |
2012-06-19 18:01:34 |
Brian Murray |
udev (Ubuntu): importance |
Undecided |
High |
|
2012-06-21 10:34:00 |
Martin Pitt |
udev (Ubuntu): status |
New |
Triaged |
|
2012-06-28 03:10:38 |
Eric Miao |
tags |
blocks-hwcert-enablement patch |
blocks-hwcert-enablement patch rls-q-incoming |
|
2012-07-03 07:10:46 |
Steve Langasek |
udev (Ubuntu): status |
Triaged |
Fix Committed |
|
2012-07-03 07:11:08 |
Launchpad Janitor |
branch linked |
|
lp:~ubuntu-core-dev/ubuntu/quantal/udev/ubuntu |
|
2012-07-03 07:35:19 |
Launchpad Janitor |
udev (Ubuntu): status |
Fix Committed |
Fix Released |
|
2012-07-03 08:16:16 |
Launchpad Janitor |
branch linked |
|
lp:ubuntu/udev |
|
2012-07-03 15:29:08 |
Steve Langasek |
bug task added |
|
udev (Ubuntu Precise) |
|
2012-07-03 15:29:17 |
Steve Langasek |
bug task added |
|
udev (Ubuntu Oneiric) |
|
2012-07-03 15:29:45 |
Steve Langasek |
udev (Ubuntu Oneiric): status |
New |
Triaged |
|
2012-07-03 15:29:47 |
Steve Langasek |
udev (Ubuntu Precise): status |
New |
Triaged |
|
2012-07-03 15:29:48 |
Steve Langasek |
udev (Ubuntu Oneiric): importance |
Undecided |
High |
|
2012-07-03 15:29:50 |
Steve Langasek |
udev (Ubuntu Precise): importance |
Undecided |
High |
|
2012-07-09 15:21:30 |
Stéphane Graber |
udev (Ubuntu Oneiric): status |
Triaged |
Incomplete |
|
2012-07-09 15:21:35 |
Stéphane Graber |
udev (Ubuntu Precise): status |
Triaged |
Incomplete |
|
2012-07-11 10:58:24 |
Anthony Wong |
description |
This happens very infrequently. The symptom is touchpad not working after boot up unless a reboot is made, or a manual "modprobe psmouse" is performed on the command line. Movement or click activities on the touchpad during system startup will increase the chance of happening of this issue.
The root cause is a race condition upon system startup, that the serio1 device (i.e. the AUX port) could be temporarily binded to the keyboard driver, and thus udev rule will ignore the event by not loading psmouse at all. A detailed explanation of the theory is as follows:
1. serio ports (e.g. AUX port for touchpad) are different than other devices that:
- the kernel is using a dedicated kernel thread kseriod to handle the events
- interrupts on serio port will trigger connect attempt, as the OS has no idea when a keyboard/mouse could be plugged into the computer
2. The AT keyboard driver atkbd.c is built-in to the kernel for speed up as there will be normally an AT keyboard present, however, as on a normal PC, the keyboard can be connected to either the keyboard PS/2 port (i.e. KBD port), or the mouse PS/2 port (i.e. AUX port), the atkbd driver will be probed each time an interrupt is generated on the AUX port, in case there is a plug
3. When doing the probing, the serio1 device will be temporarily binded with atkbd, and this is in the context of kseriod
4. udev has the chance of being launched at the same time, the time that udev is launched, there will be a trigger to replay all uevents
5. that trigger will request uevents to be generated from the kernel, and if serio1 happens to be in the middle of a probing (most likely with atkbd), the uevent generated will have DRIVER=atkbd with it
6. psmouse is being built as a module, udev is following the rule below to load psmouse ondemand:
/lib/udev/rules.d/80-drivers.rules:
...
DRIVER!="?*", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe -bv $env{MODALIAS}"
7. So if uevent for serio1 happens to be with DRIVER entry, this rule will _not_ be performed as DRIVER!="?*" is _not_ matched, thus modprobe will not load psmouse on demand
8. One simple fix is to add one additional rule to 80-drivers.rules, so that serio events are treated special that modprobe will anyway be performed, e.g.
SUBSYSTEM=="serio", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe -bv $env{MODALIAS}" |
SRU Justification
=================
[Impact]
Sometimes the notebook touchpad is non-functional upon system boot or resuming from suspend. OEMs that we work with consider this bug as very bad user experience.
[Test Case]
This bug happens infrequently, but on machines that are affected by this bug, one can prove this fix empirically by rebooting the machine many times (e.g. >50) and make sure the touchpad is working after each reboot.
[Regression Potential]
This bug is fixed by adding a new udev rule, and this rule is to modprobe the kernel module when serio event is received. This does not have adverse effect on unaffected systems, and I can't see how it will lead to regressions.
--
Original description:
This happens very infrequently. The symptom is touchpad not working after boot up unless a reboot is made, or a manual "modprobe psmouse" is performed on the command line. Movement or click activities on the touchpad during system startup will increase the chance of happening of this issue.
The root cause is a race condition upon system startup, that the serio1 device (i.e. the AUX port) could be temporarily binded to the keyboard driver, and thus udev rule will ignore the event by not loading psmouse at all. A detailed explanation of the theory is as follows:
1. serio ports (e.g. AUX port for touchpad) are different than other devices that:
- the kernel is using a dedicated kernel thread kseriod to handle the events
- interrupts on serio port will trigger connect attempt, as the OS has no idea when a keyboard/mouse could be plugged into the computer
2. The AT keyboard driver atkbd.c is built-in to the kernel for speed up as there will be normally an AT keyboard present, however, as on a normal PC, the keyboard can be connected to either the keyboard PS/2 port (i.e. KBD port), or the mouse PS/2 port (i.e. AUX port), the atkbd driver will be probed each time an interrupt is generated on the AUX port, in case there is a plug
3. When doing the probing, the serio1 device will be temporarily binded with atkbd, and this is in the context of kseriod
4. udev has the chance of being launched at the same time, the time that udev is launched, there will be a trigger to replay all uevents
5. that trigger will request uevents to be generated from the kernel, and if serio1 happens to be in the middle of a probing (most likely with atkbd), the uevent generated will have DRIVER=atkbd with it
6. psmouse is being built as a module, udev is following the rule below to load psmouse ondemand:
/lib/udev/rules.d/80-drivers.rules:
...
DRIVER!="?*", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe -bv $env{MODALIAS}"
7. So if uevent for serio1 happens to be with DRIVER entry, this rule will _not_ be performed as DRIVER!="?*" is _not_ matched, thus modprobe will not load psmouse on demand
8. One simple fix is to add one additional rule to 80-drivers.rules, so that serio events are treated special that modprobe will anyway be performed, e.g.
SUBSYSTEM=="serio", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe -bv $env{MODALIAS}" |
|
2012-07-11 10:58:50 |
Anthony Wong |
udev (Ubuntu Oneiric): status |
Incomplete |
Triaged |
|
2012-07-11 10:58:52 |
Anthony Wong |
udev (Ubuntu Precise): status |
Incomplete |
Triaged |
|
2012-07-13 06:18:44 |
Chris Halse Rogers |
removed subscriber Ubuntu Review Team |
|
|
|
2012-07-13 06:18:45 |
Chris Halse Rogers |
removed subscriber Ubuntu Sponsors Team |
|
|
|
2012-07-16 05:13:15 |
Launchpad Janitor |
branch linked |
|
lp:~ubuntu-core-dev/ubuntu/precise/udev/ubuntu |
|
2012-07-16 05:25:37 |
Launchpad Janitor |
branch linked |
|
lp:~ubuntu-core-dev/ubuntu/oneiric/udev/ubuntu |
|
2012-07-19 08:05:43 |
Sebastien Bacher |
bug |
|
|
added subscriber Ubuntu Stable Release Updates Team |
2012-07-19 15:56:13 |
Brian Murray |
udev (Ubuntu Precise): status |
Triaged |
Fix Committed |
|
2012-07-19 15:56:17 |
Brian Murray |
bug |
|
|
added subscriber SRU Verification |
2012-07-19 15:56:23 |
Brian Murray |
tags |
blocks-hwcert-enablement patch rls-q-incoming |
blocks-hwcert-enablement patch rls-q-incoming verification-needed |
|
2012-07-20 08:23:15 |
Philipp Schlesinger |
bug |
|
|
added subscriber Philipp Schlesinger |
2012-07-20 15:20:33 |
Kamal Mostafa |
bug |
|
|
added subscriber Kamal Mostafa |
2012-07-21 21:00:56 |
Chris Van Hoof |
udev (Ubuntu Precise): assignee |
|
Eric Miao (eric.y.miao) |
|
2012-07-23 17:36:21 |
Launchpad Janitor |
branch linked |
|
lp:ubuntu/precise-proposed/udev |
|
2012-07-26 09:41:43 |
Anthony Wong |
udev (Ubuntu Oneiric): assignee |
|
Eric Miao (eric.y.miao) |
|
2012-08-01 18:59:26 |
Clint Byrum |
udev (Ubuntu Oneiric): status |
Triaged |
Fix Committed |
|
2012-08-01 19:17:39 |
Launchpad Janitor |
branch linked |
|
lp:ubuntu/oneiric-proposed/udev |
|
2012-08-02 13:31:34 |
Sebastien Bacher |
tags |
blocks-hwcert-enablement patch rls-q-incoming verification-needed |
blocks-hwcert-enablement patch rls-q-incoming verification-done |
|
2012-08-02 20:11:38 |
Brian Murray |
removed subscriber Ubuntu Stable Release Updates Team |
|
|
|
2012-08-02 20:14:10 |
Launchpad Janitor |
udev (Ubuntu Precise): status |
Fix Committed |
Fix Released |
|
2012-08-08 22:02:10 |
Launchpad Janitor |
udev (Ubuntu Oneiric): status |
Fix Committed |
Fix Released |
|