From: Greg Kroah-Hartman Date: Fri, 19 Aug 2016 07:36:15 +0000 (+0200) Subject: moved i8042 patch to "postponed" X-Git-Tag: v3.14.77~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2c3802c416faf331296a44fd1407fc5d6718b376;p=thirdparty%2Fkernel%2Fstable-queue.git moved i8042 patch to "postponed" --- diff --git a/queue-4.4/input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch b/postponed/input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch similarity index 100% rename from queue-4.4/input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch rename to postponed/input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch diff --git a/queue-3.14/input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch b/queue-3.14/input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch deleted file mode 100644 index 3b32c4b6492..00000000000 --- a/queue-3.14/input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch +++ /dev/null @@ -1,168 +0,0 @@ -From 4097461897df91041382ff6fcd2bfa7ee6b2448c Mon Sep 17 00:00:00 2001 -From: Dmitry Torokhov -Date: Mon, 25 Jul 2016 11:36:54 -0700 -Subject: Input: i8042 - break load dependency between atkbd/psmouse and i8042 - -From: Dmitry Torokhov - -commit 4097461897df91041382ff6fcd2bfa7ee6b2448c upstream. - -As explained in 1407814240-4275-1-git-send-email-decui@microsoft.com we -have a hard load dependency between i8042 and atkbd which prevents -keyboard from working on Gen2 Hyper-V VMs. - -> 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) - -To break the dependency we move away from using i8042_check_port_owner() -and instead allow serio port owner specify a mutex that clients should use -to serialize PS/2 command stream. - -Reported-by: Mark Laws -Tested-by: Mark Laws -Signed-off-by: Dmitry Torokhov -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/input/serio/i8042.c | 16 +--------------- - drivers/input/serio/libps2.c | 10 ++++------ - include/linux/i8042.h | 6 ------ - include/linux/serio.h | 24 +++++++++++++++++++----- - 4 files changed, 24 insertions(+), 32 deletions(-) - ---- a/drivers/input/serio/i8042.c -+++ b/drivers/input/serio/i8042.c -@@ -1230,6 +1230,7 @@ static int __init i8042_create_kbd_port( - serio->start = i8042_start; - serio->stop = i8042_stop; - serio->close = i8042_port_close; -+ serio->ps2_cmd_mutex = &i8042_mutex; - serio->port_data = port; - serio->dev.parent = &i8042_platform_device->dev; - strlcpy(serio->name, "i8042 KBD port", sizeof(serio->name)); -@@ -1321,21 +1322,6 @@ static void i8042_unregister_ports(void) - } - } - --/* -- * Checks whether port belongs to i8042 controller. -- */ --bool i8042_check_port_owner(const struct serio *port) --{ -- int i; -- -- for (i = 0; i < I8042_NUM_PORTS; i++) -- if (i8042_ports[i].serio == port) -- return true; -- -- return false; --} --EXPORT_SYMBOL(i8042_check_port_owner); -- - static void i8042_free_irqs(void) - { - if (i8042_aux_irq_registered) ---- a/drivers/input/serio/libps2.c -+++ b/drivers/input/serio/libps2.c -@@ -56,19 +56,17 @@ EXPORT_SYMBOL(ps2_sendbyte); - - void ps2_begin_command(struct ps2dev *ps2dev) - { -- mutex_lock(&ps2dev->cmd_mutex); -+ struct mutex *m = ps2dev->serio->ps2_cmd_mutex ?: &ps2dev->cmd_mutex; - -- if (i8042_check_port_owner(ps2dev->serio)) -- i8042_lock_chip(); -+ mutex_lock(m); - } - EXPORT_SYMBOL(ps2_begin_command); - - void ps2_end_command(struct ps2dev *ps2dev) - { -- if (i8042_check_port_owner(ps2dev->serio)) -- i8042_unlock_chip(); -+ struct mutex *m = ps2dev->serio->ps2_cmd_mutex ?: &ps2dev->cmd_mutex; - -- mutex_unlock(&ps2dev->cmd_mutex); -+ mutex_unlock(m); - } - EXPORT_SYMBOL(ps2_end_command); - ---- a/include/linux/i8042.h -+++ b/include/linux/i8042.h -@@ -62,7 +62,6 @@ struct serio; - void i8042_lock_chip(void); - void i8042_unlock_chip(void); - int i8042_command(unsigned char *param, int command); --bool i8042_check_port_owner(const struct serio *); - int i8042_install_filter(bool (*filter)(unsigned char data, unsigned char str, - struct serio *serio)); - int i8042_remove_filter(bool (*filter)(unsigned char data, unsigned char str, -@@ -83,11 +82,6 @@ static inline int i8042_command(unsigned - return -ENODEV; - } - --static inline bool i8042_check_port_owner(const struct serio *serio) --{ -- return false; --} -- - static inline int i8042_install_filter(bool (*filter)(unsigned char data, unsigned char str, - struct serio *serio)) - { ---- a/include/linux/serio.h -+++ b/include/linux/serio.h -@@ -29,7 +29,8 @@ struct serio { - - struct serio_device_id id; - -- spinlock_t lock; /* protects critical sections from port's interrupt handler */ -+ /* Protects critical sections from port's interrupt handler */ -+ spinlock_t lock; - - int (*write)(struct serio *, unsigned char); - int (*open)(struct serio *); -@@ -38,16 +39,29 @@ struct serio { - void (*stop)(struct serio *); - - struct serio *parent; -- struct list_head child_node; /* Entry in parent->children list */ -+ /* Entry in parent->children list */ -+ struct list_head child_node; - struct list_head children; -- unsigned int depth; /* level of nesting in serio hierarchy */ -+ /* Level of nesting in serio hierarchy */ -+ unsigned int depth; - -- struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ -- struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */ -+ /* -+ * serio->drv is accessed from interrupt handlers; when modifying -+ * caller should acquire serio->drv_mutex and serio->lock. -+ */ -+ struct serio_driver *drv; -+ /* Protects serio->drv so attributes can pin current driver */ -+ struct mutex drv_mutex; - - struct device dev; - - struct list_head node; -+ -+ /* -+ * For use by PS/2 layer when several ports share hardware and -+ * may get indigestion when exposed to concurrent access (i8042). -+ */ -+ struct mutex *ps2_cmd_mutex; - }; - #define to_serio_port(d) container_of(d, struct serio, dev) - diff --git a/queue-3.14/series b/queue-3.14/series index 3e98c847045..a0b7ad05564 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -11,7 +11,6 @@ bluetooth-fix-l2cap_sock_setsockopt-with-optname-bt_rcvmtu.patch cifs-check-for-existing-directory-when-opening-file-with-o_creat.patch cifs-fix-crash-due-to-race-in-hmac-md5-handling.patch cifs-fix-a-possible-invalid-memory-access-in-smb2_query_symlink.patch -random-properly-align-get_random_int_hash.patch random-print-a-warning-for-the-first-ten-uninitialized-random-users.patch mips-kvm-fix-mapped-fault-broken-commpage-handling.patch mips-kvm-add-missing-gfn-range-check.patch @@ -39,7 +38,6 @@ ubi-make-volume-resize-power-cut-aware.patch ubi-fix-race-condition-between-ubi-device-creation-and-udev.patch target-fix-race-between-iscsi-target-connection-shutdown-abort_task.patch target-fix-max_unmap_lba_count-calc-overflow.patch -input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch pci-mark-atheros-ar9485-and-qca9882-to-avoid-bus-reset.patch dm-flakey-error-read-bios-during-the-down_interval.patch module-invalidate-signatures-on-force-loaded-modules.patch diff --git a/queue-4.4/random-initialize-the-non-blocking-pool-via-add_hwgenerator_randomness.patch b/queue-4.4/random-initialize-the-non-blocking-pool-via-add_hwgenerator_randomness.patch index 5f8f79d7647..64f04d4c0b5 100644 --- a/queue-4.4/random-initialize-the-non-blocking-pool-via-add_hwgenerator_randomness.patch +++ b/queue-4.4/random-initialize-the-non-blocking-pool-via-add_hwgenerator_randomness.patch @@ -20,7 +20,7 @@ Signed-off-by: Greg Kroah-Hartman --- a/drivers/char/random.c +++ b/drivers/char/random.c -@@ -1849,12 +1849,18 @@ void add_hwgenerator_randomness(const ch +@@ -1847,12 +1847,18 @@ void add_hwgenerator_randomness(const ch { struct entropy_store *poolp = &input_pool; diff --git a/queue-4.4/series b/queue-4.4/series index 3edac0c3251..8e19091b6dc 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -51,7 +51,6 @@ fs-cifs-make-share-unaccessible-at-root-level-mountable.patch cifs-check-for-existing-directory-when-opening-file-with-o_creat.patch cifs-fix-crash-due-to-race-in-hmac-md5-handling.patch cifs-fix-a-possible-invalid-memory-access-in-smb2_query_symlink.patch -random-properly-align-get_random_int_hash.patch random-initialize-the-non-blocking-pool-via-add_hwgenerator_randomness.patch random-print-a-warning-for-the-first-ten-uninitialized-random-users.patch random-add-interrupt-callback-to-vmbus-irq-handler.patch @@ -123,7 +122,6 @@ target-fix-race-between-iscsi-target-connection-shutdown-abort_task.patch target-fix-max_unmap_lba_count-calc-overflow.patch target-fix-ordered-task-check_condition-early-exception-handling.patch input-elan_i2c-properly-wake-up-touchpad-on-asus-laptops.patch -input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch sunrpc-don-t-allocate-a-full-sockaddr_storage-for-tracing.patch mips-mm-fix-definition-of-r6-cache-instruction.patch mips-don-t-register-r4k-sched-clock-when-cpufreq-enabled.patch diff --git a/queue-4.7/input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch b/queue-4.7/input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch deleted file mode 100644 index 6e3215b5aef..00000000000 --- a/queue-4.7/input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch +++ /dev/null @@ -1,168 +0,0 @@ -From 4097461897df91041382ff6fcd2bfa7ee6b2448c Mon Sep 17 00:00:00 2001 -From: Dmitry Torokhov -Date: Mon, 25 Jul 2016 11:36:54 -0700 -Subject: Input: i8042 - break load dependency between atkbd/psmouse and i8042 - -From: Dmitry Torokhov - -commit 4097461897df91041382ff6fcd2bfa7ee6b2448c upstream. - -As explained in 1407814240-4275-1-git-send-email-decui@microsoft.com we -have a hard load dependency between i8042 and atkbd which prevents -keyboard from working on Gen2 Hyper-V VMs. - -> 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) - -To break the dependency we move away from using i8042_check_port_owner() -and instead allow serio port owner specify a mutex that clients should use -to serialize PS/2 command stream. - -Reported-by: Mark Laws -Tested-by: Mark Laws -Signed-off-by: Dmitry Torokhov -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/input/serio/i8042.c | 16 +--------------- - drivers/input/serio/libps2.c | 10 ++++------ - include/linux/i8042.h | 6 ------ - include/linux/serio.h | 24 +++++++++++++++++++----- - 4 files changed, 24 insertions(+), 32 deletions(-) - ---- a/drivers/input/serio/i8042.c -+++ b/drivers/input/serio/i8042.c -@@ -1277,6 +1277,7 @@ static int __init i8042_create_kbd_port( - serio->start = i8042_start; - serio->stop = i8042_stop; - serio->close = i8042_port_close; -+ serio->ps2_cmd_mutex = &i8042_mutex; - serio->port_data = port; - serio->dev.parent = &i8042_platform_device->dev; - strlcpy(serio->name, "i8042 KBD port", sizeof(serio->name)); -@@ -1373,21 +1374,6 @@ static void i8042_unregister_ports(void) - } - } - --/* -- * Checks whether port belongs to i8042 controller. -- */ --bool i8042_check_port_owner(const struct serio *port) --{ -- int i; -- -- for (i = 0; i < I8042_NUM_PORTS; i++) -- if (i8042_ports[i].serio == port) -- return true; -- -- return false; --} --EXPORT_SYMBOL(i8042_check_port_owner); -- - static void i8042_free_irqs(void) - { - if (i8042_aux_irq_registered) ---- a/drivers/input/serio/libps2.c -+++ b/drivers/input/serio/libps2.c -@@ -56,19 +56,17 @@ EXPORT_SYMBOL(ps2_sendbyte); - - void ps2_begin_command(struct ps2dev *ps2dev) - { -- mutex_lock(&ps2dev->cmd_mutex); -+ struct mutex *m = ps2dev->serio->ps2_cmd_mutex ?: &ps2dev->cmd_mutex; - -- if (i8042_check_port_owner(ps2dev->serio)) -- i8042_lock_chip(); -+ mutex_lock(m); - } - EXPORT_SYMBOL(ps2_begin_command); - - void ps2_end_command(struct ps2dev *ps2dev) - { -- if (i8042_check_port_owner(ps2dev->serio)) -- i8042_unlock_chip(); -+ struct mutex *m = ps2dev->serio->ps2_cmd_mutex ?: &ps2dev->cmd_mutex; - -- mutex_unlock(&ps2dev->cmd_mutex); -+ mutex_unlock(m); - } - EXPORT_SYMBOL(ps2_end_command); - ---- a/include/linux/i8042.h -+++ b/include/linux/i8042.h -@@ -62,7 +62,6 @@ struct serio; - void i8042_lock_chip(void); - void i8042_unlock_chip(void); - int i8042_command(unsigned char *param, int command); --bool i8042_check_port_owner(const struct serio *); - int i8042_install_filter(bool (*filter)(unsigned char data, unsigned char str, - struct serio *serio)); - int i8042_remove_filter(bool (*filter)(unsigned char data, unsigned char str, -@@ -83,11 +82,6 @@ static inline int i8042_command(unsigned - return -ENODEV; - } - --static inline bool i8042_check_port_owner(const struct serio *serio) --{ -- return false; --} -- - static inline int i8042_install_filter(bool (*filter)(unsigned char data, unsigned char str, - struct serio *serio)) - { ---- a/include/linux/serio.h -+++ b/include/linux/serio.h -@@ -31,7 +31,8 @@ struct serio { - - struct serio_device_id id; - -- spinlock_t lock; /* protects critical sections from port's interrupt handler */ -+ /* Protects critical sections from port's interrupt handler */ -+ spinlock_t lock; - - int (*write)(struct serio *, unsigned char); - int (*open)(struct serio *); -@@ -40,16 +41,29 @@ struct serio { - void (*stop)(struct serio *); - - struct serio *parent; -- struct list_head child_node; /* Entry in parent->children list */ -+ /* Entry in parent->children list */ -+ struct list_head child_node; - struct list_head children; -- unsigned int depth; /* level of nesting in serio hierarchy */ -+ /* Level of nesting in serio hierarchy */ -+ unsigned int depth; - -- struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ -- struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */ -+ /* -+ * serio->drv is accessed from interrupt handlers; when modifying -+ * caller should acquire serio->drv_mutex and serio->lock. -+ */ -+ struct serio_driver *drv; -+ /* Protects serio->drv so attributes can pin current driver */ -+ struct mutex drv_mutex; - - struct device dev; - - struct list_head node; -+ -+ /* -+ * For use by PS/2 layer when several ports share hardware and -+ * may get indigestion when exposed to concurrent access (i8042). -+ */ -+ struct mutex *ps2_cmd_mutex; - }; - #define to_serio_port(d) container_of(d, struct serio, dev) - diff --git a/queue-4.7/series b/queue-4.7/series index dbc08392bd5..7da6e248a6b 100644 --- a/queue-4.7/series +++ b/queue-4.7/series @@ -169,7 +169,6 @@ target-fix-max_unmap_lba_count-calc-overflow.patch target-fix-ordered-task-check_condition-early-exception-handling.patch um-fix-possible-deadlock-in-sig_handler_common.patch input-elan_i2c-properly-wake-up-touchpad-on-asus-laptops.patch -input-i8042-break-load-dependency-between-atkbd-psmouse-and-i8042.patch sunrpc-don-t-allocate-a-full-sockaddr_storage-for-tracing.patch mips-mm-fix-definition-of-r6-cache-instruction.patch mips-fix-r4k-clockevents-registration.patch