From: Dexuan Cui <decui@microsoft.com> Date: 2014-08-12 02:28:12
hyperv_keyboard invokes serio_interrupt(), which needs a valid serio driver
like atkbd.c.
atkbd.c depends on libps2.c because it invokes ps2_command().
libps2.c depends on i8042.c because it invokes i8042_check_port_owner().
As a result, hyperv_keyboard actually depends on i8042.c.
For a Generation 2 Hyper-V VM (meaning no i8042 device emulated), if a Linux
VM (like Arch Linux) happens to configure CONFIG_SERIO_I8042=m rather than
=y, atkbd.ko can't load because i8042.ko can't load(due to no i8042 device
emulated) and finally hyperv_keyboard can't work and the user can't input:
https://bugs.archlinux.org/task/39820
(Ubuntu/RHEL/SUSE aren't affected since they use CONFIG_SERIO_I8042=y)
Decoupling the dependency between hyperv_keyboard and i8042 needs
non-trivial efforts and is hence a long term goal.
For now, let's make the dependency explicit so people can beware of this.
Thank Claudio for the initial reporting, investigation and suggesting the fix.
Signed-off-by: Dexuan Cui <decui@microsoft.com>
Reported-by: Claudio Latini <redacted>
Cc: K. Y. Srinivasan <kys@microsoft.com>
---
drivers/input/serio/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
On Mon, Aug 11, 2014 at 08:30:40PM -0700, Dexuan Cui wrote:
hyperv_keyboard invokes serio_interrupt(), which needs a valid serio driver
like atkbd.c.
atkbd.c depends on libps2.c because it invokes ps2_command().
libps2.c depends on i8042.c because it invokes i8042_check_port_owner().
As a result, hyperv_keyboard actually depends on i8042.c.
For a Generation 2 Hyper-V VM (meaning no i8042 device emulated), if a Linux
VM (like Arch Linux) happens to configure CONFIG_SERIO_I8042=m rather than
=y, atkbd.ko can't load because i8042.ko can't load(due to no i8042 device
emulated) and finally hyperv_keyboard can't work and the user can't input:
https://bugs.archlinux.org/task/39820
(Ubuntu/RHEL/SUSE aren't affected since they use CONFIG_SERIO_I8042=y)
Decoupling the dependency between hyperv_keyboard and i8042 needs
non-trivial efforts and is hence a long term goal.
For now, let's make the dependency explicit so people can beware of this.
You didn't make anyone "aware" of this, you just prevented people from
being able to select the module unless they build the driver into the
kernel, which isn't very nice.
What exactly needs to be done to fix this "correctly" that is going to
take too much work at the moment?
thanks,
greg k-h
Decoupling the dependency between hyperv_keyboard and i8042 needs
non-trivial efforts and is hence a long term goal.
For now, let's make the dependency explicit so people can beware of this.
You didn't make anyone "aware" of this, you just prevented people from
being able to select the module unless they build the driver into the
kernel, which isn't very nice.
Yes, exactly.
What exactly needs to be done to fix this "correctly" that is going to
take too much work at the moment?
Hi Greg,
The current implementation of hyperv-keyboard.c borrows
serio_interrupt() to pass the key strokes to the high level component.
serio_interrupt() actually depends on atkbd.c and i8042.c, so this doesn't
work for a Generation 2 hyper-v guest because no i8042 keyboard controller
is emulated: http://technet.microsoft.com/en-us/library/dn282285.aspx
To decouple the dependency between the hyperv-keyboard and i8042
modules, I suppose we probably have to re-implement hyperv-keyboard by
using input_allocate_device(), input_register_device(), and using
input_report_key() to pass the key strokes to the high level.
I'll have to need some time for further investigation and a new
implementation. Before the new code is completely ready, IMHO the
patch can help to avoid a bad user experience like Arch Linux working
as a Generation 2 hyper-v guest.
BTW, looks most of Linux distros (like RHEL, Ubuntu, SUSE) have
CONFIG_SERIO_I8042=y, probably because it's the result of
"make defconfig". So the patch actually doesn't affect these distros.
Thanks,
-- Dexuan
Decoupling the dependency between hyperv_keyboard and i8042 needs
non-trivial efforts and is hence a long term goal.
For now, let's make the dependency explicit so people can beware of this.
You didn't make anyone "aware" of this, you just prevented people from
being able to select the module unless they build the driver into the
kernel, which isn't very nice.
Yes, exactly.
quoted
What exactly needs to be done to fix this "correctly" that is going to
take too much work at the moment?
Hi Greg,
The current implementation of hyperv-keyboard.c borrows
serio_interrupt() to pass the key strokes to the high level component.
serio_interrupt() actually depends on atkbd.c and i8042.c, so this doesn't
work for a Generation 2 hyper-v guest because no i8042 keyboard controller
is emulated: http://technet.microsoft.com/en-us/library/dn282285.aspx
To decouple the dependency between the hyperv-keyboard and i8042
modules, I suppose we probably have to re-implement hyperv-keyboard by
using input_allocate_device(), input_register_device(), and using
input_report_key() to pass the key strokes to the high level.
Yes, that would be the best thing to do, and shouldn't be that hard to
create an input driver, it's pretty simple code, right?
I'll have to need some time for further investigation and a new
implementation. Before the new code is completely ready, IMHO the
patch can help to avoid a bad user experience like Arch Linux working
as a Generation 2 hyper-v guest.
You are still preventing Arch from working here, as the driver can't be
built at all, right?
BTW, looks most of Linux distros (like RHEL, Ubuntu, SUSE) have
CONFIG_SERIO_I8042=y, probably because it's the result of
"make defconfig". So the patch actually doesn't affect these distros.
Or maybe it is beause they use older kernels and like to turn on every
single possible option :)
thanks,
greg k-h
From: Dexuan Cui <decui@microsoft.com> Date: 2014-08-12 07:16:20
-----Original Message-----
From: linux-kernel-owner@vger.kernel.org [mailto:linux-kernel-
owner@vger.kernel.org] On Behalf Of Greg KH
quoted
quoted
What exactly needs to be done to fix this "correctly" that is going to
take too much work at the moment?
To decouple the dependency between the hyperv-keyboard and i8042
modules, I suppose we probably have to re-implement hyperv-keyboard by
using input_allocate_device(), input_register_device(), and using
input_report_key() to pass the key strokes to the high level.
Yes, that would be the best thing to do, and shouldn't be that hard to
create an input driver, it's pretty simple code, right?
Hi Greg,
Thanks for the confirmation!
I didn't use the APIs before.
I think I need a couple of days to code, test and debug it while I have many
things at hand at present. :-(
quoted
I'll have to need some time for further investigation and a new
implementation. Before the new code is completely ready, IMHO the
patch can help to avoid a bad user experience like Arch Linux working
as a Generation 2 hyper-v guest.
You are still preventing Arch from working here, as the driver can't be
built at all, right?
The driver can build(compile) fine.
The issue is: the latest Arch Linux release doesn't have a working (virtual)
keyboard when it runs as Generation 2 hyper-v guest -- when it runs as
a "traditional" Generation 1 hyper-v guest, everything works fine.
I hope this patch can temporarily help Arch users if they find the issue
and if they can rebuild the kernel.
quoted
BTW, looks most of Linux distros (like RHEL, Ubuntu, SUSE) have
CONFIG_SERIO_I8042=y, probably because it's the result of
"make defconfig". So the patch actually doesn't affect these distros.
Or maybe it is beause they use older kernels and like to turn on every
single possible option :)
If these 3 distros had =m, we could have found the issue earlier.
Thanks,
-- Dexuan
On Tue, Aug 12, 2014 at 07:15:25AM +0000, Dexuan Cui wrote:
quoted
-----Original Message-----
From: linux-kernel-owner@vger.kernel.org [mailto:linux-kernel-
owner@vger.kernel.org] On Behalf Of Greg KH
quoted
quoted
What exactly needs to be done to fix this "correctly" that is going to
take too much work at the moment?
To decouple the dependency between the hyperv-keyboard and i8042
modules, I suppose we probably have to re-implement hyperv-keyboard by
using input_allocate_device(), input_register_device(), and using
input_report_key() to pass the key strokes to the high level.
Yes, that would be the best thing to do,
Why? The backend still delivers AT keyboard data, so why does it make
sense to write a new driver instead of making sure you can load
atkbd/libps2 even without i8042 loaded?
quoted
and shouldn't be that hard to
create an input driver, it's pretty simple code, right?
Hi Greg,
Thanks for the confirmation!
I didn't use the APIs before.
I think I need a couple of days to code, test and debug it while I have many
things at hand at present. :-(
quoted
quoted
I'll have to need some time for further investigation and a new
implementation. Before the new code is completely ready, IMHO the
patch can help to avoid a bad user experience like Arch Linux working
as a Generation 2 hyper-v guest.
You are still preventing Arch from working here, as the driver can't be
built at all, right?
The driver can build(compile) fine.
The issue is: the latest Arch Linux release doesn't have a working (virtual)
keyboard when it runs as Generation 2 hyper-v guest -- when it runs as
a "traditional" Generation 1 hyper-v guest, everything works fine.
I hope this patch can temporarily help Arch users if they find the issue
and if they can rebuild the kernel.
The Arch users can simply select to build i8042 into the kernel as a
workaround.
The proper solution is to allow loading libps2 module even if i8042 did
not find its device. I wish I could simply drop this i8042_lock_chip and
stuff, but unfortunately i8042 ports are not truly independent. We need
to figure a way for libps2 to engage locking in i8042 if the driver is
loaded, otherwise just ignore it.
Thanks.
--
Dmitry
From: KY Srinivasan <kys@microsoft.com> Date: 2014-08-12 18:03:34
-----Original Message-----
From: Dmitry Torokhov [mailto:dmitry.torokhov@gmail.com]
Sent: Tuesday, August 12, 2014 10:55 AM
To: Dexuan Cui
Cc: Greg KH; linux-input@vger.kernel.org; linux-kernel@vger.kernel.org;
driverdev-devel@linuxdriverproject.org; olaf@aepfle.de;
apw@canonical.com; jasowang@redhat.com; KY Srinivasan; Haiyang Zhang
Subject: Re: [PATCH] Input: serio: make HYPERV_KEYBOARD depend on
SERIO_I8042=y
On Tue, Aug 12, 2014 at 07:15:25AM +0000, Dexuan Cui wrote:
quoted
quoted
-----Original Message-----
From: linux-kernel-owner@vger.kernel.org [mailto:linux-kernel-
owner@vger.kernel.org] On Behalf Of Greg KH
quoted
quoted
What exactly needs to be done to fix this "correctly" that is
going to take too much work at the moment?
To decouple the dependency between the hyperv-keyboard and i8042
modules, I suppose we probably have to re-implement
hyperv-keyboard by using input_allocate_device(),
input_register_device(), and using
input_report_key() to pass the key strokes to the high level.
Yes, that would be the best thing to do,
Why? The backend still delivers AT keyboard data, so why does it make sense
to write a new driver instead of making sure you can load
atkbd/libps2 even without i8042 loaded?
quoted
quoted
and shouldn't be that hard to
create an input driver, it's pretty simple code, right?
Hi Greg,
Thanks for the confirmation!
I didn't use the APIs before.
I think I need a couple of days to code, test and debug it while I
have many things at hand at present. :-(
quoted
quoted
I'll have to need some time for further investigation and a new
implementation. Before the new code is completely ready, IMHO the
patch can help to avoid a bad user experience like Arch Linux
working as a Generation 2 hyper-v guest.
You are still preventing Arch from working here, as the driver can't
be built at all, right?
The driver can build(compile) fine.
The issue is: the latest Arch Linux release doesn't have a working
(virtual) keyboard when it runs as Generation 2 hyper-v guest -- when
it runs as a "traditional" Generation 1 hyper-v guest, everything works fine.
I hope this patch can temporarily help Arch users if they find the
issue and if they can rebuild the kernel.
The Arch users can simply select to build i8042 into the kernel as a
workaround.
The proper solution is to allow loading libps2 module even if i8042 did not find
its device. I wish I could simply drop this i8042_lock_chip and stuff, but
unfortunately i8042 ports are not truly independent. We need to figure a
way for libps2 to engage locking in i8042 if the driver is loaded, otherwise just
ignore it.
When I first wrote this driver, we took the decision not to replicate all the code in the at keyboard driver and to
make this a serio based driver. I like the proposal made by Dmitry here.
Regards,
K. Y
From: Dexuan Cui <decui@microsoft.com> Date: 2014-08-13 05:25:26
-----Original Message-----
From: Dmitry Torokhov
Sent: Wednesday, August 13, 2014 1:55 AM
quoted
quoted
quoted
To decouple the dependency between the hyperv-keyboard and i8042
modules, I suppose we probably have to re-implement hyperv-
keyboard by
quoted
quoted
quoted
using input_allocate_device(), input_register_device(), and using
input_report_key() to pass the key strokes to the high level.
Yes, that would be the best thing to do,
Why? The backend still delivers AT keyboard data, so why does it make
sense to write a new driver instead of making sure you can load
atkbd/libps2 even without i8042 loaded?
Hi Dmitry,
Thanks for pointing this out!
I didn't realize input_report_key() can't accept AT keyboard scan codes.
quoted
The issue is: the latest Arch Linux release doesn't have a working (virtual)
keyboard when it runs as Generation 2 hyper-v guest -- when it runs as
a "traditional" Generation 1 hyper-v guest, everything works fine.
I hope this patch can temporarily help Arch users if they find the issue
and if they can rebuild the kernel.
The Arch users can simply select to build i8042 into the kernel as a
workaround.
I agree.
The proper solution is to allow loading libps2 module even if i8042 did
not find its device. I wish I could simply drop this i8042_lock_chip and
stuff, but unfortunately i8042 ports are not truly independent. We need
to figure a way for libps2 to engage locking in i8042 if the driver is
loaded, otherwise just ignore it.
Dmitry
Yeah, this seems the right solution.
How about this:
in libps2.c let's add and export a function pointer
i8042_lock_chip_if_port_owner: it is used to replace the current
if (i8042_check_port_owner(ps2dev->serio))
i8042_lock_chip();
The function pointer has a default value NULL, and in i8042.c: i8042_init()
we set the function pointer if an i8042 device is found?
Thanks,
-- Dexuan
From: Dexuan Cui <decui@microsoft.com> Date: 2014-08-13 05:28:48
-----Original Message-----
From: KY Srinivasan
quoted
The Arch users can simply select to build i8042 into the kernel as a
workaround.
The proper solution is to allow loading libps2 module even if i8042 did not
find
quoted
its device. I wish I could simply drop this i8042_lock_chip and stuff, but
unfortunately i8042 ports are not truly independent. We need to figure a
way for libps2 to engage locking in i8042 if the driver is loaded, otherwise
just
quoted
ignore it.
When I first wrote this driver, we took the decision not to replicate all the
code in the at keyboard driver and to
make this a serio based driver. I like the proposal made by Dmitry here.
K. Y
Thanks for explaining the background, KY!
I like Dmitry's proposal too.
Thanks,
-- Dexuan
On Wed, Aug 13, 2014 at 05:24:35AM +0000, Dexuan Cui wrote:
quoted
-----Original Message-----
From: Dmitry Torokhov
Sent: Wednesday, August 13, 2014 1:55 AM
quoted
quoted
quoted
To decouple the dependency between the hyperv-keyboard and i8042
modules, I suppose we probably have to re-implement hyperv-
keyboard by
quoted
quoted
quoted
using input_allocate_device(), input_register_device(), and using
input_report_key() to pass the key strokes to the high level.
Yes, that would be the best thing to do,
Why? The backend still delivers AT keyboard data, so why does it make
sense to write a new driver instead of making sure you can load
atkbd/libps2 even without i8042 loaded?
Hi Dmitry,
Thanks for pointing this out!
I didn't realize input_report_key() can't accept AT keyboard scan codes.
quoted
quoted
The issue is: the latest Arch Linux release doesn't have a working (virtual)
keyboard when it runs as Generation 2 hyper-v guest -- when it runs as
a "traditional" Generation 1 hyper-v guest, everything works fine.
I hope this patch can temporarily help Arch users if they find the issue
and if they can rebuild the kernel.
The Arch users can simply select to build i8042 into the kernel as a
workaround.
I agree.
quoted
The proper solution is to allow loading libps2 module even if i8042 did
not find its device. I wish I could simply drop this i8042_lock_chip and
stuff, but unfortunately i8042 ports are not truly independent. We need
to figure a way for libps2 to engage locking in i8042 if the driver is
loaded, otherwise just ignore it.
Dmitry
Yeah, this seems the right solution.
How about this:
in libps2.c let's add and export a function pointer
i8042_lock_chip_if_port_owner: it is used to replace the current
if (i8042_check_port_owner(ps2dev->serio))
i8042_lock_chip();
The function pointer has a default value NULL, and in i8042.c: i8042_init()
we set the function pointer if an i8042 device is found?
Hmm, that would make i8042 depend on libps2, which might be OK, but how
do you deal with the locking here? I.e. what happens if you unload i8042
right when we go through this sequence?
Maybe we need to split i8042_lock_chip() and friends into a separate
module that always loads, even if i8042 is not present.
Thanks.
--
Dmitry
From: Dexuan Cui <decui@microsoft.com> Date: 2014-08-14 06:08:34
-----Original Message-----
From: Dmitry Torokhov
quoted
How about this:
in libps2.c let's add and export a function pointer
i8042_lock_chip_if_port_owner: it is used to replace the current
if (i8042_check_port_owner(ps2dev->serio))
i8042_lock_chip();
The function pointer has a default value NULL, and in i8042.c: i8042_init()
we set the function pointer if an i8042 device is found?
Hmm, that would make i8042 depend on libps2, which might be OK, but how
do you deal with the locking here? I.e. what happens if you unload i8042
right when we go through this sequence?
Ok, I got it.
Maybe we need to split i8042_lock_chip() and friends into a separate
module that always loads, even if i8042 is not present.
Dmitry
Good idea!
However the more difficult thing is
i8042_check_port_owner() -- used by libps2.c too.
Then the separate module will also have to include and EXPORT
DEFINE_SPINLOCK(i8042_lock);
struct i8042_port i8042_ports[I8042_NUM_PORTS];
?
This seems a non-trivial change... :-(
Thanks,
-- Dexuan
From: Mark Laws <hidden> Date: 2016-04-18 15:23:55
Hi,
Please keep me Cc:ed in any replies as I'm not on these lists.
Description of the fix is in the commit message for the patch.
Discussion:
Given that most distributions were already statically linking i8042.c,
having it not unload even if there is no i8042 device seems a better fix
than the alternatives:
a) requiring users build a kernel with CONFIG_SERIO_I8042=y;
b) duplicating the needed bits from atkbd.c in hyperv-keyboard, or;
c) this patch, but with a "stay_resident=1" option to enable the
workaround. Detecting presence of Hyper-V could be handled by udev,
which would pass this option, but every distribution would need to
fix their rules (certainly we don't want to check for Hyper-V in
i8042.c)
Mark Laws (1):
Input: i8042 - Fix console keyboard support on Gen2 Hyper-V VMs
drivers/input/serio/i8042.c | 43 +++++++++++++++++++++++++++++++++++--------
1 file changed, 35 insertions(+), 8 deletions(-)
--
2.8.0
From: Mark Laws <hidden> Date: 2016-04-18 15:24:14
As explained in 1407814240-4275-1-git-send-email-decui@microsoft.com:
hyperv_keyboard invokes serio_interrupt(), which needs a valid serio
driver like atkbd.c. atkbd.c depends on libps2.c because it invokes
ps2_command(). libps2.c depends on i8042.c because it invokes
i8042_check_port_owner(). As a result, hyperv_keyboard actually
depends on i8042.c.
For a Generation 2 Hyper-V VM (meaning no i8042 device emulated), if a
Linux VM (like Arch Linux) happens to configure CONFIG_SERIO_I8042=m
rather than =y, atkbd.ko can't load because i8042.ko can't load(due to
no i8042 device emulated) and finally hyperv_keyboard can't work and
the user can't input: https://bugs.archlinux.org/task/39820
(Ubuntu/RHEL/SUSE aren't affected since they use CONFIG_SERIO_I8042=y)
The transitive dependency on i8042.c is non-trivial--there appears to be
no obvious way to untangle it other than by duplicating much of atkbd.c
within hyperv-keyboard--so we employ a simple workaround: keep i8042.ko
loaded even if no i8042 device is detected, but set a flag so that any
calls into the module simply return (since we don't want to try to
interact with the non-existent i8042). This allows atkbd.c and libps2.c
to load, solving the problem.
Signed-off-by: Mark Laws <redacted>
---
drivers/input/serio/i8042.c | 41 ++++++++++++++++++++++++++++++++++-------
1 file changed, 34 insertions(+), 7 deletions(-)
@@ -1569,13 +1582,17 @@ static int __init i8042_init(void)dbg_init();+i8042_present=false;+err=i8042_platform_init();if(err)returnerr;err=i8042_controller_check();-if(err)-gotoerr_platform_exit;+if(err){+pr_info("Staying resident in case of module dependencies\n");+gotoout;+}pdev=platform_create_bundle(&i8042_driver,i8042_probe,NULL,0,NULL,0);if(IS_ERR(pdev)){
@@ -1585,7 +1602,9 @@ static int __init i8042_init(void)bus_register_notifier(&serio_bus,&i8042_kbd_bind_notifier_block);panic_blink=i8042_panic_blink;+i8042_present=true;+out:return0;err_platform_exit:
@@ -1595,12 +1614,20 @@ static int __init i8042_init(void)staticvoid__exiti8042_exit(void){-platform_device_unregister(i8042_platform_device);-platform_driver_unregister(&i8042_driver);+if(i8042_present){+platform_device_unregister(i8042_platform_device);+platform_driver_unregister(&i8042_driver);+}+i8042_platform_exit();-bus_unregister_notifier(&serio_bus,&i8042_kbd_bind_notifier_block);-panic_blink=NULL;+if(i8042_present){+bus_unregister_notifier(&serio_bus,+&i8042_kbd_bind_notifier_block);+panic_blink=NULL;+}++i8042_present=false;}module_init(i8042_init);
From: Dan Carpenter <hidden> Date: 2016-04-18 16:55:19
So if the user inserts the module without a keyboard then in the
original code they would just put a keyboard in and try again. Now they
have to do an extra rmmod. What about if we just removed the test for
if the keyboard is present?
On Tue, Apr 19, 2016 at 12:23:36AM +0900, Mark Laws wrote:
quoted hunk
As explained in 1407814240-4275-1-git-send-email-decui@microsoft.com:
quoted
hyperv_keyboard invokes serio_interrupt(), which needs a valid serio
driver like atkbd.c. atkbd.c depends on libps2.c because it invokes
ps2_command(). libps2.c depends on i8042.c because it invokes
i8042_check_port_owner(). As a result, hyperv_keyboard actually
depends on i8042.c.
For a Generation 2 Hyper-V VM (meaning no i8042 device emulated), if a
Linux VM (like Arch Linux) happens to configure CONFIG_SERIO_I8042=m
rather than =y, atkbd.ko can't load because i8042.ko can't load(due to
no i8042 device emulated) and finally hyperv_keyboard can't work and
the user can't input: https://bugs.archlinux.org/task/39820
(Ubuntu/RHEL/SUSE aren't affected since they use CONFIG_SERIO_I8042=y)
The transitive dependency on i8042.c is non-trivial--there appears to be
no obvious way to untangle it other than by duplicating much of atkbd.c
within hyperv-keyboard--so we employ a simple workaround: keep i8042.ko
loaded even if no i8042 device is detected, but set a flag so that any
calls into the module simply return (since we don't want to try to
interact with the non-existent i8042). This allows atkbd.c and libps2.c
to load, solving the problem.
Signed-off-by: Mark Laws <redacted>
---
drivers/input/serio/i8042.c | 41 ++++++++++++++++++++++++++++++++++-------
1 file changed, 34 insertions(+), 7 deletions(-)
Don't obfuscate the literal. Just "return 0;". Also if it's goto out
just change that to "return 0;" because it's simpler for the reader.
regards,
dan carpenter
From: Mark Laws <hidden> Date: 2016-04-18 17:24:48
On Tue, Apr 19, 2016 at 1:54 AM, Dan Carpenter [off-list ref] wrote:
So if the user inserts the module without a keyboard then in the
original code they would just put a keyboard in and try again. Now they
have to do an extra rmmod. What about if we just removed the test for
if the keyboard is present?
Sorry, I don't understand--which part are you suggesting we remove?
Don't obfuscate the literal. Just "return 0;". Also if it's goto out
just change that to "return 0;" because it's simpler for the reader.
Will fix.
Regards,
Mark Laws
--
|v\ /\ |\ |< |_ /\ \^| //
From: Dan Carpenter <hidden> Date: 2016-04-18 20:36:01
On Tue, Apr 19, 2016 at 02:24:47AM +0900, Mark Laws wrote:
On Tue, Apr 19, 2016 at 1:54 AM, Dan Carpenter [off-list ref] wrote:
quoted
So if the user inserts the module without a keyboard then in the
original code they would just put a keyboard in and try again. Now they
have to do an extra rmmod. What about if we just removed the test for
if the keyboard is present?
Sorry, I don't understand--which part are you suggesting we remove?
The call to i8042_controller_check() or move it to the probe function or
something. Why must we have the hardware to load the module?
regards,
dan carpenter
From: Mark Laws <hidden> Date: 2016-04-18 22:00:48
On Tue, Apr 19, 2016 at 5:36 AM, Dan Carpenter [off-list ref] wrote:
On Tue, Apr 19, 2016 at 02:24:47AM +0900, Mark Laws wrote:
quoted
Sorry, I don't understand--which part are you suggesting we remove?
The call to i8042_controller_check() or move it to the probe function or
something. Why must we have the hardware to load the module?
We don't. That's the point of the patch. Do you mean that since our
intent is to load the module regardless of whether or not the hardware
is there, the check should be (re)moved simply to clarify the code?
Sorry for the stupid questions--I'm just trying to make sure I
understand you correctly!
Regards,
Mark Laws
--
|v\ /\ |\ |< |_ /\ \^| //
From: Dan Carpenter <hidden> Date: 2016-04-19 08:22:35
On Tue, Apr 19, 2016 at 07:00:42AM +0900, Mark Laws wrote:
On Tue, Apr 19, 2016 at 5:36 AM, Dan Carpenter [off-list ref] wrote:
quoted
On Tue, Apr 19, 2016 at 02:24:47AM +0900, Mark Laws wrote:
quoted
Sorry, I don't understand--which part are you suggesting we remove?
The call to i8042_controller_check() or move it to the probe function or
something. Why must we have the hardware to load the module?
We don't. That's the point of the patch. Do you mean that since our
intent is to load the module regardless of whether or not the hardware
is there, the check should be (re)moved simply to clarify the code?
Yeah. Just remove the call to i8042_controller_check(). Wouldn't
everyone be happy with that situation?
Your patch makes life slightly more complicated for people who want to
use the original hardware if the load the module but the hardware isn't
detected.
regards,
dan carpenter
From: Mark Laws <hidden> Date: 2016-04-19 10:46:11
On Tue, Apr 19, 2016 at 5:22 PM, Dan Carpenter [off-list ref] wrote:
Yeah. Just remove the call to i8042_controller_check(). Wouldn't
everyone be happy with that situation?
No problem, I agree this is better--just wasn't sure what you meant initially.
Your patch makes life slightly more complicated for people who want to
use the original hardware if the load the module but the hardware isn't
detected.
That is true, but apparently nobody can think of a better solution
(including me :)) and this bug has been open for two years. Having to
rmmod in the corner case where the module gets loaded but no i8042 is
present seems a small price to pay for having the keyboard work
regardless of CONFIG_I8042=y or m. Right now, any distribution with
CONFIG_I8042=m has a non-functional keyboard on Hyper-V Gen2 VMs,
which is probably frustrating for (e.g.) Arch Linux users who find
themselves unable to type and thus can't install their distribution.
Regards,
Mark Laws
--
|v\ /\ |\ |< |_ /\ \^| //
From: Mark Laws <hidden> Date: 2016-04-22 13:01:00
As explained in 1407814240-4275-1-git-send-email-decui@microsoft.com:
hyperv_keyboard invokes serio_interrupt(), which needs a valid serio
driver like atkbd.c. atkbd.c depends on libps2.c because it invokes
ps2_command(). libps2.c depends on i8042.c because it invokes
i8042_check_port_owner(). As a result, hyperv_keyboard actually
depends on i8042.c.
For a Generation 2 Hyper-V VM (meaning no i8042 device emulated), if a
Linux VM (like Arch Linux) happens to configure CONFIG_SERIO_I8042=m
rather than =y, atkbd.ko can't load because i8042.ko can't load(due to
no i8042 device emulated) and finally hyperv_keyboard can't work and
the user can't input: https://bugs.archlinux.org/task/39820
(Ubuntu/RHEL/SUSE aren't affected since they use CONFIG_SERIO_I8042=y)
The transitive dependency on i8042.c is non-trivial--there appears to be
no obvious way to untangle it other than by duplicating much of atkbd.c
within hyperv-keyboard--so we employ a simple workaround: keep i8042.ko
loaded even if no i8042 device is detected, but set a flag so that any
calls into the module simply return (since we don't want to try to
interact with the non-existent i8042). This allows atkbd.c and libps2.c
to load, solving the problem.
Signed-off-by: Mark Laws <redacted>
---
drivers/input/serio/i8042.c | 50 ++++++++++++++++++++++++++++++---------------
1 file changed, 34 insertions(+), 16 deletions(-)
@@ -313,6 +320,9 @@ int i8042_command(unsigned char *param, int command)unsignedlongflags;intretval;+if(!i8042_present)+return0;+spin_lock_irqsave(&i8042_lock,flags);retval=__i8042_command(param,command);spin_unlock_irqrestore(&i8042_lock,flags);
@@ -1493,6 +1506,10 @@ static int __init i8042_probe(struct platform_device *dev){interror;+error=i8042_controller_check();+if(error)+returnerror;+i8042_platform_device=dev;if(i8042_reset){
@@ -1569,38 +1586,39 @@ static int __init i8042_init(void)dbg_init();+i8042_present=false;+err=i8042_platform_init();if(err)returnerr;-err=i8042_controller_check();-if(err)-gotoerr_platform_exit;-pdev=platform_create_bundle(&i8042_driver,i8042_probe,NULL,0,NULL,0);-if(IS_ERR(pdev)){-err=PTR_ERR(pdev);-gotoerr_platform_exit;-}+if(IS_ERR(pdev))+return0;/* load anyway since some modules depend on our symbols */bus_register_notifier(&serio_bus,&i8042_kbd_bind_notifier_block);panic_blink=i8042_panic_blink;+i8042_present=true;return0;--err_platform_exit:-i8042_platform_exit();-returnerr;}staticvoid__exiti8042_exit(void){-platform_device_unregister(i8042_platform_device);-platform_driver_unregister(&i8042_driver);+if(i8042_present){+platform_device_unregister(i8042_platform_device);+platform_driver_unregister(&i8042_driver);+}+i8042_platform_exit();-bus_unregister_notifier(&serio_bus,&i8042_kbd_bind_notifier_block);-panic_blink=NULL;+if(i8042_present){+bus_unregister_notifier(&serio_bus,+&i8042_kbd_bind_notifier_block);+panic_blink=NULL;+}++i8042_present=false;}module_init(i8042_init);
From: Mark Laws <hidden> Date: 2016-04-22 13:01:25
This is an updated version of the original patch from this thread. It
fixes the style issues Dan Carpenter brought up.
Mark Laws (1):
Input: i8042 - Fix console keyboard support on Gen2 Hyper-V VMs
drivers/input/serio/i8042.c | 50 ++++++++++++++++++++++++++++++---------------
1 file changed, 34 insertions(+), 16 deletions(-)
--
2.8.0
From: Dan Carpenter <hidden> Date: 2016-04-22 13:18:07
Why is platform_create_bundle() failing? It didn't fail in the first
version of the patch.
Btw, I'm not asking rhetorical questions, if I ask a question it means I
legitimately don't know the answer.
But I don't like this patch. Could you describe how you have tested it
with real hardware? What I want to know is that you loaded the module
without the hardware installed and then installed the hardware and got
it to work. You have made that more complicated and you've said that
you're willing to complicate life for those users slightly because it's
a trade off for fixing your bug... But that's sort of annoying and no
one has even tested how it works.
What I was really wondering last time was why can we not just do this?
Testing to see if the hardware is present is normally done in the
probe() function and not the init() function. I have not tested this
and I don't know what happens when we do this. Apparently, it causes
platform_create_bundle() to fail but I'm not sure why... Maybe the
create bundle call probe() and that fails?
How hard would it be to separate these things out into two modules
really? You say that you'd have to duplicate everything but maybe we
could instead just make the common functions into a library type thing..
From: Mark Laws <hidden> Date: 2016-04-22 17:30:43
A few tripels later and the patch has been completely rewritten.
The problem symbols have been moved to a new module, libi8042.c, which
both libps2.c and i8042.c use. libps2.c no longer depends on i8042.c,
and i8042.c no longer needs the gross hack of the previous patch.
Since I didn't write anything new, just shuffled things around, I
haven't changed any copyrights. I have no idea what the right procedure
is here, so please let me know, since I'm probably screwing up somehow.
Mark Laws (1):
Input: i8042 - Fix console keyboard support on Gen2 Hyper-V VMs
drivers/input/serio/Kconfig | 7 ++++-
drivers/input/serio/Makefile | 1 +
drivers/input/serio/i8042.c | 48 ---------------------------------
drivers/input/serio/i8042.h | 7 -----
drivers/input/serio/libi8042.c | 60 ++++++++++++++++++++++++++++++++++++++++++
drivers/input/serio/libps2.c | 2 +-
include/linux/i8042.h | 17 +-----------
include/linux/libi8042.h | 55 ++++++++++++++++++++++++++++++++++++++
8 files changed, 124 insertions(+), 73 deletions(-)
create mode 100644 drivers/input/serio/libi8042.c
create mode 100644 include/linux/libi8042.h
--
2.8.0
From: Mark Laws <hidden> Date: 2016-04-22 17:30:58
As explained in 1407814240-4275-1-git-send-email-decui@microsoft.com:
hyperv_keyboard invokes serio_interrupt(), which needs a valid serio
driver like atkbd.c. atkbd.c depends on libps2.c because it invokes
ps2_command(). libps2.c depends on i8042.c because it invokes
i8042_check_port_owner(). As a result, hyperv_keyboard actually
depends on i8042.c.
For a Generation 2 Hyper-V VM (meaning no i8042 device emulated), if a
Linux VM (like Arch Linux) happens to configure CONFIG_SERIO_I8042=m
rather than =y, atkbd.ko can't load because i8042.ko can't load(due to
no i8042 device emulated) and finally hyperv_keyboard can't work and
the user can't input: https://bugs.archlinux.org/task/39820
(Ubuntu/RHEL/SUSE aren't affected since they use CONFIG_SERIO_I8042=y)
This eliminates the transitive dependency on i8042.c by moving the
symbols libps2.c depends on to a new module, libi8042.c.
Signed-off-by: Mark Laws <redacted>
---
drivers/input/serio/Kconfig | 7 ++++-
drivers/input/serio/Makefile | 1 +
drivers/input/serio/i8042.c | 48 ---------------------------------
drivers/input/serio/i8042.h | 7 -----
drivers/input/serio/libi8042.c | 60 ++++++++++++++++++++++++++++++++++++++++++
drivers/input/serio/libps2.c | 2 +-
include/linux/i8042.h | 17 +-----------
include/linux/libi8042.h | 55 ++++++++++++++++++++++++++++++++++++++
8 files changed, 124 insertions(+), 73 deletions(-)
create mode 100644 drivers/input/serio/libi8042.c
create mode 100644 include/linux/libi8042.h
@@ -5,6 +5,7 @@# Each configuration option enables a list of files.obj-$(CONFIG_SERIO)+=serio.o+obj-$(CONFIG_SERIO_LIBI8042)+=libi8042.oobj-$(CONFIG_SERIO_I8042)+=i8042.oobj-$(CONFIG_SERIO_PARKBD)+=parkbd.oobj-$(CONFIG_SERIO_SERPORT)+=serport.o