From b24683da203391c0b969e2bd536ad92511e4261d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Pierret?= Date: Thu, 12 Apr 2018 21:25:40 +0200 Subject: [PATCH 1/6] Support for DISTFILES_MIRROR --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index 25f00e0..81a7da5 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,12 @@ endif all: help MIRROR := cdn.kernel.org +ifeq (,$(DISTFILES_MIRROR)) SRC_BASEURL := https://${MIRROR}/pub/linux/kernel/v$(shell echo $(VERSION) | sed 's/^\(2\.[0-9]*\).*/\1/;s/^3\..*/3.x/;s/^4\..*/4.x/') +else +SRC_BASEURL := $(DISTFILES_MIRROR) +endif + SRC_FILE := linux-${VERSION}.tar.xz ifeq ($(BUILD_FLAVOR),pvops) SIGN_FILE := linux-${VERSION}.tar.sign From c138013c757e76fc9c5546f352650b7055ec0169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Pierret?= Date: Thu, 12 Apr 2018 21:25:53 +0200 Subject: [PATCH 2/6] Update to kernel-4.15.16 --- ...e-__max_logical_packages-on-PV-domai.patch | 94 ------------------- ...ch-support-on-X1-Carbon-6th-and-X280.patch | 41 -------- ...ovo-X1-Carbon-5-should-use-SMBUS-RMI.patch | 28 ------ series.conf | 6 -- version | 2 +- 5 files changed, 1 insertion(+), 170 deletions(-) delete mode 100644 patches.backports/63e708f826bb-x86-xen-Calculate-__max_logical_packages-on-PV-domai.patch delete mode 100644 patches.backports/Input-synaptics---add-Intertouch-support-on-X1-Carbon-6th-and-X280.patch delete mode 100644 patches.backports/v2-2-2-Input-synaptics---Lenovo-X1-Carbon-5-should-use-SMBUS-RMI.patch diff --git a/patches.backports/63e708f826bb-x86-xen-Calculate-__max_logical_packages-on-PV-domai.patch b/patches.backports/63e708f826bb-x86-xen-Calculate-__max_logical_packages-on-PV-domai.patch deleted file mode 100644 index abe1624..0000000 --- a/patches.backports/63e708f826bb-x86-xen-Calculate-__max_logical_packages-on-PV-domai.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 63e708f826bb21470155d37b103a75d8a9e25b18 Mon Sep 17 00:00:00 2001 -From: Prarit Bhargava -Date: Wed, 7 Feb 2018 18:49:23 -0500 -Subject: [PATCH] x86/xen: Calculate __max_logical_packages on PV domains - -The kernel panics on PV domains because native_smp_cpus_done() is -only called for HVM domains. - -Calculate __max_logical_packages for PV domains. - -Fixes: b4c0a7326f5d ("x86/smpboot: Fix __max_logical_packages estimate") -Signed-off-by: Prarit Bhargava -Tested-and-reported-by: Simon Gaiser -Cc: Thomas Gleixner -Cc: Ingo Molnar -Cc: "H. Peter Anvin" -Cc: x86@kernel.org -Cc: Boris Ostrovsky -Cc: Juergen Gross -Cc: Dou Liyang -Cc: Prarit Bhargava -Cc: Kate Stewart -Cc: Greg Kroah-Hartman -Cc: Andy Lutomirski -Cc: Andi Kleen -Cc: Vitaly Kuznetsov -Cc: xen-devel@lists.xenproject.org -Reviewed-by: Boris Ostrovsky -Signed-off-by: Juergen Gross ---- - arch/x86/include/asm/smp.h | 1 + - arch/x86/kernel/smpboot.c | 10 ++++++++-- - arch/x86/xen/smp.c | 2 ++ - 3 files changed, 11 insertions(+), 2 deletions(-) - -diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h -index 461f53d27708..a4189762b266 100644 ---- a/arch/x86/include/asm/smp.h -+++ b/arch/x86/include/asm/smp.h -@@ -129,6 +129,7 @@ static inline void arch_send_call_function_ipi_mask(const struct cpumask *mask) - void cpu_disable_common(void); - void native_smp_prepare_boot_cpu(void); - void native_smp_prepare_cpus(unsigned int max_cpus); -+void calculate_max_logical_packages(void); - void native_smp_cpus_done(unsigned int max_cpus); - void common_cpu_up(unsigned int cpunum, struct task_struct *tidle); - int native_cpu_up(unsigned int cpunum, struct task_struct *tidle); -diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c -index cfc61e1d45e2..9eee25d07586 100644 ---- a/arch/x86/kernel/smpboot.c -+++ b/arch/x86/kernel/smpboot.c -@@ -1281,11 +1281,10 @@ void __init native_smp_prepare_boot_cpu(void) - cpu_set_state_online(me); - } - --void __init native_smp_cpus_done(unsigned int max_cpus) -+void __init calculate_max_logical_packages(void) - { - int ncpus; - -- pr_debug("Boot done\n"); - /* - * Today neither Intel nor AMD support heterogenous systems so - * extrapolate the boot cpu's data to all packages. -@@ -1293,6 +1292,13 @@ void __init native_smp_cpus_done(unsigned int max_cpus) - ncpus = cpu_data(0).booted_cores * topology_max_smt_threads(); - __max_logical_packages = DIV_ROUND_UP(nr_cpu_ids, ncpus); - pr_info("Max logical packages: %u\n", __max_logical_packages); -+} -+ -+void __init native_smp_cpus_done(unsigned int max_cpus) -+{ -+ pr_debug("Boot done\n"); -+ -+ calculate_max_logical_packages(); - - if (x86_has_numa_in_package) - set_sched_topology(x86_numa_in_package_topology); -diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c -index 77c959cf81e7..7a43b2ae19f1 100644 ---- a/arch/x86/xen/smp.c -+++ b/arch/x86/xen/smp.c -@@ -122,6 +122,8 @@ void __init xen_smp_cpus_done(unsigned int max_cpus) - - if (xen_hvm_domain()) - native_smp_cpus_done(max_cpus); -+ else -+ calculate_max_logical_packages(); - - if (xen_have_vcpu_info_placement) - return; --- -2.16.1 - diff --git a/patches.backports/Input-synaptics---add-Intertouch-support-on-X1-Carbon-6th-and-X280.patch b/patches.backports/Input-synaptics---add-Intertouch-support-on-X1-Carbon-6th-and-X280.patch deleted file mode 100644 index 6a4dd2f..0000000 --- a/patches.backports/Input-synaptics---add-Intertouch-support-on-X1-Carbon-6th-and-X280.patch +++ /dev/null @@ -1,41 +0,0 @@ -From patchwork Mon Oct 16 14:48:55 2017 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: Input: synaptics - add Intertouch support on X1 Carbon 6th and X280 -From: Aaron Ma -X-Patchwork-Id: 10008513 -Message-Id: <1508165335-16738-1-git-send-email-aaron.ma@canonical.com> -To: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, - dmitry.torokhov@gmail.com, aaron.ma@canonical.com -Date: Mon, 16 Oct 2017 22:48:55 +0800 - -Synaptics devices reported it has Intertouch support, -and it fails via PS/2 as following logs: - -psmouse serio2: Failed to reset mouse on synaptics-pt/serio0 -psmouse serio2: Failed to enable mouse on synaptics-pt/serio0 - -Set these new devices to use SMBus to fix this issue, -then they report SMBus version 3 is using, -patch: https://patchwork.kernel.org/patch/9989547/ enabled SMBus ver 3 and -makes synaptics devices work fine on SMBus mode. - -Signed-off-by: Aaron Ma ---- - drivers/input/mouse/synaptics.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c -index 5af0b7d200bc..da3a5e40e80c 100644 ---- a/drivers/input/mouse/synaptics.c -+++ b/drivers/input/mouse/synaptics.c -@@ -173,6 +173,8 @@ static const char * const smbus_pnp_ids[] = { - "LEN004a", /* W541 */ - "LEN0073", /* X1 Carbon 5 */ - "LEN200f", /* T450s */ -+ "LEN0092", /* X1 Carbon 6 */ -+ "LEN0096", /* X280 */ - "LEN2018", /* T460p */ - NULL - }; diff --git a/patches.backports/v2-2-2-Input-synaptics---Lenovo-X1-Carbon-5-should-use-SMBUS-RMI.patch b/patches.backports/v2-2-2-Input-synaptics---Lenovo-X1-Carbon-5-should-use-SMBUS-RMI.patch deleted file mode 100644 index f232725..0000000 --- a/patches.backports/v2-2-2-Input-synaptics---Lenovo-X1-Carbon-5-should-use-SMBUS-RMI.patch +++ /dev/null @@ -1,28 +0,0 @@ -From patchwork Fri Oct 6 14:06:30 2017 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [v2,2/2] Input: synaptics - Lenovo X1 Carbon 5 should use SMBUS/RMI -From: Yiannis Marangos -X-Patchwork-Id: 9989549 -Message-Id: <20171006140630.6398-3-yiannis.marangos@gmail.com> -To: linux-input@vger.kernel.org -Cc: Yiannis Marangos -Date: Fri, 6 Oct 2017 17:06:30 +0300 - ---- - drivers/input/mouse/synaptics.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c -index 5af0b7d200bc..eecb8872c1a5 100644 ---- a/drivers/input/mouse/synaptics.c -+++ b/drivers/input/mouse/synaptics.c -@@ -172,6 +172,7 @@ static const char * const smbus_pnp_ids[] = { - "LEN0048", /* X1 Carbon 3 */ - "LEN0046", /* X250 */ - "LEN004a", /* W541 */ -+ "LEN0073", /* X1 Carbon 5 */ - "LEN200f", /* T450s */ - "LEN2018", /* T460p */ - NULL diff --git a/series.conf b/series.conf index 2c1c1a1..392c2bc 100644 --- a/series.conf +++ b/series.conf @@ -33,10 +33,4 @@ patches.xen/Revert-xen-avoid-deadlock-in-xenbus-driver.patch patches.xen/Revert-xenbus-remove-transaction-holder-from-list-be.patch patches.xen/Revert-xen-optimize-xenbus-driver-for-multiple-concu.patch -# Backport for regression in 4.15 in smpboot.c -patches.backports/63e708f826bb-x86-xen-Calculate-__max_logical_packages-on-PV-domai.patch - # Hardware-specific fixes, backported from newer kernel and/or developers branches -patches.backports/v2-2-2-Input-synaptics---Lenovo-X1-Carbon-5-should-use-SMBUS-RMI.patch -patches.backports/Input-synaptics---add-Intertouch-support-on-X1-Carbon-6th-and-X280.patch - diff --git a/version b/version index 3453134..9bb7e62 100644 --- a/version +++ b/version @@ -1 +1 @@ -4.15.6 +4.15.16 From 67e33e03607f19edc4fc194054b966698a95ca1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Pierret?= Date: Thu, 12 Apr 2018 23:32:59 +0200 Subject: [PATCH 3/6] Update to kernel-4.16.2 --- ...001-block-add-no_part_scan-module-parameter.patch | 6 +++--- patches.xen/pci_op-cleanup.patch | 12 ++++++------ version | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/patches.qubes/0001-block-add-no_part_scan-module-parameter.patch b/patches.qubes/0001-block-add-no_part_scan-module-parameter.patch index 7ba0724..eb3cc61 100644 --- a/patches.qubes/0001-block-add-no_part_scan-module-parameter.patch +++ b/patches.qubes/0001-block-add-no_part_scan-module-parameter.patch @@ -18,7 +18,7 @@ diff --git a/block/genhd.c b/block/genhd.c index 9f42526..85b71f5 100644 --- a/block/genhd.c +++ b/block/genhd.c -@@ -572,6 +572,15 @@ exit: +@@ -628,6 +628,15 @@ WARN_ON(err); } @@ -32,9 +32,9 @@ index 9f42526..85b71f5 100644 +MODULE_PARM_DESC(no_part_scan, "When adding block devices, always mark them as not to be scanned for partitions"); + /** - * device_add_disk - add partitioning information to kernel list + * __device_add_disk - add disk information to kernel list * @parent: parent device for the disk -@@ -587,6 +596,9 @@ void device_add_disk(struct device *parent, struct gendisk *disk) +@@ -645,6 +654,9 @@ dev_t devt; int retval; diff --git a/patches.xen/pci_op-cleanup.patch b/patches.xen/pci_op-cleanup.patch index 79be7f8..4628732 100644 --- a/patches.xen/pci_op-cleanup.patch +++ b/patches.xen/pci_op-cleanup.patch @@ -53,12 +53,12 @@ Date: Wed Apr 1 17:01:26 2015 -0400 drivers/xen/xen-pciback/pciback_ops.c diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c -index b1ffebe..353c8a2 100644 +index 8785014..d458e53 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c -@@ -297,7 +297,7 @@ static int pci_frontend_enable_msix(struct pci_dev *dev, +@@ -298,7 +298,7 @@ static int pci_frontend_enable_msix(struct pci_dev *dev, } else { - dev_err(&dev->dev, "enable msix get err %x\n", err); + pci_err(dev, "enable msix get err %x\n", err); } - return err; + return err ? -EINVAL : 0; @@ -66,13 +66,13 @@ index b1ffebe..353c8a2 100644 static void pci_frontend_disable_msix(struct pci_dev *dev) diff --git a/drivers/xen/xen-pciback/pciback_ops.c b/drivers/xen/xen-pciback/pciback_ops.c -index fa2b222..4db6c19 100644 +index ee2c891..573590b 100644 --- a/drivers/xen/xen-pciback/pciback_ops.c +++ b/drivers/xen/xen-pciback/pciback_ops.c -@@ -266,7 +266,7 @@ error: +@@ -268,7 +268,7 @@ int xen_pcibk_enable_msix(struct xen_pcibk_device *pdev, if (dev_data) dev_data->ack_intr = 0; - + - return result > 0 ? 0 : result; + return result >= 0 ? 0 : XEN_PCI_ERR_op_failed; } diff --git a/version b/version index 9bb7e62..469f283 100644 --- a/version +++ b/version @@ -1 +1 @@ -4.15.16 +4.16.2 From e4913200f699d4bde022b67c9bf8177c8b7e7e01 Mon Sep 17 00:00:00 2001 From: Simon Gaiser Date: Tue, 17 Apr 2018 04:57:47 +0200 Subject: [PATCH 4/6] Replace xenbus workaround with upstreamed fix --- ...rontend-Fix-XS_TRANSACTION_END-handl.patch | 49 + ...rontend-Verify-body-of-XS_TRANSACTIO.patch | 55 + ...-xen-avoid-deadlock-in-xenbus-driver.patch | 52 - .../Revert-xen-avoid-deadlock-in-xenbus.patch | 34 - ...ize-xenbus-driver-for-multiple-concu.patch | 1518 ----------------- ...move-transaction-holder-from-list-be.patch | 30 - ...evert-xenbus-track-caller-request-id.patch | 60 - ...-closing-of-non-existent-transaction.patch | 35 + series.conf | 11 +- 9 files changed, 143 insertions(+), 1701 deletions(-) create mode 100644 patches.xen/2a22ee6c3ab1-xen-xenbus_dev_frontend-Fix-XS_TRANSACTION_END-handl.patch create mode 100644 patches.xen/8fe5ab411209-xen-xenbus_dev_frontend-Verify-body-of-XS_TRANSACTIO.patch delete mode 100644 patches.xen/Revert-xen-avoid-deadlock-in-xenbus-driver.patch delete mode 100644 patches.xen/Revert-xen-avoid-deadlock-in-xenbus.patch delete mode 100644 patches.xen/Revert-xen-optimize-xenbus-driver-for-multiple-concu.patch delete mode 100644 patches.xen/Revert-xenbus-remove-transaction-holder-from-list-be.patch delete mode 100644 patches.xen/Revert-xenbus-track-caller-request-id.patch create mode 100644 patches.xen/b93008d1ac65-xen-xenbus-Catch-closing-of-non-existent-transaction.patch diff --git a/patches.xen/2a22ee6c3ab1-xen-xenbus_dev_frontend-Fix-XS_TRANSACTION_END-handl.patch b/patches.xen/2a22ee6c3ab1-xen-xenbus_dev_frontend-Fix-XS_TRANSACTION_END-handl.patch new file mode 100644 index 0000000..da5b792 --- /dev/null +++ b/patches.xen/2a22ee6c3ab1-xen-xenbus_dev_frontend-Fix-XS_TRANSACTION_END-handl.patch @@ -0,0 +1,49 @@ +From 2a22ee6c3ab1d761bc9c04f1e4117edd55b82f09 Mon Sep 17 00:00:00 2001 +From: Simon Gaiser +Date: Thu, 15 Mar 2018 03:43:20 +0100 +Subject: [PATCH 1/3] xen: xenbus_dev_frontend: Fix XS_TRANSACTION_END handling + +Commit fd8aa9095a95 ("xen: optimize xenbus driver for multiple +concurrent xenstore accesses") made a subtle change to the semantic of +xenbus_dev_request_and_reply() and xenbus_transaction_end(). + +Before on an error response to XS_TRANSACTION_END +xenbus_dev_request_and_reply() would not decrement the active +transaction counter. But xenbus_transaction_end() has always counted the +transaction as finished regardless of the response. + +The new behavior is that xenbus_dev_request_and_reply() and +xenbus_transaction_end() will always count the transaction as finished +regardless the response code (handled in xs_request_exit()). + +But xenbus_dev_frontend tries to end a transaction on closing of the +device if the XS_TRANSACTION_END failed before. Trying to close the +transaction twice corrupts the reference count. So fix this by also +considering a transaction closed if we have sent XS_TRANSACTION_END once +regardless of the return code. + +Cc: # 4.11 +Fixes: fd8aa9095a95 ("xen: optimize xenbus driver for multiple concurrent xenstore accesses") +Signed-off-by: Simon Gaiser +Reviewed-by: Juergen Gross +Signed-off-by: Boris Ostrovsky +--- + drivers/xen/xenbus/xenbus_dev_frontend.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c +index a493e99bed21..81a84b3c1c50 100644 +--- a/drivers/xen/xenbus/xenbus_dev_frontend.c ++++ b/drivers/xen/xenbus/xenbus_dev_frontend.c +@@ -365,7 +365,7 @@ void xenbus_dev_queue_reply(struct xb_req_data *req) + if (WARN_ON(rc)) + goto out; + } +- } else if (req->msg.type == XS_TRANSACTION_END) { ++ } else if (req->type == XS_TRANSACTION_END) { + trans = xenbus_get_transaction(u, req->msg.tx_id); + if (WARN_ON(!trans)) + goto out; +-- +2.16.2 + diff --git a/patches.xen/8fe5ab411209-xen-xenbus_dev_frontend-Verify-body-of-XS_TRANSACTIO.patch b/patches.xen/8fe5ab411209-xen-xenbus_dev_frontend-Verify-body-of-XS_TRANSACTIO.patch new file mode 100644 index 0000000..a3233b4 --- /dev/null +++ b/patches.xen/8fe5ab411209-xen-xenbus_dev_frontend-Verify-body-of-XS_TRANSACTIO.patch @@ -0,0 +1,55 @@ +From 8fe5ab411209ac6e2c7021131e622fd004506d1a Mon Sep 17 00:00:00 2001 +From: Simon Gaiser +Date: Thu, 15 Mar 2018 03:43:22 +0100 +Subject: [PATCH 3/3] xen: xenbus_dev_frontend: Verify body of + XS_TRANSACTION_END + +By guaranteeing that the argument of XS_TRANSACTION_END is valid we can +assume that the transaction has been closed when we get an XS_ERROR +response from xenstore (Note that we already verify that it's a valid +transaction id). + +Signed-off-by: Simon Gaiser +Reviewed-by: Juergen Gross +Signed-off-by: Boris Ostrovsky +--- + drivers/xen/xenbus/xenbus_dev_frontend.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c +index 81a84b3c1c50..0d6d9264d6a9 100644 +--- a/drivers/xen/xenbus/xenbus_dev_frontend.c ++++ b/drivers/xen/xenbus/xenbus_dev_frontend.c +@@ -429,6 +429,10 @@ static int xenbus_write_transaction(unsigned msg_type, + { + int rc; + struct xenbus_transaction_holder *trans = NULL; ++ struct { ++ struct xsd_sockmsg hdr; ++ char body[]; ++ } *msg = (void *)u->u.buffer; + + if (msg_type == XS_TRANSACTION_START) { + trans = kzalloc(sizeof(*trans), GFP_KERNEL); +@@ -437,11 +441,15 @@ static int xenbus_write_transaction(unsigned msg_type, + goto out; + } + list_add(&trans->list, &u->transactions); +- } else if (u->u.msg.tx_id != 0 && +- !xenbus_get_transaction(u, u->u.msg.tx_id)) ++ } else if (msg->hdr.tx_id != 0 && ++ !xenbus_get_transaction(u, msg->hdr.tx_id)) + return xenbus_command_reply(u, XS_ERROR, "ENOENT"); ++ else if (msg_type == XS_TRANSACTION_END && ++ !(msg->hdr.len == 2 && ++ (!strcmp(msg->body, "T") || !strcmp(msg->body, "F")))) ++ return xenbus_command_reply(u, XS_ERROR, "EINVAL"); + +- rc = xenbus_dev_request_and_reply(&u->u.msg, u); ++ rc = xenbus_dev_request_and_reply(&msg->hdr, u); + if (rc && trans) { + list_del(&trans->list); + kfree(trans); +-- +2.16.2 + diff --git a/patches.xen/Revert-xen-avoid-deadlock-in-xenbus-driver.patch b/patches.xen/Revert-xen-avoid-deadlock-in-xenbus-driver.patch deleted file mode 100644 index 9727065..0000000 --- a/patches.xen/Revert-xen-avoid-deadlock-in-xenbus-driver.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 7eed8836d3046a93848b891399ebbeee1d56e4f5 Mon Sep 17 00:00:00 2001 -From: Simon Gaiser -Date: Tue, 30 Jan 2018 07:34:49 +0100 -Subject: [PATCH 2/4] Revert "xen: avoid deadlock in xenbus driver" - -This reverts commit 1a3fc2c402810bf336882e695abd1678dbc8d279. ---- - drivers/xen/xenbus/xenbus_comms.c | 21 +++++++++++---------- - 1 file changed, 11 insertions(+), 10 deletions(-) - -diff --git a/drivers/xen/xenbus/xenbus_comms.c b/drivers/xen/xenbus/xenbus_comms.c -index 5b081a01779d..856ada5d39c9 100644 ---- a/drivers/xen/xenbus/xenbus_comms.c -+++ b/drivers/xen/xenbus/xenbus_comms.c -@@ -299,7 +299,17 @@ static int process_msg(void) - mutex_lock(&xb_write_mutex); - list_for_each_entry(req, &xs_reply_list, list) { - if (req->msg.req_id == state.msg.req_id) { -- list_del(&req->list); -+ if (req->state == xb_req_state_wait_reply) { -+ req->msg.type = state.msg.type; -+ req->msg.len = state.msg.len; -+ req->body = state.body; -+ req->state = xb_req_state_got_reply; -+ list_del(&req->list); -+ req->cb(req); -+ } else { -+ list_del(&req->list); -+ kfree(req); -+ } - err = 0; - break; - } -@@ -307,15 +317,6 @@ static int process_msg(void) - mutex_unlock(&xb_write_mutex); - if (err) - goto out; -- -- if (req->state == xb_req_state_wait_reply) { -- req->msg.type = state.msg.type; -- req->msg.len = state.msg.len; -- req->body = state.body; -- req->state = xb_req_state_got_reply; -- req->cb(req); -- } else -- kfree(req); - } - - mutex_unlock(&xs_response_mutex); --- -2.15.1 - diff --git a/patches.xen/Revert-xen-avoid-deadlock-in-xenbus.patch b/patches.xen/Revert-xen-avoid-deadlock-in-xenbus.patch deleted file mode 100644 index 5404c0b..0000000 --- a/patches.xen/Revert-xen-avoid-deadlock-in-xenbus.patch +++ /dev/null @@ -1,34 +0,0 @@ -From f9d9d4c0a6bf6d693d882ea99f0e57b0241b3370 Mon Sep 17 00:00:00 2001 -From: Simon Gaiser -Date: Tue, 30 Jan 2018 07:34:40 +0100 -Subject: [PATCH 1/4] Revert "xen: avoid deadlock in xenbus" - -This reverts commit 529871bb3c0675d0b425e2070d5a739db097be98. ---- - drivers/xen/xenbus/xenbus_xs.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c -index 3e59590c7254..e46080214955 100644 ---- a/drivers/xen/xenbus/xenbus_xs.c -+++ b/drivers/xen/xenbus/xenbus_xs.c -@@ -857,8 +857,6 @@ static int xenwatch_thread(void *unused) - struct list_head *ent; - struct xs_watch_event *event; - -- xenwatch_pid = current->pid; -- - for (;;) { - wait_event_interruptible(watch_events_waitq, - !list_empty(&watch_events)); -@@ -927,6 +925,7 @@ int xs_init(void) - task = kthread_run(xenwatch_thread, NULL, "xenwatch"); - if (IS_ERR(task)) - return PTR_ERR(task); -+ xenwatch_pid = task->pid; - - /* shutdown watches for kexec boot */ - xs_reset_watches(); --- -2.15.1 - diff --git a/patches.xen/Revert-xen-optimize-xenbus-driver-for-multiple-concu.patch b/patches.xen/Revert-xen-optimize-xenbus-driver-for-multiple-concu.patch deleted file mode 100644 index 0e60cf4..0000000 --- a/patches.xen/Revert-xen-optimize-xenbus-driver-for-multiple-concu.patch +++ /dev/null @@ -1,1518 +0,0 @@ -From 8829b1a71ba3dc2d0d5d3b6d494b798cc35f3a7e Mon Sep 17 00:00:00 2001 -From: Simon Gaiser -Date: Tue, 30 Jan 2018 07:38:25 +0100 -Subject: [PATCH 4/4] Revert "xen: optimize xenbus driver for multiple - concurrent xenstore accesses" - -This reverts commit fd8aa9095a95c02dcc35540a263267c29b8fda9d. ---- - drivers/xen/xenbus/xenbus.h | 48 +-- - drivers/xen/xenbus/xenbus_comms.c | 307 ++---------------- - drivers/xen/xenbus/xenbus_dev_frontend.c | 188 ++++------- - drivers/xen/xenbus/xenbus_xs.c | 520 +++++++++++++++++-------------- - 4 files changed, 391 insertions(+), 672 deletions(-) - -diff --git a/drivers/xen/xenbus/xenbus.h b/drivers/xen/xenbus/xenbus.h -index 149c5e7efc89..51995276f549 100644 ---- a/drivers/xen/xenbus/xenbus.h -+++ b/drivers/xen/xenbus/xenbus.h -@@ -32,10 +32,6 @@ - #ifndef _XENBUS_XENBUS_H - #define _XENBUS_XENBUS_H - --#include --#include --#include -- - #define XEN_BUS_ID_SIZE 20 - - struct xen_bus_type { -@@ -56,49 +52,16 @@ enum xenstore_init { - XS_LOCAL, - }; - --struct xs_watch_event { -- struct list_head list; -- unsigned int len; -- struct xenbus_watch *handle; -- const char *path; -- const char *token; -- char body[]; --}; -- --enum xb_req_state { -- xb_req_state_queued, -- xb_req_state_wait_reply, -- xb_req_state_got_reply, -- xb_req_state_aborted --}; -- --struct xb_req_data { -- struct list_head list; -- wait_queue_head_t wq; -- struct xsd_sockmsg msg; -- enum xsd_sockmsg_type type; -- char *body; -- const struct kvec *vec; -- int num_vecs; -- int err; -- enum xb_req_state state; -- void (*cb)(struct xb_req_data *); -- void *par; --}; -- - extern enum xenstore_init xen_store_domain_type; - extern const struct attribute_group *xenbus_dev_groups[]; --extern struct mutex xs_response_mutex; --extern struct list_head xs_reply_list; --extern struct list_head xb_write_list; --extern wait_queue_head_t xb_waitq; --extern struct mutex xb_write_mutex; - - int xs_init(void); - int xb_init_comms(void); - void xb_deinit_comms(void); --int xs_watch_msg(struct xs_watch_event *event); --void xs_request_exit(struct xb_req_data *req); -+int xb_write(const void *data, unsigned int len); -+int xb_read(void *data, unsigned int len); -+int xb_data_to_read(void); -+int xb_wait_for_data_to_read(void); - - int xenbus_match(struct device *_dev, struct device_driver *_drv); - int xenbus_dev_probe(struct device *_dev); -@@ -129,7 +92,6 @@ int xenbus_read_otherend_details(struct xenbus_device *xendev, - - void xenbus_ring_ops_init(void); - --int xenbus_dev_request_and_reply(struct xsd_sockmsg *msg, void *par); --void xenbus_dev_queue_reply(struct xb_req_data *req); -+void *xenbus_dev_request_and_reply(struct xsd_sockmsg *msg); - - #endif -diff --git a/drivers/xen/xenbus/xenbus_comms.c b/drivers/xen/xenbus/xenbus_comms.c -index 856ada5d39c9..c21ec02643e1 100644 ---- a/drivers/xen/xenbus/xenbus_comms.c -+++ b/drivers/xen/xenbus/xenbus_comms.c -@@ -34,7 +34,6 @@ - - #include - #include --#include - #include - #include - #include -@@ -43,22 +42,11 @@ - #include - #include "xenbus.h" - --/* A list of replies. Currently only one will ever be outstanding. */ --LIST_HEAD(xs_reply_list); -- --/* A list of write requests. */ --LIST_HEAD(xb_write_list); --DECLARE_WAIT_QUEUE_HEAD(xb_waitq); --DEFINE_MUTEX(xb_write_mutex); -- --/* Protect xenbus reader thread against save/restore. */ --DEFINE_MUTEX(xs_response_mutex); -- - static int xenbus_irq; --static struct task_struct *xenbus_task; - - static DECLARE_WORK(probe_work, xenbus_probe); - -+static DECLARE_WAIT_QUEUE_HEAD(xb_waitq); - - static irqreturn_t wake_waiting(int irq, void *unused) - { -@@ -96,31 +84,30 @@ static const void *get_input_chunk(XENSTORE_RING_IDX cons, - return buf + MASK_XENSTORE_IDX(cons); - } - --static int xb_data_to_write(void) --{ -- struct xenstore_domain_interface *intf = xen_store_interface; -- -- return (intf->req_prod - intf->req_cons) != XENSTORE_RING_SIZE && -- !list_empty(&xb_write_list); --} -- - /** - * xb_write - low level write - * @data: buffer to send - * @len: length of buffer - * -- * Returns number of bytes written or -err. -+ * Returns 0 on success, error otherwise. - */ --static int xb_write(const void *data, unsigned int len) -+int xb_write(const void *data, unsigned len) - { - struct xenstore_domain_interface *intf = xen_store_interface; - XENSTORE_RING_IDX cons, prod; -- unsigned int bytes = 0; -+ int rc; - - while (len != 0) { - void *dst; - unsigned int avail; - -+ rc = wait_event_interruptible( -+ xb_waitq, -+ (intf->req_prod - intf->req_cons) != -+ XENSTORE_RING_SIZE); -+ if (rc < 0) -+ return rc; -+ - /* Read indexes, then verify. */ - cons = intf->req_cons; - prod = intf->req_prod; -@@ -128,11 +115,6 @@ static int xb_write(const void *data, unsigned int len) - intf->req_cons = intf->req_prod = 0; - return -EIO; - } -- if (!xb_data_to_write()) -- return bytes; -- -- /* Must write data /after/ reading the consumer index. */ -- virt_mb(); - - dst = get_output_chunk(cons, prod, intf->req, &avail); - if (avail == 0) -@@ -140,45 +122,52 @@ static int xb_write(const void *data, unsigned int len) - if (avail > len) - avail = len; - -+ /* Must write data /after/ reading the consumer index. */ -+ virt_mb(); -+ - memcpy(dst, data, avail); - data += avail; - len -= avail; -- bytes += avail; - - /* Other side must not see new producer until data is there. */ - virt_wmb(); - intf->req_prod += avail; - - /* Implies mb(): other side will see the updated producer. */ -- if (prod <= intf->req_cons) -- notify_remote_via_evtchn(xen_store_evtchn); -+ notify_remote_via_evtchn(xen_store_evtchn); - } - -- return bytes; -+ return 0; - } - --static int xb_data_to_read(void) -+int xb_data_to_read(void) - { - struct xenstore_domain_interface *intf = xen_store_interface; - return (intf->rsp_cons != intf->rsp_prod); - } - --static int xb_read(void *data, unsigned int len) -+int xb_wait_for_data_to_read(void) -+{ -+ return wait_event_interruptible(xb_waitq, xb_data_to_read()); -+} -+ -+int xb_read(void *data, unsigned len) - { - struct xenstore_domain_interface *intf = xen_store_interface; - XENSTORE_RING_IDX cons, prod; -- unsigned int bytes = 0; -+ int rc; - - while (len != 0) { - unsigned int avail; - const char *src; - -+ rc = xb_wait_for_data_to_read(); -+ if (rc < 0) -+ return rc; -+ - /* Read indexes, then verify. */ - cons = intf->rsp_cons; - prod = intf->rsp_prod; -- if (cons == prod) -- return bytes; -- - if (!check_indexes(cons, prod)) { - intf->rsp_cons = intf->rsp_prod = 0; - return -EIO; -@@ -196,243 +185,17 @@ static int xb_read(void *data, unsigned int len) - memcpy(data, src, avail); - data += avail; - len -= avail; -- bytes += avail; - - /* Other side must not see free space until we've copied out */ - virt_mb(); - intf->rsp_cons += avail; - -- /* Implies mb(): other side will see the updated consumer. */ -- if (intf->rsp_prod - cons >= XENSTORE_RING_SIZE) -- notify_remote_via_evtchn(xen_store_evtchn); -- } -- -- return bytes; --} -- --static int process_msg(void) --{ -- static struct { -- struct xsd_sockmsg msg; -- char *body; -- union { -- void *alloc; -- struct xs_watch_event *watch; -- }; -- bool in_msg; -- bool in_hdr; -- unsigned int read; -- } state; -- struct xb_req_data *req; -- int err; -- unsigned int len; -- -- if (!state.in_msg) { -- state.in_msg = true; -- state.in_hdr = true; -- state.read = 0; -- -- /* -- * We must disallow save/restore while reading a message. -- * A partial read across s/r leaves us out of sync with -- * xenstored. -- * xs_response_mutex is locked as long as we are processing one -- * message. state.in_msg will be true as long as we are holding -- * the lock here. -- */ -- mutex_lock(&xs_response_mutex); -- -- if (!xb_data_to_read()) { -- /* We raced with save/restore: pending data 'gone'. */ -- mutex_unlock(&xs_response_mutex); -- state.in_msg = false; -- return 0; -- } -- } -- -- if (state.in_hdr) { -- if (state.read != sizeof(state.msg)) { -- err = xb_read((void *)&state.msg + state.read, -- sizeof(state.msg) - state.read); -- if (err < 0) -- goto out; -- state.read += err; -- if (state.read != sizeof(state.msg)) -- return 0; -- if (state.msg.len > XENSTORE_PAYLOAD_MAX) { -- err = -EINVAL; -- goto out; -- } -- } -- -- len = state.msg.len + 1; -- if (state.msg.type == XS_WATCH_EVENT) -- len += sizeof(*state.watch); -- -- state.alloc = kmalloc(len, GFP_NOIO | __GFP_HIGH); -- if (!state.alloc) -- return -ENOMEM; -- -- if (state.msg.type == XS_WATCH_EVENT) -- state.body = state.watch->body; -- else -- state.body = state.alloc; -- state.in_hdr = false; -- state.read = 0; -- } -- -- err = xb_read(state.body + state.read, state.msg.len - state.read); -- if (err < 0) -- goto out; -- -- state.read += err; -- if (state.read != state.msg.len) -- return 0; -+ pr_debug("Finished read of %i bytes (%i to go)\n", avail, len); - -- state.body[state.msg.len] = '\0'; -- -- if (state.msg.type == XS_WATCH_EVENT) { -- state.watch->len = state.msg.len; -- err = xs_watch_msg(state.watch); -- } else { -- err = -ENOENT; -- mutex_lock(&xb_write_mutex); -- list_for_each_entry(req, &xs_reply_list, list) { -- if (req->msg.req_id == state.msg.req_id) { -- if (req->state == xb_req_state_wait_reply) { -- req->msg.type = state.msg.type; -- req->msg.len = state.msg.len; -- req->body = state.body; -- req->state = xb_req_state_got_reply; -- list_del(&req->list); -- req->cb(req); -- } else { -- list_del(&req->list); -- kfree(req); -- } -- err = 0; -- break; -- } -- } -- mutex_unlock(&xb_write_mutex); -- if (err) -- goto out; -- } -- -- mutex_unlock(&xs_response_mutex); -- -- state.in_msg = false; -- state.alloc = NULL; -- return err; -- -- out: -- mutex_unlock(&xs_response_mutex); -- state.in_msg = false; -- kfree(state.alloc); -- state.alloc = NULL; -- return err; --} -- --static int process_writes(void) --{ -- static struct { -- struct xb_req_data *req; -- int idx; -- unsigned int written; -- } state; -- void *base; -- unsigned int len; -- int err = 0; -- -- if (!xb_data_to_write()) -- return 0; -- -- mutex_lock(&xb_write_mutex); -- -- if (!state.req) { -- state.req = list_first_entry(&xb_write_list, -- struct xb_req_data, list); -- state.idx = -1; -- state.written = 0; -- } -- -- if (state.req->state == xb_req_state_aborted) -- goto out_err; -- -- while (state.idx < state.req->num_vecs) { -- if (state.idx < 0) { -- base = &state.req->msg; -- len = sizeof(state.req->msg); -- } else { -- base = state.req->vec[state.idx].iov_base; -- len = state.req->vec[state.idx].iov_len; -- } -- err = xb_write(base + state.written, len - state.written); -- if (err < 0) -- goto out_err; -- state.written += err; -- if (state.written != len) -- goto out; -- -- state.idx++; -- state.written = 0; -- } -- -- list_del(&state.req->list); -- state.req->state = xb_req_state_wait_reply; -- list_add_tail(&state.req->list, &xs_reply_list); -- state.req = NULL; -- -- out: -- mutex_unlock(&xb_write_mutex); -- -- return 0; -- -- out_err: -- state.req->msg.type = XS_ERROR; -- state.req->err = err; -- list_del(&state.req->list); -- if (state.req->state == xb_req_state_aborted) -- kfree(state.req); -- else { -- state.req->state = xb_req_state_got_reply; -- wake_up(&state.req->wq); -- } -- -- mutex_unlock(&xb_write_mutex); -- -- state.req = NULL; -- -- return err; --} -- --static int xb_thread_work(void) --{ -- return xb_data_to_read() || xb_data_to_write(); --} -- --static int xenbus_thread(void *unused) --{ -- int err; -- -- while (!kthread_should_stop()) { -- if (wait_event_interruptible(xb_waitq, xb_thread_work())) -- continue; -- -- err = process_msg(); -- if (err == -ENOMEM) -- schedule(); -- else if (err) -- pr_warn_ratelimited("error %d while reading message\n", -- err); -- -- err = process_writes(); -- if (err) -- pr_warn_ratelimited("error %d while writing message\n", -- err); -+ /* Implies mb(): other side will see the updated consumer. */ -+ notify_remote_via_evtchn(xen_store_evtchn); - } - -- xenbus_task = NULL; - return 0; - } - -@@ -460,7 +223,6 @@ int xb_init_comms(void) - rebind_evtchn_irq(xen_store_evtchn, xenbus_irq); - } else { - int err; -- - err = bind_evtchn_to_irqhandler(xen_store_evtchn, wake_waiting, - 0, "xenbus", &xb_waitq); - if (err < 0) { -@@ -469,13 +231,6 @@ int xb_init_comms(void) - } - - xenbus_irq = err; -- -- if (!xenbus_task) { -- xenbus_task = kthread_run(xenbus_thread, NULL, -- "xenbus"); -- if (IS_ERR(xenbus_task)) -- return PTR_ERR(xenbus_task); -- } - } - - return 0; -diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c -index 1f4733b80c87..19f823b378a0 100644 ---- a/drivers/xen/xenbus/xenbus_dev_frontend.c -+++ b/drivers/xen/xenbus/xenbus_dev_frontend.c -@@ -112,7 +112,6 @@ struct xenbus_file_priv { - struct list_head read_buffers; - wait_queue_head_t read_waitq; - -- struct kref kref; - }; - - /* Read out any raw xenbus messages queued up. */ -@@ -297,107 +296,6 @@ static void watch_fired(struct xenbus_watch *watch, - mutex_unlock(&adap->dev_data->reply_mutex); - } - --static void xenbus_file_free(struct kref *kref) --{ -- struct xenbus_file_priv *u; -- struct xenbus_transaction_holder *trans, *tmp; -- struct watch_adapter *watch, *tmp_watch; -- struct read_buffer *rb, *tmp_rb; -- -- u = container_of(kref, struct xenbus_file_priv, kref); -- -- /* -- * No need for locking here because there are no other users, -- * by definition. -- */ -- -- list_for_each_entry_safe(trans, tmp, &u->transactions, list) { -- xenbus_transaction_end(trans->handle, 1); -- list_del(&trans->list); -- kfree(trans); -- } -- -- list_for_each_entry_safe(watch, tmp_watch, &u->watches, list) { -- unregister_xenbus_watch(&watch->watch); -- list_del(&watch->list); -- free_watch_adapter(watch); -- } -- -- list_for_each_entry_safe(rb, tmp_rb, &u->read_buffers, list) { -- list_del(&rb->list); -- kfree(rb); -- } -- kfree(u); --} -- --static struct xenbus_transaction_holder *xenbus_get_transaction( -- struct xenbus_file_priv *u, uint32_t tx_id) --{ -- struct xenbus_transaction_holder *trans; -- -- list_for_each_entry(trans, &u->transactions, list) -- if (trans->handle.id == tx_id) -- return trans; -- -- return NULL; --} -- --void xenbus_dev_queue_reply(struct xb_req_data *req) --{ -- struct xenbus_file_priv *u = req->par; -- struct xenbus_transaction_holder *trans = NULL; -- int rc; -- LIST_HEAD(staging_q); -- -- xs_request_exit(req); -- -- mutex_lock(&u->msgbuffer_mutex); -- -- if (req->type == XS_TRANSACTION_START) { -- trans = xenbus_get_transaction(u, 0); -- if (WARN_ON(!trans)) -- goto out; -- if (req->msg.type == XS_ERROR) { -- list_del(&trans->list); -- kfree(trans); -- } else { -- rc = kstrtou32(req->body, 10, &trans->handle.id); -- if (WARN_ON(rc)) -- goto out; -- } -- } else if (req->msg.type == XS_TRANSACTION_END) { -- trans = xenbus_get_transaction(u, req->msg.tx_id); -- if (WARN_ON(!trans)) -- goto out; -- list_del(&trans->list); -- kfree(trans); -- } -- -- mutex_unlock(&u->msgbuffer_mutex); -- -- mutex_lock(&u->reply_mutex); -- rc = queue_reply(&staging_q, &req->msg, sizeof(req->msg)); -- if (!rc) -- rc = queue_reply(&staging_q, req->body, req->msg.len); -- if (!rc) { -- list_splice_tail(&staging_q, &u->read_buffers); -- wake_up(&u->read_waitq); -- } else { -- queue_cleanup(&staging_q); -- } -- mutex_unlock(&u->reply_mutex); -- -- kfree(req->body); -- kfree(req); -- -- kref_put(&u->kref, xenbus_file_free); -- -- return; -- -- out: -- mutex_unlock(&u->msgbuffer_mutex); --} -- - static int xenbus_command_reply(struct xenbus_file_priv *u, - unsigned int msg_type, const char *reply) - { -@@ -418,9 +316,6 @@ static int xenbus_command_reply(struct xenbus_file_priv *u, - wake_up(&u->read_waitq); - mutex_unlock(&u->reply_mutex); - -- if (!rc) -- kref_put(&u->kref, xenbus_file_free); -- - return rc; - } - -@@ -428,22 +323,57 @@ static int xenbus_write_transaction(unsigned msg_type, - struct xenbus_file_priv *u) - { - int rc; -+ void *reply; - struct xenbus_transaction_holder *trans = NULL; -+ LIST_HEAD(staging_q); - - if (msg_type == XS_TRANSACTION_START) { -- trans = kzalloc(sizeof(*trans), GFP_KERNEL); -+ trans = kmalloc(sizeof(*trans), GFP_KERNEL); - if (!trans) { - rc = -ENOMEM; - goto out; - } -- list_add(&trans->list, &u->transactions); -- } else if (u->u.msg.tx_id != 0 && -- !xenbus_get_transaction(u, u->u.msg.tx_id)) -- return xenbus_command_reply(u, XS_ERROR, "ENOENT"); -+ } else if (u->u.msg.tx_id != 0) { -+ list_for_each_entry(trans, &u->transactions, list) -+ if (trans->handle.id == u->u.msg.tx_id) -+ break; -+ if (&trans->list == &u->transactions) -+ return xenbus_command_reply(u, XS_ERROR, "ENOENT"); -+ } -+ -+ reply = xenbus_dev_request_and_reply(&u->u.msg); -+ if (IS_ERR(reply)) { -+ if (msg_type == XS_TRANSACTION_START) -+ kfree(trans); -+ rc = PTR_ERR(reply); -+ goto out; -+ } - -- rc = xenbus_dev_request_and_reply(&u->u.msg, u); -- if (rc) -+ if (msg_type == XS_TRANSACTION_START) { -+ if (u->u.msg.type == XS_ERROR) -+ kfree(trans); -+ else { -+ trans->handle.id = simple_strtoul(reply, NULL, 0); -+ list_add(&trans->list, &u->transactions); -+ } -+ } else if (u->u.msg.type == XS_TRANSACTION_END) { -+ list_del(&trans->list); - kfree(trans); -+ } -+ -+ mutex_lock(&u->reply_mutex); -+ rc = queue_reply(&staging_q, &u->u.msg, sizeof(u->u.msg)); -+ if (!rc) -+ rc = queue_reply(&staging_q, reply, u->u.msg.len); -+ if (!rc) { -+ list_splice_tail(&staging_q, &u->read_buffers); -+ wake_up(&u->read_waitq); -+ } else { -+ queue_cleanup(&staging_q); -+ } -+ mutex_unlock(&u->reply_mutex); -+ -+ kfree(reply); - - out: - return rc; -@@ -575,8 +505,6 @@ static ssize_t xenbus_file_write(struct file *filp, - * OK, now we have a complete message. Do something with it. - */ - -- kref_get(&u->kref); -- - msg_type = u->u.msg.type; - - switch (msg_type) { -@@ -591,10 +519,8 @@ static ssize_t xenbus_file_write(struct file *filp, - ret = xenbus_write_transaction(msg_type, u); - break; - } -- if (ret != 0) { -+ if (ret != 0) - rc = ret; -- kref_put(&u->kref, xenbus_file_free); -- } - - /* Buffered message consumed */ - u->len = 0; -@@ -619,8 +545,6 @@ static int xenbus_file_open(struct inode *inode, struct file *filp) - if (u == NULL) - return -ENOMEM; - -- kref_init(&u->kref); -- - INIT_LIST_HEAD(&u->transactions); - INIT_LIST_HEAD(&u->watches); - INIT_LIST_HEAD(&u->read_buffers); -@@ -637,8 +561,32 @@ static int xenbus_file_open(struct inode *inode, struct file *filp) - static int xenbus_file_release(struct inode *inode, struct file *filp) - { - struct xenbus_file_priv *u = filp->private_data; -+ struct xenbus_transaction_holder *trans, *tmp; -+ struct watch_adapter *watch, *tmp_watch; -+ struct read_buffer *rb, *tmp_rb; -+ -+ /* -+ * No need for locking here because there are no other users, -+ * by definition. -+ */ - -- kref_put(&u->kref, xenbus_file_free); -+ list_for_each_entry_safe(trans, tmp, &u->transactions, list) { -+ xenbus_transaction_end(trans->handle, 1); -+ list_del(&trans->list); -+ kfree(trans); -+ } -+ -+ list_for_each_entry_safe(watch, tmp_watch, &u->watches, list) { -+ unregister_xenbus_watch(&watch->watch); -+ list_del(&watch->list); -+ free_watch_adapter(watch); -+ } -+ -+ list_for_each_entry_safe(rb, tmp_rb, &u->read_buffers, list) { -+ list_del(&rb->list); -+ kfree(rb); -+ } -+ kfree(u); - - return 0; - } -diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c -index e46080214955..ebc768f44abe 100644 ---- a/drivers/xen/xenbus/xenbus_xs.c -+++ b/drivers/xen/xenbus/xenbus_xs.c -@@ -43,7 +43,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -51,28 +50,61 @@ - #include - #include "xenbus.h" - --/* -- * Framework to protect suspend/resume handling against normal Xenstore -- * message handling: -- * During suspend/resume there must be no open transaction and no pending -- * Xenstore request. -- * New watch events happening in this time can be ignored by firing all watches -- * after resume. -- */ -+struct xs_stored_msg { -+ struct list_head list; - --/* Lock protecting enter/exit critical region. */ --static DEFINE_SPINLOCK(xs_state_lock); --/* Number of users in critical region (protected by xs_state_lock). */ --static unsigned int xs_state_users; --/* Suspend handler waiting or already active (protected by xs_state_lock)? */ --static int xs_suspend_active; --/* Unique Xenstore request id (protected by xs_state_lock). */ --static uint32_t xs_request_id; -+ struct xsd_sockmsg hdr; - --/* Wait queue for all callers waiting for critical region to become usable. */ --static DECLARE_WAIT_QUEUE_HEAD(xs_state_enter_wq); --/* Wait queue for suspend handling waiting for critical region being empty. */ --static DECLARE_WAIT_QUEUE_HEAD(xs_state_exit_wq); -+ union { -+ /* Queued replies. */ -+ struct { -+ char *body; -+ } reply; -+ -+ /* Queued watch events. */ -+ struct { -+ struct xenbus_watch *handle; -+ const char *path; -+ const char *token; -+ } watch; -+ } u; -+}; -+ -+struct xs_handle { -+ /* A list of replies. Currently only one will ever be outstanding. */ -+ struct list_head reply_list; -+ spinlock_t reply_lock; -+ wait_queue_head_t reply_waitq; -+ -+ /* -+ * Mutex ordering: transaction_mutex -> watch_mutex -> request_mutex. -+ * response_mutex is never taken simultaneously with the other three. -+ * -+ * transaction_mutex must be held before incrementing -+ * transaction_count. The mutex is held when a suspend is in -+ * progress to prevent new transactions starting. -+ * -+ * When decrementing transaction_count to zero the wait queue -+ * should be woken up, the suspend code waits for count to -+ * reach zero. -+ */ -+ -+ /* One request at a time. */ -+ struct mutex request_mutex; -+ -+ /* Protect xenbus reader thread against save/restore. */ -+ struct mutex response_mutex; -+ -+ /* Protect transactions against save/restore. */ -+ struct mutex transaction_mutex; -+ atomic_t transaction_count; -+ wait_queue_head_t transaction_wq; -+ -+ /* Protect watch (de)register against save/restore. */ -+ struct rw_semaphore watch_mutex; -+}; -+ -+static struct xs_handle xs_state; - - /* List of registered watches, and a lock to protect it. */ - static LIST_HEAD(watches); -@@ -82,9 +114,6 @@ static DEFINE_SPINLOCK(watches_lock); - static LIST_HEAD(watch_events); - static DEFINE_SPINLOCK(watch_events_lock); - --/* Protect watch (de)register against save/restore. */ --static DECLARE_RWSEM(xs_watch_rwsem); -- - /* - * Details of the xenwatch callback kernel thread. The thread waits on the - * watch_events_waitq for work to do (queued on watch_events list). When it -@@ -95,59 +124,6 @@ static pid_t xenwatch_pid; - static DEFINE_MUTEX(xenwatch_mutex); - static DECLARE_WAIT_QUEUE_HEAD(watch_events_waitq); - --static void xs_suspend_enter(void) --{ -- spin_lock(&xs_state_lock); -- xs_suspend_active++; -- spin_unlock(&xs_state_lock); -- wait_event(xs_state_exit_wq, xs_state_users == 0); --} -- --static void xs_suspend_exit(void) --{ -- spin_lock(&xs_state_lock); -- xs_suspend_active--; -- spin_unlock(&xs_state_lock); -- wake_up_all(&xs_state_enter_wq); --} -- --static uint32_t xs_request_enter(struct xb_req_data *req) --{ -- uint32_t rq_id; -- -- req->type = req->msg.type; -- -- spin_lock(&xs_state_lock); -- -- while (!xs_state_users && xs_suspend_active) { -- spin_unlock(&xs_state_lock); -- wait_event(xs_state_enter_wq, xs_suspend_active == 0); -- spin_lock(&xs_state_lock); -- } -- -- if (req->type == XS_TRANSACTION_START) -- xs_state_users++; -- xs_state_users++; -- rq_id = xs_request_id++; -- -- spin_unlock(&xs_state_lock); -- -- return rq_id; --} -- --void xs_request_exit(struct xb_req_data *req) --{ -- spin_lock(&xs_state_lock); -- xs_state_users--; -- if ((req->type == XS_TRANSACTION_START && req->msg.type == XS_ERROR) || -- req->type == XS_TRANSACTION_END) -- xs_state_users--; -- spin_unlock(&xs_state_lock); -- -- if (xs_suspend_active && !xs_state_users) -- wake_up(&xs_state_exit_wq); --} -- - static int get_error(const char *errorstring) - { - unsigned int i; -@@ -185,24 +161,21 @@ static bool xenbus_ok(void) - } - return false; - } -- --static bool test_reply(struct xb_req_data *req) -+static void *read_reply(enum xsd_sockmsg_type *type, unsigned int *len) - { -- if (req->state == xb_req_state_got_reply || !xenbus_ok()) -- return true; -+ struct xs_stored_msg *msg; -+ char *body; - -- /* Make sure to reread req->state each time. */ -- barrier(); -+ spin_lock(&xs_state.reply_lock); - -- return false; --} -- --static void *read_reply(struct xb_req_data *req) --{ -- while (req->state != xb_req_state_got_reply) { -- wait_event(req->wq, test_reply(req)); -- -- if (!xenbus_ok()) -+ while (list_empty(&xs_state.reply_list)) { -+ spin_unlock(&xs_state.reply_lock); -+ if (xenbus_ok()) -+ /* XXX FIXME: Avoid synchronous wait for response here. */ -+ wait_event_timeout(xs_state.reply_waitq, -+ !list_empty(&xs_state.reply_list), -+ msecs_to_jiffies(500)); -+ else { - /* - * If we are in the process of being shut-down there is - * no point of trying to contact XenBus - it is either -@@ -210,82 +183,76 @@ static void *read_reply(struct xb_req_data *req) - * has been killed or is unreachable. - */ - return ERR_PTR(-EIO); -- if (req->err) -- return ERR_PTR(req->err); -- -+ } -+ spin_lock(&xs_state.reply_lock); - } - -- return req->body; --} -+ msg = list_entry(xs_state.reply_list.next, -+ struct xs_stored_msg, list); -+ list_del(&msg->list); - --static void xs_send(struct xb_req_data *req, struct xsd_sockmsg *msg) --{ -- bool notify; -+ spin_unlock(&xs_state.reply_lock); - -- req->msg = *msg; -- req->err = 0; -- req->state = xb_req_state_queued; -- init_waitqueue_head(&req->wq); -- -- req->msg.req_id = xs_request_enter(req); -+ *type = msg->hdr.type; -+ if (len) -+ *len = msg->hdr.len; -+ body = msg->u.reply.body; - -- mutex_lock(&xb_write_mutex); -- list_add_tail(&req->list, &xb_write_list); -- notify = list_is_singular(&xb_write_list); -- mutex_unlock(&xb_write_mutex); -+ kfree(msg); - -- if (notify) -- wake_up(&xb_waitq); -+ return body; - } - --static void *xs_wait_for_reply(struct xb_req_data *req, struct xsd_sockmsg *msg) -+static void transaction_start(void) - { -- void *ret; -- -- ret = read_reply(req); -- -- xs_request_exit(req); -- -- msg->type = req->msg.type; -- msg->len = req->msg.len; -+ mutex_lock(&xs_state.transaction_mutex); -+ atomic_inc(&xs_state.transaction_count); -+ mutex_unlock(&xs_state.transaction_mutex); -+} - -- mutex_lock(&xb_write_mutex); -- if (req->state == xb_req_state_queued || -- req->state == xb_req_state_wait_reply) -- req->state = xb_req_state_aborted; -- else -- kfree(req); -- mutex_unlock(&xb_write_mutex); -+static void transaction_end(void) -+{ -+ if (atomic_dec_and_test(&xs_state.transaction_count)) -+ wake_up(&xs_state.transaction_wq); -+} - -- return ret; -+static void transaction_suspend(void) -+{ -+ mutex_lock(&xs_state.transaction_mutex); -+ wait_event(xs_state.transaction_wq, -+ atomic_read(&xs_state.transaction_count) == 0); - } - --static void xs_wake_up(struct xb_req_data *req) -+static void transaction_resume(void) - { -- wake_up(&req->wq); -+ mutex_unlock(&xs_state.transaction_mutex); - } - --int xenbus_dev_request_and_reply(struct xsd_sockmsg *msg, void *par) -+void *xenbus_dev_request_and_reply(struct xsd_sockmsg *msg) - { -- struct xb_req_data *req; -- struct kvec *vec; -+ void *ret; -+ enum xsd_sockmsg_type type = msg->type; -+ int err; - -- req = kmalloc(sizeof(*req) + sizeof(*vec), GFP_KERNEL); -- if (!req) -- return -ENOMEM; -+ if (type == XS_TRANSACTION_START) -+ transaction_start(); -+ -+ mutex_lock(&xs_state.request_mutex); - -- vec = (struct kvec *)(req + 1); -- vec->iov_len = msg->len; -- vec->iov_base = msg + 1; -+ err = xb_write(msg, sizeof(*msg) + msg->len); -+ if (err) { -+ msg->type = XS_ERROR; -+ ret = ERR_PTR(err); -+ } else -+ ret = read_reply(&msg->type, &msg->len); - -- req->vec = vec; -- req->num_vecs = 1; -- req->cb = xenbus_dev_queue_reply; -- req->par = par; -+ mutex_unlock(&xs_state.request_mutex); - -- xs_send(req, msg); -+ if ((msg->type == XS_TRANSACTION_END) || -+ ((type == XS_TRANSACTION_START) && (msg->type == XS_ERROR))) -+ transaction_end(); - -- return 0; -+ return ret; - } - EXPORT_SYMBOL(xenbus_dev_request_and_reply); - -@@ -296,31 +263,37 @@ static void *xs_talkv(struct xenbus_transaction t, - unsigned int num_vecs, - unsigned int *len) - { -- struct xb_req_data *req; - struct xsd_sockmsg msg; - void *ret = NULL; - unsigned int i; - int err; - -- req = kmalloc(sizeof(*req), GFP_NOIO | __GFP_HIGH); -- if (!req) -- return ERR_PTR(-ENOMEM); -- -- req->vec = iovec; -- req->num_vecs = num_vecs; -- req->cb = xs_wake_up; -- - msg.tx_id = t.id; -+ msg.req_id = 0; - msg.type = type; - msg.len = 0; - for (i = 0; i < num_vecs; i++) - msg.len += iovec[i].iov_len; - -- xs_send(req, &msg); -+ mutex_lock(&xs_state.request_mutex); - -- ret = xs_wait_for_reply(req, &msg); -- if (len) -- *len = msg.len; -+ err = xb_write(&msg, sizeof(msg)); -+ if (err) { -+ mutex_unlock(&xs_state.request_mutex); -+ return ERR_PTR(err); -+ } -+ -+ for (i = 0; i < num_vecs; i++) { -+ err = xb_write(iovec[i].iov_base, iovec[i].iov_len); -+ if (err) { -+ mutex_unlock(&xs_state.request_mutex); -+ return ERR_PTR(err); -+ } -+ } -+ -+ ret = read_reply(&msg.type, len); -+ -+ mutex_unlock(&xs_state.request_mutex); - - if (IS_ERR(ret)) - return ret; -@@ -527,9 +500,13 @@ int xenbus_transaction_start(struct xenbus_transaction *t) - { - char *id_str; - -+ transaction_start(); -+ - id_str = xs_single(XBT_NIL, XS_TRANSACTION_START, "", NULL); -- if (IS_ERR(id_str)) -+ if (IS_ERR(id_str)) { -+ transaction_end(); - return PTR_ERR(id_str); -+ } - - t->id = simple_strtoul(id_str, NULL, 0); - kfree(id_str); -@@ -543,13 +520,18 @@ EXPORT_SYMBOL_GPL(xenbus_transaction_start); - int xenbus_transaction_end(struct xenbus_transaction t, int abort) - { - char abortstr[2]; -+ int err; - - if (abort) - strcpy(abortstr, "F"); - else - strcpy(abortstr, "T"); - -- return xs_error(xs_single(t, XS_TRANSACTION_END, abortstr, NULL)); -+ err = xs_error(xs_single(t, XS_TRANSACTION_END, abortstr, NULL)); -+ -+ transaction_end(); -+ -+ return err; - } - EXPORT_SYMBOL_GPL(xenbus_transaction_end); - -@@ -682,30 +664,6 @@ static struct xenbus_watch *find_watch(const char *token) - - return NULL; - } -- --int xs_watch_msg(struct xs_watch_event *event) --{ -- if (count_strings(event->body, event->len) != 2) { -- kfree(event); -- return -EINVAL; -- } -- event->path = (const char *)event->body; -- event->token = (const char *)strchr(event->body, '\0') + 1; -- -- spin_lock(&watches_lock); -- event->handle = find_watch(event->token); -- if (event->handle != NULL) { -- spin_lock(&watch_events_lock); -- list_add_tail(&event->list, &watch_events); -- wake_up(&watch_events_waitq); -- spin_unlock(&watch_events_lock); -- } else -- kfree(event); -- spin_unlock(&watches_lock); -- -- return 0; --} -- - /* - * Certain older XenBus toolstack cannot handle reading values that are - * not populated. Some Xen 3.4 installation are incapable of doing this -@@ -754,7 +712,7 @@ int register_xenbus_watch(struct xenbus_watch *watch) - - sprintf(token, "%lX", (long)watch); - -- down_read(&xs_watch_rwsem); -+ down_read(&xs_state.watch_mutex); - - spin_lock(&watches_lock); - BUG_ON(find_watch(token)); -@@ -769,7 +727,7 @@ int register_xenbus_watch(struct xenbus_watch *watch) - spin_unlock(&watches_lock); - } - -- up_read(&xs_watch_rwsem); -+ up_read(&xs_state.watch_mutex); - - return err; - } -@@ -777,13 +735,13 @@ EXPORT_SYMBOL_GPL(register_xenbus_watch); - - void unregister_xenbus_watch(struct xenbus_watch *watch) - { -- struct xs_watch_event *event, *tmp; -+ struct xs_stored_msg *msg, *tmp; - char token[sizeof(watch) * 2 + 1]; - int err; - - sprintf(token, "%lX", (long)watch); - -- down_read(&xs_watch_rwsem); -+ down_read(&xs_state.watch_mutex); - - spin_lock(&watches_lock); - BUG_ON(!find_watch(token)); -@@ -794,7 +752,7 @@ void unregister_xenbus_watch(struct xenbus_watch *watch) - if (err) - pr_warn("Failed to release watch %s: %i\n", watch->node, err); - -- up_read(&xs_watch_rwsem); -+ up_read(&xs_state.watch_mutex); - - /* Make sure there are no callbacks running currently (unless - its us) */ -@@ -803,11 +761,12 @@ void unregister_xenbus_watch(struct xenbus_watch *watch) - - /* Cancel pending watch events. */ - spin_lock(&watch_events_lock); -- list_for_each_entry_safe(event, tmp, &watch_events, list) { -- if (event->handle != watch) -+ list_for_each_entry_safe(msg, tmp, &watch_events, list) { -+ if (msg->u.watch.handle != watch) - continue; -- list_del(&event->list); -- kfree(event); -+ list_del(&msg->list); -+ kfree(msg->u.watch.path); -+ kfree(msg); - } - spin_unlock(&watch_events_lock); - -@@ -818,10 +777,10 @@ EXPORT_SYMBOL_GPL(unregister_xenbus_watch); - - void xs_suspend(void) - { -- xs_suspend_enter(); -- -- down_write(&xs_watch_rwsem); -- mutex_lock(&xs_response_mutex); -+ transaction_suspend(); -+ down_write(&xs_state.watch_mutex); -+ mutex_lock(&xs_state.request_mutex); -+ mutex_lock(&xs_state.response_mutex); - } - - void xs_resume(void) -@@ -831,31 +790,31 @@ void xs_resume(void) - - xb_init_comms(); - -- mutex_unlock(&xs_response_mutex); -- -- xs_suspend_exit(); -+ mutex_unlock(&xs_state.response_mutex); -+ mutex_unlock(&xs_state.request_mutex); -+ transaction_resume(); - -- /* No need for watches_lock: the xs_watch_rwsem is sufficient. */ -+ /* No need for watches_lock: the watch_mutex is sufficient. */ - list_for_each_entry(watch, &watches, list) { - sprintf(token, "%lX", (long)watch); - xs_watch(watch->node, token); - } - -- up_write(&xs_watch_rwsem); -+ up_write(&xs_state.watch_mutex); - } - - void xs_suspend_cancel(void) - { -- mutex_unlock(&xs_response_mutex); -- up_write(&xs_watch_rwsem); -- -- xs_suspend_exit(); -+ mutex_unlock(&xs_state.response_mutex); -+ mutex_unlock(&xs_state.request_mutex); -+ up_write(&xs_state.watch_mutex); -+ mutex_unlock(&xs_state.transaction_mutex); - } - - static int xenwatch_thread(void *unused) - { - struct list_head *ent; -- struct xs_watch_event *event; -+ struct xs_stored_msg *msg; - - for (;;) { - wait_event_interruptible(watch_events_waitq, -@@ -873,10 +832,12 @@ static int xenwatch_thread(void *unused) - spin_unlock(&watch_events_lock); - - if (ent != &watch_events) { -- event = list_entry(ent, struct xs_watch_event, list); -- event->handle->callback(event->handle, event->path, -- event->token); -- kfree(event); -+ msg = list_entry(ent, struct xs_stored_msg, list); -+ msg->u.watch.handle->callback(msg->u.watch.handle, -+ msg->u.watch.path, -+ msg->u.watch.token); -+ kfree(msg->u.watch.path); -+ kfree(msg); - } - - mutex_unlock(&xenwatch_mutex); -@@ -885,37 +846,126 @@ static int xenwatch_thread(void *unused) - return 0; - } - --/* -- * Wake up all threads waiting for a xenstore reply. In case of shutdown all -- * pending replies will be marked as "aborted" in order to let the waiters -- * return in spite of xenstore possibly no longer being able to reply. This -- * will avoid blocking shutdown by a thread waiting for xenstore but being -- * necessary for shutdown processing to proceed. -- */ --static int xs_reboot_notify(struct notifier_block *nb, -- unsigned long code, void *unused) -+static int process_msg(void) - { -- struct xb_req_data *req; -+ struct xs_stored_msg *msg; -+ char *body; -+ int err; -+ -+ /* -+ * We must disallow save/restore while reading a xenstore message. -+ * A partial read across s/r leaves us out of sync with xenstored. -+ */ -+ for (;;) { -+ err = xb_wait_for_data_to_read(); -+ if (err) -+ return err; -+ mutex_lock(&xs_state.response_mutex); -+ if (xb_data_to_read()) -+ break; -+ /* We raced with save/restore: pending data 'disappeared'. */ -+ mutex_unlock(&xs_state.response_mutex); -+ } - -- mutex_lock(&xb_write_mutex); -- list_for_each_entry(req, &xs_reply_list, list) -- wake_up(&req->wq); -- list_for_each_entry(req, &xb_write_list, list) -- wake_up(&req->wq); -- mutex_unlock(&xb_write_mutex); -- return NOTIFY_DONE; -+ -+ msg = kmalloc(sizeof(*msg), GFP_NOIO | __GFP_HIGH); -+ if (msg == NULL) { -+ err = -ENOMEM; -+ goto out; -+ } -+ -+ err = xb_read(&msg->hdr, sizeof(msg->hdr)); -+ if (err) { -+ kfree(msg); -+ goto out; -+ } -+ -+ if (msg->hdr.len > XENSTORE_PAYLOAD_MAX) { -+ kfree(msg); -+ err = -EINVAL; -+ goto out; -+ } -+ -+ body = kmalloc(msg->hdr.len + 1, GFP_NOIO | __GFP_HIGH); -+ if (body == NULL) { -+ kfree(msg); -+ err = -ENOMEM; -+ goto out; -+ } -+ -+ err = xb_read(body, msg->hdr.len); -+ if (err) { -+ kfree(body); -+ kfree(msg); -+ goto out; -+ } -+ body[msg->hdr.len] = '\0'; -+ -+ if (msg->hdr.type == XS_WATCH_EVENT) { -+ if (count_strings(body, msg->hdr.len) != 2) { -+ err = -EINVAL; -+ kfree(msg); -+ kfree(body); -+ goto out; -+ } -+ msg->u.watch.path = (const char *)body; -+ msg->u.watch.token = (const char *)strchr(body, '\0') + 1; -+ -+ spin_lock(&watches_lock); -+ msg->u.watch.handle = find_watch(msg->u.watch.token); -+ if (msg->u.watch.handle != NULL) { -+ spin_lock(&watch_events_lock); -+ list_add_tail(&msg->list, &watch_events); -+ wake_up(&watch_events_waitq); -+ spin_unlock(&watch_events_lock); -+ } else { -+ kfree(body); -+ kfree(msg); -+ } -+ spin_unlock(&watches_lock); -+ } else { -+ msg->u.reply.body = body; -+ spin_lock(&xs_state.reply_lock); -+ list_add_tail(&msg->list, &xs_state.reply_list); -+ spin_unlock(&xs_state.reply_lock); -+ wake_up(&xs_state.reply_waitq); -+ } -+ -+ out: -+ mutex_unlock(&xs_state.response_mutex); -+ return err; - } - --static struct notifier_block xs_reboot_nb = { -- .notifier_call = xs_reboot_notify, --}; -+static int xenbus_thread(void *unused) -+{ -+ int err; -+ -+ for (;;) { -+ err = process_msg(); -+ if (err) -+ pr_warn("error %d while reading message\n", err); -+ if (kthread_should_stop()) -+ break; -+ } -+ -+ return 0; -+} - - int xs_init(void) - { - int err; - struct task_struct *task; - -- register_reboot_notifier(&xs_reboot_nb); -+ INIT_LIST_HEAD(&xs_state.reply_list); -+ spin_lock_init(&xs_state.reply_lock); -+ init_waitqueue_head(&xs_state.reply_waitq); -+ -+ mutex_init(&xs_state.request_mutex); -+ mutex_init(&xs_state.response_mutex); -+ mutex_init(&xs_state.transaction_mutex); -+ init_rwsem(&xs_state.watch_mutex); -+ atomic_set(&xs_state.transaction_count, 0); -+ init_waitqueue_head(&xs_state.transaction_wq); - - /* Initialize the shared memory rings to talk to xenstored */ - err = xb_init_comms(); -@@ -927,6 +977,10 @@ int xs_init(void) - return PTR_ERR(task); - xenwatch_pid = task->pid; - -+ task = kthread_run(xenbus_thread, NULL, "xenbus"); -+ if (IS_ERR(task)) -+ return PTR_ERR(task); -+ - /* shutdown watches for kexec boot */ - xs_reset_watches(); - --- -2.15.1 - diff --git a/patches.xen/Revert-xenbus-remove-transaction-holder-from-list-be.patch b/patches.xen/Revert-xenbus-remove-transaction-holder-from-list-be.patch deleted file mode 100644 index 3013120..0000000 --- a/patches.xen/Revert-xenbus-remove-transaction-holder-from-list-be.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 9622a541f049137fef086e45cc6ddf4dd56bb99e Mon Sep 17 00:00:00 2001 -From: Simon Gaiser -Date: Tue, 30 Jan 2018 07:38:17 +0100 -Subject: [PATCH 3/4] Revert "xenbus: remove transaction holder from list - before freeing" - -This reverts commit ac4cde398a96c1d28b1c28a0f69b6efd892a1c8a. ---- - drivers/xen/xenbus/xenbus_dev_frontend.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c -index f3b089b7c0b6..1f4733b80c87 100644 ---- a/drivers/xen/xenbus/xenbus_dev_frontend.c -+++ b/drivers/xen/xenbus/xenbus_dev_frontend.c -@@ -442,10 +442,8 @@ static int xenbus_write_transaction(unsigned msg_type, - return xenbus_command_reply(u, XS_ERROR, "ENOENT"); - - rc = xenbus_dev_request_and_reply(&u->u.msg, u); -- if (rc && trans) { -- list_del(&trans->list); -+ if (rc) - kfree(trans); -- } - - out: - return rc; --- -2.15.1 - diff --git a/patches.xen/Revert-xenbus-track-caller-request-id.patch b/patches.xen/Revert-xenbus-track-caller-request-id.patch deleted file mode 100644 index 1b902b7..0000000 --- a/patches.xen/Revert-xenbus-track-caller-request-id.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 137e4287ebd6ccdc0982c622825c90bba940f7cf Mon Sep 17 00:00:00 2001 -From: Simon Gaiser -Date: Tue, 27 Feb 2018 18:14:15 +0100 -Subject: [PATCH] Revert "xenbus: track caller request id" - -This reverts commit 54de83d07a18bfa30bd90294bebced839bb7132f. ---- - drivers/xen/xenbus/xenbus.h | 1 - - drivers/xen/xenbus/xenbus_comms.c | 1 - - drivers/xen/xenbus/xenbus_xs.c | 3 --- - 3 files changed, 5 deletions(-) - -diff --git a/drivers/xen/xenbus/xenbus.h b/drivers/xen/xenbus/xenbus.h -index 092981171df1..149c5e7efc89 100644 ---- a/drivers/xen/xenbus/xenbus.h -+++ b/drivers/xen/xenbus/xenbus.h -@@ -76,7 +76,6 @@ struct xb_req_data { - struct list_head list; - wait_queue_head_t wq; - struct xsd_sockmsg msg; -- uint32_t caller_req_id; - enum xsd_sockmsg_type type; - char *body; - const struct kvec *vec; -diff --git a/drivers/xen/xenbus/xenbus_comms.c b/drivers/xen/xenbus/xenbus_comms.c -index d239fc3c5e3d..5b081a01779d 100644 ---- a/drivers/xen/xenbus/xenbus_comms.c -+++ b/drivers/xen/xenbus/xenbus_comms.c -@@ -309,7 +309,6 @@ static int process_msg(void) - goto out; - - if (req->state == xb_req_state_wait_reply) { -- req->msg.req_id = req->caller_req_id; - req->msg.type = state.msg.type; - req->msg.len = state.msg.len; - req->body = state.body; -diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c -index 3f3b29398ab8..3e59590c7254 100644 ---- a/drivers/xen/xenbus/xenbus_xs.c -+++ b/drivers/xen/xenbus/xenbus_xs.c -@@ -227,8 +227,6 @@ static void xs_send(struct xb_req_data *req, struct xsd_sockmsg *msg) - req->state = xb_req_state_queued; - init_waitqueue_head(&req->wq); - -- /* Save the caller req_id and restore it later in the reply */ -- req->caller_req_id = req->msg.req_id; - req->msg.req_id = xs_request_enter(req); - - mutex_lock(&xb_write_mutex); -@@ -312,7 +310,6 @@ static void *xs_talkv(struct xenbus_transaction t, - req->num_vecs = num_vecs; - req->cb = xs_wake_up; - -- msg.req_id = 0; - msg.tx_id = t.id; - msg.type = type; - msg.len = 0; --- -2.16.1 - diff --git a/patches.xen/b93008d1ac65-xen-xenbus-Catch-closing-of-non-existent-transaction.patch b/patches.xen/b93008d1ac65-xen-xenbus-Catch-closing-of-non-existent-transaction.patch new file mode 100644 index 0000000..98cba26 --- /dev/null +++ b/patches.xen/b93008d1ac65-xen-xenbus-Catch-closing-of-non-existent-transaction.patch @@ -0,0 +1,35 @@ +From b93008d1ac657dc67819330c5995e65e7c3e7978 Mon Sep 17 00:00:00 2001 +From: Simon Gaiser +Date: Thu, 15 Mar 2018 03:43:21 +0100 +Subject: [PATCH 2/3] xen: xenbus: Catch closing of non existent transactions + +Users of the xenbus functions should never close a non existent +transaction (for example by trying to closing the same transaction +twice) but better catch it in xs_request_exit() than to corrupt the +reference counter. + +Signed-off-by: Simon Gaiser +Reviewed-by: Juergen Gross +Signed-off-by: Boris Ostrovsky +--- + drivers/xen/xenbus/xenbus_xs.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c +index 3f3b29398ab8..49a3874ae6bb 100644 +--- a/drivers/xen/xenbus/xenbus_xs.c ++++ b/drivers/xen/xenbus/xenbus_xs.c +@@ -140,7 +140,9 @@ void xs_request_exit(struct xb_req_data *req) + spin_lock(&xs_state_lock); + xs_state_users--; + if ((req->type == XS_TRANSACTION_START && req->msg.type == XS_ERROR) || +- req->type == XS_TRANSACTION_END) ++ (req->type == XS_TRANSACTION_END && ++ !WARN_ON_ONCE(req->msg.type == XS_ERROR && ++ !strcmp(req->body, "ENOENT")))) + xs_state_users--; + spin_unlock(&xs_state_lock); + +-- +2.16.2 + diff --git a/series.conf b/series.conf index 392c2bc..46a016a 100644 --- a/series.conf +++ b/series.conf @@ -25,12 +25,9 @@ patches.xen/pci_op-cleanup.patch # Fix for MSI support with stubdoms patches.xen/xen-pciback-add-attribute-to-allow-MSI-enable-flag-w.patch -# Workaround HVM suspend issue with >= 4.11 by reverting the change (and -# followups) till fix lands upstream. -patches.xen/Revert-xenbus-track-caller-request-id.patch -patches.xen/Revert-xen-avoid-deadlock-in-xenbus.patch -patches.xen/Revert-xen-avoid-deadlock-in-xenbus-driver.patch -patches.xen/Revert-xenbus-remove-transaction-holder-from-list-be.patch -patches.xen/Revert-xen-optimize-xenbus-driver-for-multiple-concu.patch +# Upstreamed fix for HVM suspend issue with >= 4.11 +patches.xen/2a22ee6c3ab1-xen-xenbus_dev_frontend-Fix-XS_TRANSACTION_END-handl.patch +patches.xen/b93008d1ac65-xen-xenbus-Catch-closing-of-non-existent-transaction.patch +patches.xen/8fe5ab411209-xen-xenbus_dev_frontend-Verify-body-of-XS_TRANSACTIO.patch # Hardware-specific fixes, backported from newer kernel and/or developers branches From f754a8905d96f1858eb898708d67e9b601225a62 Mon Sep 17 00:00:00 2001 From: Simon Gaiser Date: Mon, 16 Apr 2018 22:40:18 +0200 Subject: [PATCH 5/6] Update base config to kernel-core-4.16.2-300.fc28.x86_64.rpm --- config-base | 203 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 134 insertions(+), 69 deletions(-) diff --git a/config-base b/config-base index 60acf0b..843df31 100644 --- a/config-base +++ b/config-base @@ -1,4 +1,4 @@ -# Base config based on Fedora's config (kernel-core-4.15.6-200.fc26.x86_64.rpm) +# Base config based on Fedora's config (kernel-core-4.16.2-300.fc28.x86_64.rpm) # Only modification is `yes '' | make oldconfig` to drop config settings which # depend on Fedora patches and adjust for the small version difference. @@ -42,7 +42,6 @@ CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_PGTABLE_LEVELS=4 -CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -95,7 +94,6 @@ CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y -# CONFIG_IRQ_DOMAIN_DEBUG is not set CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y # CONFIG_GENERIC_IRQ_DEBUGFS is not set @@ -239,6 +237,7 @@ CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT_ALWAYS_ON=y CONFIG_USERFAULTFD=y +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # CONFIG_PC104 is not set @@ -282,12 +281,14 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_CLK=y @@ -312,10 +313,10 @@ CONFIG_SECCOMP_FILTER=y CONFIG_HAVE_GCC_PLUGINS=y # CONFIG_GCC_PLUGINS is not set CONFIG_HAVE_CC_STACKPROTECTOR=y -CONFIG_CC_STACKPROTECTOR=y # CONFIG_CC_STACKPROTECTOR_NONE is not set # CONFIG_CC_STACKPROTECTOR_REGULAR is not set CONFIG_CC_STACKPROTECTOR_STRONG=y +# CONFIG_CC_STACKPROTECTOR_AUTO is not set CONFIG_THIN_ARCHIVES=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y CONFIG_HAVE_CONTEXT_TRACKING=y @@ -350,6 +351,7 @@ CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y +CONFIG_ARCH_HAS_PHYS_TO_DMA=y CONFIG_ARCH_HAS_REFCOUNT=y # CONFIG_REFCOUNT_FULL is not set @@ -453,6 +455,7 @@ CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y +CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y CONFIG_FREEZER=y # @@ -497,6 +500,7 @@ CONFIG_KVM_GUEST=y # CONFIG_KVM_DEBUG_FS is not set CONFIG_PARAVIRT_TIME_ACCOUNTING=y CONFIG_PARAVIRT_CLOCK=y +# CONFIG_JAILHOUSE_GUEST is not set CONFIG_NO_BOOTMEM=y # CONFIG_MK8 is not set # CONFIG_MPSC is not set @@ -521,6 +525,9 @@ CONFIG_DMI=y CONFIG_SWIOTLB=y CONFIG_IOMMU_HELPER=y # CONFIG_MAXSMP is not set +CONFIG_NR_CPUS_RANGE_BEGIN=2 +CONFIG_NR_CPUS_RANGE_END=512 +CONFIG_NR_CPUS_DEFAULT=64 CONFIG_NR_CPUS=64 CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y @@ -633,7 +640,6 @@ CONFIG_ZSMALLOC=y # CONFIG_PGTABLE_MAPPING is not set # CONFIG_ZSMALLOC_STAT is not set CONFIG_GENERIC_EARLY_IOREMAP=y -CONFIG_ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_ZONE_DEVICE=y @@ -650,7 +656,7 @@ CONFIG_ARCH_HAS_PKEYS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_BENCHMARK is not set CONFIG_X86_PMEM_LEGACY_DEVICE=y -CONFIG_X86_PMEM_LEGACY=y +CONFIG_X86_PMEM_LEGACY=m CONFIG_X86_CHECK_BIOS_CORRUPTION=y # CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK is not set CONFIG_X86_RESERVE_LOW=64 @@ -677,8 +683,7 @@ CONFIG_HZ=1000 CONFIG_SCHED_HRTICK=y CONFIG_KEXEC=y CONFIG_KEXEC_FILE=y -CONFIG_KEXEC_VERIFY_SIG=y -CONFIG_KEXEC_BZIMAGE_VERIFY_SIG=y +# CONFIG_KEXEC_VERIFY_SIG is not set CONFIG_CRASH_DUMP=y CONFIG_KEXEC_JUMP=y CONFIG_PHYSICAL_START=0x1000000 @@ -692,7 +697,6 @@ CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set # CONFIG_COMPAT_VDSO is not set -# CONFIG_LEGACY_VSYSCALL_NATIVE is not set CONFIG_LEGACY_VSYSCALL_EMULATE=y # CONFIG_LEGACY_VSYSCALL_NONE is not set # CONFIG_CMDLINE_BOOL is not set @@ -733,6 +737,7 @@ CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set +CONFIG_ACPI_SPCR_TABLE=y CONFIG_ACPI_LPIT=y CONFIG_ACPI_SLEEP=y # CONFIG_ACPI_PROCFS_POWER is not set @@ -759,7 +764,6 @@ CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y CONFIG_ACPI_TABLE_UPGRADE=y # CONFIG_ACPI_DEBUG is not set CONFIG_ACPI_PCI_SLOT=y -CONFIG_X86_PM_TIMER=y CONFIG_ACPI_CONTAINER=y CONFIG_ACPI_HOTPLUG_MEMORY=y CONFIG_ACPI_HOTPLUG_IOAPIC=y @@ -787,6 +791,7 @@ CONFIG_CHT_WC_PMIC_OPREGION=y CONFIG_CHT_DC_TI_PMIC_OPREGION=y CONFIG_ACPI_CONFIGFS=m # CONFIG_TPS68470_PMIC_OPREGION is not set +CONFIG_X86_PM_TIMER=y CONFIG_SFI=y # @@ -878,6 +883,10 @@ CONFIG_HOTPLUG_PCI_ACPI_IBM=m # CONFIG_HOTPLUG_PCI_CPCI is not set CONFIG_HOTPLUG_PCI_SHPC=m +# +# Cadence PCIe controllers support +# + # # DesignWare PCI Core Support # @@ -1064,12 +1073,15 @@ CONFIG_BRIDGE_NETFILTER=m # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_FAMILY_BRIDGE=y +CONFIG_NETFILTER_FAMILY_ARP=y CONFIG_NETFILTER_NETLINK_ACCT=m CONFIG_NETFILTER_NETLINK_QUEUE=m CONFIG_NETFILTER_NETLINK_LOG=m CONFIG_NF_CONNTRACK=m CONFIG_NF_LOG_COMMON=m CONFIG_NF_LOG_NETDEV=m +CONFIG_NETFILTER_CONNCOUNT=m CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_SECMARK=y CONFIG_NF_CONNTRACK_ZONES=y @@ -1116,6 +1128,7 @@ CONFIG_NFT_META=m CONFIG_NFT_RT=m CONFIG_NFT_NUMGEN=m CONFIG_NFT_CT=m +CONFIG_NFT_FLOW_OFFLOAD=m CONFIG_NFT_SET_RBTREE=m CONFIG_NFT_SET_HASH=m CONFIG_NFT_SET_BITMAP=m @@ -1138,6 +1151,8 @@ CONFIG_NF_DUP_NETDEV=m CONFIG_NFT_DUP_NETDEV=m CONFIG_NFT_FWD_NETDEV=m CONFIG_NFT_FIB_NETDEV=m +CONFIG_NF_FLOW_TABLE_INET=m +CONFIG_NF_FLOW_TABLE=m CONFIG_NETFILTER_XTABLES=y # @@ -1299,6 +1314,7 @@ CONFIG_NFT_REJECT_IPV4=m CONFIG_NFT_DUP_IPV4=m CONFIG_NFT_FIB_IPV4=m CONFIG_NF_TABLES_ARP=m +CONFIG_NF_FLOW_TABLE_IPV4=m CONFIG_NF_DUP_IPV4=m CONFIG_NF_LOG_ARP=m CONFIG_NF_LOG_IPV4=m @@ -1345,6 +1361,7 @@ CONFIG_NFT_CHAIN_ROUTE_IPV6=m CONFIG_NFT_REJECT_IPV6=m CONFIG_NFT_DUP_IPV6=m CONFIG_NFT_FIB_IPV6=m +CONFIG_NF_FLOW_TABLE_IPV6=m CONFIG_NF_DUP_IPV6=m CONFIG_NF_REJECT_IPV6=m CONFIG_NF_LOG_IPV6=m @@ -1363,6 +1380,7 @@ CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_MH=m CONFIG_IP6_NF_MATCH_RPFILTER=m CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_SRH=m CONFIG_IP6_NF_TARGET_HL=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m @@ -1400,7 +1418,6 @@ CONFIG_BRIDGE_EBT_LOG=m CONFIG_BRIDGE_EBT_NFLOG=m # CONFIG_IP_DCCP is not set CONFIG_IP_SCTP=m -CONFIG_NET_SCTPPROBE=m # CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5 is not set CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1=y @@ -1435,6 +1452,7 @@ CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y CONFIG_HAVE_NET_DSA=y CONFIG_NET_DSA=m +# CONFIG_NET_DSA_LEGACY is not set CONFIG_NET_DSA_TAG_BRCM=y CONFIG_NET_DSA_TAG_BRCM_PREPEND=y CONFIG_NET_DSA_TAG_DSA=y @@ -1442,7 +1460,6 @@ CONFIG_NET_DSA_TAG_EDSA=y CONFIG_NET_DSA_TAG_KSZ=y CONFIG_NET_DSA_TAG_LAN9303=y CONFIG_NET_DSA_TAG_MTK=y -CONFIG_NET_DSA_TAG_TRAILER=y CONFIG_NET_DSA_TAG_QCA=y CONFIG_VLAN_8021Q=m CONFIG_VLAN_8021Q_GVRP=y @@ -1450,7 +1467,6 @@ CONFIG_VLAN_8021Q_MVRP=y # CONFIG_DECNET is not set CONFIG_LLC=m # CONFIG_LLC2 is not set -# CONFIG_IPX is not set CONFIG_ATALK=m CONFIG_DEV_APPLETALK=m CONFIG_IPDDP=m @@ -1606,7 +1622,6 @@ CONFIG_NET_FLOW_LIMIT=y # Network testing # CONFIG_NET_PKTGEN=m -# CONFIG_NET_TCPPROBE is not set CONFIG_NET_DROP_MONITOR=y CONFIG_HAMRADIO=y @@ -1705,6 +1720,7 @@ CONFIG_BT_BCM=m CONFIG_BT_RTL=m CONFIG_BT_QCA=m CONFIG_BT_HCIBTUSB=m +CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_RTL=y CONFIG_BT_HCIBTSDIO=m @@ -1843,7 +1859,6 @@ CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y -# CONFIG_FIRMWARE_IN_KERNEL is not set CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set CONFIG_WANT_DEV_COREDUMP=y @@ -1861,7 +1876,7 @@ CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_REGMAP_SPI=y CONFIG_REGMAP_IRQ=y -CONFIG_REGMAP_HWSPINLOCK=y +CONFIG_REGMAP_SOUNDWIRE=m CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set # CONFIG_DMA_CMA is not set @@ -2050,6 +2065,7 @@ CONFIG_VMWARE_BALLOON=m # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set # CONFIG_PCI_ENDPOINT_TEST is not set +CONFIG_MISC_RTSX=m # CONFIG_C2PORT is not set # @@ -2126,6 +2142,9 @@ CONFIG_ECHO=m # CONFIG_CXL_BASE is not set # CONFIG_CXL_AFU_DRIVER_OPS is not set # CONFIG_CXL_LIB is not set +# CONFIG_OCXL_BASE is not set +CONFIG_MISC_RTSX_PCI=m +CONFIG_MISC_RTSX_USB=m CONFIG_HAVE_IDE=y # CONFIG_IDE is not set @@ -2285,6 +2304,7 @@ CONFIG_SATA_PMP=y # Controllers with non-SFF native interface # CONFIG_SATA_AHCI=y +CONFIG_SATA_MOBILE_LPM_POLICY=3 CONFIG_SATA_AHCI_PLATFORM=m CONFIG_SATA_INIC162X=m CONFIG_SATA_ACARD_AHCI=m @@ -2323,7 +2343,7 @@ CONFIG_PATA_ARTOP=m CONFIG_PATA_ATIIXP=m CONFIG_PATA_ATP867X=m CONFIG_PATA_CMD64X=m -CONFIG_PATA_CYPRESS=m +# CONFIG_PATA_CYPRESS is not set CONFIG_PATA_EFAR=m CONFIG_PATA_HPT366=m CONFIG_PATA_HPT37X=m @@ -2342,7 +2362,7 @@ CONFIG_PATA_OPTIDMA=m CONFIG_PATA_PDC2027X=m CONFIG_PATA_PDC_OLD=m # CONFIG_PATA_RADISYS is not set -CONFIG_PATA_RDC=m +# CONFIG_PATA_RDC is not set CONFIG_PATA_SCH=m CONFIG_PATA_SERVERWORKS=m CONFIG_PATA_SIL680=m @@ -2391,6 +2411,7 @@ CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING=y # CONFIG_DM_DEBUG_BLOCK_STACK_TRACING is not set CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m +CONFIG_DM_UNSTRIPED=m CONFIG_DM_CRYPT=m CONFIG_DM_SNAPSHOT=y CONFIG_DM_THIN_PROVISIONING=m @@ -2514,7 +2535,6 @@ CONFIG_B53_MMAP_DRIVER=m CONFIG_B53_SRAB_DRIVER=m CONFIG_NET_DSA_LOOP=m CONFIG_NET_DSA_MT7530=m -CONFIG_NET_DSA_MV88E6060=m CONFIG_MICROCHIP_KSZ=m CONFIG_MICROCHIP_KSZ_SPI_DRIVER=m CONFIG_NET_DSA_MV88E6XXX=m @@ -2591,6 +2611,7 @@ CONFIG_CHELSIO_T4VF=m CONFIG_CHELSIO_LIB=m CONFIG_NET_VENDOR_CISCO=y CONFIG_ENIC=m +# CONFIG_NET_VENDOR_CORTINA is not set # CONFIG_CX_ECAT is not set CONFIG_DNET=m CONFIG_NET_VENDOR_DEC=y @@ -2752,6 +2773,7 @@ CONFIG_EPIC100=m CONFIG_SMSC911X=m # CONFIG_SMSC911X_ARCH_HOOKS is not set CONFIG_SMSC9420=m +# CONFIG_NET_VENDOR_SOCIONEXT is not set CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=m # CONFIG_STMMAC_PLATFORM is not set @@ -2807,7 +2829,7 @@ CONFIG_CORTINA_PHY=m CONFIG_DAVICOM_PHY=m CONFIG_DP83822_PHY=m CONFIG_DP83848_PHY=m -CONFIG_DP83867_PHY=m +# CONFIG_DP83867_PHY is not set CONFIG_FIXED_PHY=y CONFIG_ICPLUS_PHY=m CONFIG_INTEL_XWAY_PHY=m @@ -2916,6 +2938,7 @@ CONFIG_ATH9K_PCOEM=y CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set # CONFIG_ATH9K_HWRNG is not set +# CONFIG_ATH9K_COMMON_SPECTRAL is not set CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y # CONFIG_CARL9170_DEBUGFS is not set @@ -2937,6 +2960,7 @@ CONFIG_ATH10K_SDIO=m CONFIG_ATH10K_USB=m # CONFIG_ATH10K_DEBUG is not set CONFIG_ATH10K_DEBUGFS=y +# CONFIG_ATH10K_SPECTRAL is not set # CONFIG_ATH10K_TRACING is not set CONFIG_WCN36XX=m # CONFIG_WCN36XX_DEBUGFS is not set @@ -3050,6 +3074,8 @@ CONFIG_MWIFIEX_USB=m CONFIG_MWL8K=m CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m +CONFIG_MT76_CORE=m +CONFIG_MT76x2E=m CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2400PCI=m @@ -3153,6 +3179,7 @@ CONFIG_VMXNET3=m CONFIG_FUJITSU_ES=m CONFIG_THUNDERBOLT_NET=m CONFIG_HYPERV_NET=m +# CONFIG_NETDEVSIM is not set CONFIG_ISDN=y CONFIG_ISDN_I4L=m CONFIG_ISDN_PPP=y @@ -3487,7 +3514,6 @@ CONFIG_INPUT_PCSPKR=m CONFIG_INPUT_APANEL=m CONFIG_INPUT_GP2A=m # CONFIG_INPUT_GPIO_BEEPER is not set -# CONFIG_INPUT_GPIO_TILT_POLLED is not set # CONFIG_INPUT_GPIO_DECODER is not set CONFIG_INPUT_ATLAS_BTNS=m CONFIG_INPUT_ATI_REMOTE2=m @@ -3653,7 +3679,6 @@ CONFIG_HW_RANDOM_INTEL=m CONFIG_HW_RANDOM_AMD=m CONFIG_HW_RANDOM_VIA=m CONFIG_HW_RANDOM_VIRTIO=m -CONFIG_HW_RANDOM_TPM=m CONFIG_NVRAM=y CONFIG_R3964=m # CONFIG_APPLICOM is not set @@ -3674,6 +3699,7 @@ CONFIG_HPET=y CONFIG_HANGCHECK_TIMER=m CONFIG_UV_MMTIMER=m CONFIG_TCG_TPM=m +CONFIG_HW_RANDOM_TPM=y CONFIG_TCG_TIS_CORE=m CONFIG_TCG_TIS=m # CONFIG_TCG_TIS_SPI is not set @@ -3868,7 +3894,6 @@ CONFIG_GPIOLIB_IRQCHIP=y # Memory mapped GPIO drivers # # CONFIG_GPIO_AMDPT is not set -# CONFIG_GPIO_AXP209 is not set # CONFIG_GPIO_DWAPB is not set CONFIG_GPIO_EXAR=m # CONFIG_GPIO_GENERIC_PLATFORM is not set @@ -3909,6 +3934,7 @@ CONFIG_GPIO_TPS68470=y # CONFIG_GPIO_AMD8111 is not set # CONFIG_GPIO_ML_IOH is not set CONFIG_GPIO_PCI_IDIO_16=m +# CONFIG_GPIO_PCIE_IDIO_24 is not set # CONFIG_GPIO_RDC321X is not set # @@ -4151,6 +4177,7 @@ CONFIG_SENSORS_VIA_CPUTEMP=m CONFIG_SENSORS_VIA686A=m CONFIG_SENSORS_VT1211=m CONFIG_SENSORS_VT8231=m +CONFIG_SENSORS_W83773G=m CONFIG_SENSORS_W83781D=m CONFIG_SENSORS_W83791D=m CONFIG_SENSORS_W83792D=m @@ -4267,10 +4294,6 @@ CONFIG_USBPCWATCHDOG=m # # CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set CONFIG_SSB_POSSIBLE=y - -# -# Sonics Silicon Backplane -# CONFIG_SSB=m CONFIG_SSB_SPROM=y CONFIG_SSB_BLOCKIO=y @@ -4349,9 +4372,7 @@ CONFIG_MFD_VIPERBOARD=m # CONFIG_MFD_PCF50633 is not set # CONFIG_UCB1400_CORE is not set # CONFIG_MFD_RDC321X is not set -CONFIG_MFD_RTSX_PCI=m # CONFIG_MFD_RT5033 is not set -CONFIG_MFD_RTSX_USB=m # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_SEC_CORE is not set # CONFIG_MFD_SI476X_CORE is not set @@ -4391,6 +4412,7 @@ CONFIG_MFD_VX855=m # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set +# CONFIG_RAVE_SP_CORE is not set CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set # CONFIG_REGULATOR_FIXED_VOLTAGE is not set @@ -4431,9 +4453,8 @@ CONFIG_REGULATOR=y CONFIG_CEC_CORE=m CONFIG_RC_CORE=m CONFIG_RC_MAP=m +CONFIG_LIRC=y CONFIG_RC_DECODERS=y -CONFIG_LIRC=m -CONFIG_IR_LIRC_CODEC=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m @@ -4488,18 +4509,14 @@ CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_DMA_SG=m CONFIG_VIDEOBUF_VMALLOC=m CONFIG_VIDEOBUF_DVB=m -CONFIG_VIDEOBUF2_CORE=m -CONFIG_VIDEOBUF2_MEMOPS=m -CONFIG_VIDEOBUF2_DMA_CONTIG=m -CONFIG_VIDEOBUF2_VMALLOC=m -CONFIG_VIDEOBUF2_DMA_SG=m -CONFIG_VIDEOBUF2_DVB=m CONFIG_DVB_CORE=m +# CONFIG_DVB_MMAP is not set CONFIG_DVB_NET=y CONFIG_TTPCI_EEPROM=m CONFIG_DVB_MAX_ADAPTERS=8 CONFIG_DVB_DYNAMIC_MINORS=y # CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set +# CONFIG_DVB_ULE_DEBUG is not set # # Media drivers @@ -4746,6 +4763,7 @@ CONFIG_DVB_DDBRIDGE=m # CONFIG_DVB_DDBRIDGE_MSIENABLE is not set CONFIG_DVB_SMIPCIE=m CONFIG_DVB_NETUP_UNIDVB=m +CONFIG_VIDEO_IPU3_CIO2=m # CONFIG_V4L_PLATFORM_DRIVERS is not set CONFIG_V4L_MEM2MEM_DRIVERS=y # CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set @@ -4797,6 +4815,13 @@ CONFIG_MEDIA_COMMON_OPTIONS=y CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m CONFIG_CYPRESS_FIRMWARE=m +CONFIG_VIDEOBUF2_CORE=m +CONFIG_VIDEOBUF2_V4L2=m +CONFIG_VIDEOBUF2_MEMOPS=m +CONFIG_VIDEOBUF2_DMA_CONTIG=m +CONFIG_VIDEOBUF2_VMALLOC=m +CONFIG_VIDEOBUF2_DMA_SG=m +CONFIG_VIDEOBUF2_DVB=m CONFIG_DVB_B2C2_FLEXCOP=m CONFIG_VIDEO_SAA7146=m CONFIG_VIDEO_SAA7146_VV=m @@ -4899,6 +4924,7 @@ CONFIG_VIDEO_M52790=m # CONFIG_MEDIA_TUNER=m CONFIG_MEDIA_TUNER_SIMPLE=m +CONFIG_MEDIA_TUNER_TDA18250=m CONFIG_MEDIA_TUNER_TDA8290=m CONFIG_MEDIA_TUNER_TDA827X=m CONFIG_MEDIA_TUNER_TDA18271=m @@ -5108,6 +5134,7 @@ CONFIG_DRM_FBDEV_OVERALLOC=100 CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_TTM=m CONFIG_DRM_VM=y +CONFIG_DRM_SCHED=m # # I2C encoder or helper chips @@ -5118,7 +5145,7 @@ CONFIG_DRM_I2C_NXP_TDA998X=m CONFIG_DRM_RADEON=m CONFIG_DRM_RADEON_USERPTR=y CONFIG_DRM_AMDGPU=m -# CONFIG_DRM_AMDGPU_SI is not set +CONFIG_DRM_AMDGPU_SI=y CONFIG_DRM_AMDGPU_CIK=y CONFIG_DRM_AMDGPU_USERPTR=y # CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set @@ -5185,6 +5212,7 @@ CONFIG_HSA_AMD=m CONFIG_DRM_HISI_HIBMC=m # CONFIG_DRM_TINYDRM is not set # CONFIG_DRM_LEGACY is not set +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y # CONFIG_DRM_LIB_RANDOM is not set # @@ -5468,7 +5496,7 @@ CONFIG_SND_HDA_CODEC_CA0132_DSP=y CONFIG_SND_HDA_CODEC_CMEDIA=m CONFIG_SND_HDA_CODEC_SI3054=m CONFIG_SND_HDA_GENERIC=m -CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 +CONFIG_SND_HDA_POWER_SAVE_DEFAULT=1 CONFIG_SND_HDA_CORE=m CONFIG_SND_HDA_DSP_LOADER=y CONFIG_SND_HDA_I915=y @@ -5529,22 +5557,26 @@ CONFIG_SND_DESIGNWARE_PCM=y # CONFIG_SND_SOC_IMX_AUDMUX is not set CONFIG_SND_I2S_HI6210_I2S=m # CONFIG_SND_SOC_IMG is not set +CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y CONFIG_SND_SST_IPC=m +CONFIG_SND_SST_IPC_PCI=m CONFIG_SND_SST_IPC_ACPI=m -CONFIG_SND_SOC_INTEL_COMMON=m +CONFIG_SND_SOC_INTEL_SST_ACPI=m CONFIG_SND_SOC_INTEL_SST=m CONFIG_SND_SOC_INTEL_SST_FIRMWARE=m -CONFIG_SND_SOC_INTEL_SST_ACPI=m -CONFIG_SND_SOC_ACPI_INTEL_MATCH=m -CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=m CONFIG_SND_SOC_INTEL_HASWELL=m CONFIG_SND_SOC_INTEL_BAYTRAIL=m +CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI=m CONFIG_SND_SST_ATOM_HIFI2_PLATFORM=m +CONFIG_SND_SOC_INTEL_SKYLAKE_SSP_CLK=m CONFIG_SND_SOC_INTEL_SKYLAKE=m -CONFIG_SND_SOC_INTEL_MACH=m +CONFIG_SND_SOC_ACPI_INTEL_MATCH=m +CONFIG_SND_SOC_INTEL_MACH=y CONFIG_SND_SOC_INTEL_HASWELL_MACH=m CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH=m CONFIG_SND_SOC_INTEL_BROADWELL_MACH=m +CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH=m +CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH=m CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH=m CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH=m CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH=m @@ -5620,11 +5652,15 @@ CONFIG_SND_SOC_MAX98090=m CONFIG_SND_SOC_MAX98357A=m # CONFIG_SND_SOC_MAX98504 is not set CONFIG_SND_SOC_MAX98927=m +CONFIG_SND_SOC_MAX98373=m # CONFIG_SND_SOC_MAX9860 is not set # CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set # CONFIG_SND_SOC_PCM1681 is not set # CONFIG_SND_SOC_PCM179X_I2C is not set # CONFIG_SND_SOC_PCM179X_SPI is not set +CONFIG_SND_SOC_PCM186X=m +CONFIG_SND_SOC_PCM186X_I2C=m +CONFIG_SND_SOC_PCM186X_SPI=m # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM512x_I2C is not set @@ -5660,12 +5696,17 @@ CONFIG_SND_SOC_SSM4567=m # CONFIG_SND_SOC_TAS5086 is not set # CONFIG_SND_SOC_TAS571X is not set # CONFIG_SND_SOC_TAS5720 is not set +CONFIG_SND_SOC_TAS6424=m # CONFIG_SND_SOC_TFA9879 is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set +CONFIG_SND_SOC_TLV320AIC32X4=m +CONFIG_SND_SOC_TLV320AIC32X4_I2C=m +CONFIG_SND_SOC_TLV320AIC32X4_SPI=m # CONFIG_SND_SOC_TLV320AIC3X is not set CONFIG_SND_SOC_TS3A227E=m +CONFIG_SND_SOC_TSCS42XX=m # CONFIG_SND_SOC_WM8510 is not set # CONFIG_SND_SOC_WM8523 is not set CONFIG_SND_SOC_WM8524=m @@ -5747,6 +5788,7 @@ CONFIG_HID_WALTOP=m CONFIG_HID_GYRATION=m CONFIG_HID_ICADE=m CONFIG_HID_ITE=m +CONFIG_HID_JABRA=m CONFIG_HID_TWINHAN=m CONFIG_HID_KENSINGTON=m CONFIG_HID_LCPOWER=m @@ -5852,6 +5894,7 @@ CONFIG_USB_WUSB_CBAF=m # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DBGCAP=y CONFIG_USB_XHCI_PCI=y CONFIG_USB_XHCI_PLATFORM=m CONFIG_USB_EHCI_HCD=y @@ -6062,6 +6105,7 @@ CONFIG_MMC_SDHCI_PCI=m CONFIG_MMC_RICOH_MMC=y CONFIG_MMC_SDHCI_ACPI=m CONFIG_MMC_SDHCI_PLTFM=m +# CONFIG_MMC_SDHCI_F_SDH30 is not set CONFIG_MMC_WBSD=m CONFIG_MMC_TIFM_SD=m # CONFIG_MMC_SPI is not set @@ -6073,6 +6117,7 @@ CONFIG_MMC_USHC=m # CONFIG_MMC_USDHI6ROL0 is not set CONFIG_MMC_REALTEK_PCI=m CONFIG_MMC_REALTEK_USB=m +CONFIG_MMC_CQHCI=m CONFIG_MMC_TOSHIBA_PCI=m # CONFIG_MMC_MTK is not set CONFIG_MMC_SDHCI_XENON=m @@ -6114,7 +6159,6 @@ CONFIG_LEDS_LP3952=m # CONFIG_LEDS_LP5523 is not set # CONFIG_LEDS_LP5562 is not set # CONFIG_LEDS_LP8501 is not set -# CONFIG_LEDS_LP8860 is not set CONFIG_LEDS_CLEVO_MAIL=m # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set @@ -6157,6 +6201,7 @@ CONFIG_LEDS_TRIGGER_DEFAULT_ON=m CONFIG_LEDS_TRIGGER_TRANSIENT=m CONFIG_LEDS_TRIGGER_CAMERA=m CONFIG_LEDS_TRIGGER_PANIC=y +CONFIG_LEDS_TRIGGER_NETDEV=m CONFIG_ACCESSIBILITY=y CONFIG_A11Y_BRAILLE_CONSOLE=y CONFIG_INFINIBAND=m @@ -6401,12 +6446,10 @@ CONFIG_VFIO_PCI_IGD=y CONFIG_VFIO_MDEV=m CONFIG_VFIO_MDEV_DEVICE=m CONFIG_IRQ_BYPASS_MANAGER=m -# CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRT_DRIVERS=y +CONFIG_VBOXGUEST=m CONFIG_VIRTIO=m - -# -# Virtio drivers -# +CONFIG_VIRTIO_MENU=y CONFIG_VIRTIO_PCI=m CONFIG_VIRTIO_PCI_LEGACY=y CONFIG_VIRTIO_BALLOON=m @@ -6454,6 +6497,8 @@ CONFIG_XEN_SYMS=y CONFIG_XEN_HAVE_VPMU=y CONFIG_STAGING=y # CONFIG_IRDA is not set +# CONFIG_IPX is not set +# CONFIG_NCP_FS is not set # CONFIG_PRISM2_USB is not set # CONFIG_COMEDI is not set # CONFIG_RTL8192U is not set @@ -6467,8 +6512,6 @@ CONFIG_R8712U=m CONFIG_R8188EU=m CONFIG_88EU_AP_MODE=y CONFIG_R8822BE=m -CONFIG_RTLHALMAC_ST=m -CONFIG_RTLPHYDM_ST=m CONFIG_RTLWIFI_DEBUG_ST=y # CONFIG_RTS5208 is not set # CONFIG_VT6655 is not set @@ -6558,8 +6601,6 @@ CONFIG_STAGING_MEDIA=y # CONFIG_INTEL_ATOMISP is not set # CONFIG_I2C_BCM2048 is not set # CONFIG_DVB_CXD2099 is not set -CONFIG_LIRC_STAGING=y -CONFIG_LIRC_ZILOG=m # # Android @@ -6586,12 +6627,13 @@ CONFIG_DRM_VBOXVIDEO=m # CONFIG_PI433 is not set CONFIG_X86_PLATFORM_DEVICES=y CONFIG_ACER_WMI=m +CONFIG_ACER_WIRELESS=m CONFIG_ACERHDF=m CONFIG_ALIENWARE_WMI=m CONFIG_ASUS_LAPTOP=m CONFIG_DELL_SMBIOS=m -CONFIG_DELL_SMBIOS_WMI=m -CONFIG_DELL_SMBIOS_SMM=m +CONFIG_DELL_SMBIOS_WMI=y +CONFIG_DELL_SMBIOS_SMM=y CONFIG_DELL_LAPTOP=m CONFIG_DELL_WMI=m CONFIG_DELL_WMI_DESCRIPTOR=m @@ -6602,6 +6644,7 @@ CONFIG_DELL_RBTN=m CONFIG_FUJITSU_LAPTOP=m CONFIG_FUJITSU_TABLET=m CONFIG_AMILO_RFKILL=m +CONFIG_GPD_POCKET_FAN=m CONFIG_HP_ACCEL=m CONFIG_HP_WIRELESS=m CONFIG_HP_WMI=m @@ -6657,14 +6700,16 @@ CONFIG_SURFACE_PRO3_BUTTON=m CONFIG_SURFACE_3_BUTTON=m CONFIG_INTEL_PUNIT_IPC=m CONFIG_MLX_PLATFORM=m -CONFIG_MLX_CPLD_PLATFORM=m CONFIG_INTEL_TURBO_MAX_3=y CONFIG_SILEAD_DMI=y +CONFIG_INTEL_CHTDC_TI_PWRBTN=m CONFIG_PMC_ATOM=y CONFIG_CHROME_PLATFORMS=y CONFIG_CHROMEOS_LAPTOP=m CONFIG_CHROMEOS_PSTORE=m CONFIG_CROS_KBD_LED_BACKLIGHT=m +CONFIG_MELLANOX_PLATFORM=y +CONFIG_MLXREG_HOTPLUG=m CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y @@ -6723,6 +6768,14 @@ CONFIG_RPMSG=m # CONFIG_RPMSG_CHAR is not set # CONFIG_RPMSG_QCOM_GLINK_RPM is not set CONFIG_RPMSG_VIRTIO=m +CONFIG_SOUNDWIRE=y + +# +# SoundWire Devices +# +CONFIG_SOUNDWIRE_BUS=m +CONFIG_SOUNDWIRE_CADENCE=m +CONFIG_SOUNDWIRE_INTEL=m # # SOC (System On Chip) specific Drivers @@ -6745,6 +6798,11 @@ CONFIG_RPMSG_VIRTIO=m # # CONFIG_SUNXI_SRAM is not set # CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +CONFIG_XILINX_VCU=m CONFIG_PM_DEVFREQ=y # @@ -6778,6 +6836,7 @@ CONFIG_EXTCON_INTEL_CHT_WC=m CONFIG_IIO=m CONFIG_IIO_BUFFER=y CONFIG_IIO_BUFFER_CB=m +CONFIG_IIO_BUFFER_HW_CONSUMER=m CONFIG_IIO_KFIFO_BUF=m CONFIG_IIO_TRIGGERED_BUFFER=m CONFIG_IIO_CONFIGFS=m @@ -7024,6 +7083,9 @@ CONFIG_OPT3001=m CONFIG_PA12203001=m # CONFIG_SI1145 is not set CONFIG_STK3310=m +CONFIG_ST_UVIS25=m +CONFIG_ST_UVIS25_I2C=m +CONFIG_ST_UVIS25_SPI=m # CONFIG_TCS3414 is not set # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set @@ -7033,6 +7095,7 @@ CONFIG_STK3310=m # CONFIG_VCNL4000 is not set # CONFIG_VEML6070 is not set CONFIG_VL6180=m +CONFIG_ZOPT2201=m # # Magnetometer sensors @@ -7212,15 +7275,14 @@ CONFIG_NVMEM=m # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # CONFIG_FPGA is not set - -# -# FSI support -# CONFIG_FSI=m CONFIG_FSI_MASTER_GPIO=m CONFIG_FSI_MASTER_HUB=m CONFIG_FSI_SCOM=m CONFIG_PM_OPP=y +# CONFIG_UNISYS_VISORBUS is not set +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set # # Firmware Drivers @@ -7520,8 +7582,8 @@ CONFIG_CIFS_DEBUG=y # CONFIG_CIFS_DEBUG_DUMP_KEYS is not set CONFIG_CIFS_DFS_UPCALL=y # CONFIG_CIFS_SMB311 is not set +# CONFIG_CIFS_SMB_DIRECT is not set CONFIG_CIFS_FSCACHE=y -# CONFIG_NCP_FS is not set CONFIG_CODA_FS=m # CONFIG_AFS_FS is not set CONFIG_9P_FS=m @@ -7714,6 +7776,7 @@ CONFIG_RCU_CPU_STALL_TIMEOUT=60 # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set +CONFIG_FUNCTION_ERROR_INJECTION=y CONFIG_LATENCYTOP=y CONFIG_USER_STACKTRACE_SUPPORT=y CONFIG_NOP_TRACER=y @@ -7754,6 +7817,7 @@ CONFIG_PROBE_EVENTS=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_FUNCTION_PROFILER=y +# CONFIG_BPF_KPROBE_OVERRIDE is not set CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set CONFIG_MMIOTRACE=y @@ -7767,10 +7831,7 @@ CONFIG_TRACE_EVAL_MAP_FILE=y # CONFIG_TRACING_EVENTS_GPIO is not set CONFIG_PROVIDE_OHCI1394_DMA_INIT=y # CONFIG_DMA_API_DEBUG is not set - -# -# Runtime Testing -# +CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set # CONFIG_TEST_SORT is not set @@ -7793,7 +7854,7 @@ CONFIG_TEST_KSTRTOX=y # CONFIG_TEST_LKM is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set -# CONFIG_TEST_FIND_BIT is not set +# CONFIG_FIND_BIT_BENCHMARK is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_SYSCTL is not set # CONFIG_TEST_UDELAY is not set @@ -7827,7 +7888,6 @@ CONFIG_X86_PTDUMP_CORE=y CONFIG_DEBUG_WX=y CONFIG_DOUBLEFAULT=y # CONFIG_DEBUG_TLBFLUSH is not set -# CONFIG_IOMMU_STRESS is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y CONFIG_X86_DECODER_SELFTEST=y CONFIG_IO_DELAY_TYPE_0X80=0 @@ -7872,6 +7932,7 @@ CONFIG_INTEL_TXT=y CONFIG_LSM_MMAP_MIN_ADDR=65536 CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y +CONFIG_HARDENED_USERCOPY_FALLBACK=y CONFIG_FORTIFY_SOURCE=y # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_SECURITY_SELINUX=y @@ -8076,6 +8137,7 @@ CONFIG_CRYPTO_DEV_PADLOCK_SHA=m CONFIG_CRYPTO_DEV_CCP=y CONFIG_CRYPTO_DEV_CCP_DD=m # CONFIG_CRYPTO_DEV_SP_CCP is not set +CONFIG_CRYPTO_DEV_SP_PSP=y CONFIG_CRYPTO_DEV_QAT=m CONFIG_CRYPTO_DEV_QAT_DH895xCC=m CONFIG_CRYPTO_DEV_QAT_C3XXX=m @@ -8086,6 +8148,7 @@ CONFIG_CRYPTO_DEV_QAT_C62XVF=m CONFIG_CRYPTO_DEV_NITROX=m CONFIG_CRYPTO_DEV_NITROX_CNN55XX=m CONFIG_CRYPTO_DEV_CHELSIO=m +CONFIG_CHELSIO_IPSEC_INLINE=y CONFIG_CRYPTO_DEV_VIRTIO=m CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y @@ -8121,6 +8184,7 @@ CONFIG_VIRTUALIZATION=y CONFIG_KVM=m CONFIG_KVM_INTEL=m CONFIG_KVM_AMD=m +CONFIG_KVM_AMD_SEV=y CONFIG_KVM_MMU_AUDIT=y CONFIG_VHOST_NET=m CONFIG_VHOST_SCSI=m @@ -8202,7 +8266,8 @@ CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y -# CONFIG_DMA_NOOP_OPS is not set +CONFIG_SGL_ALLOC=y +# CONFIG_DMA_DIRECT_OPS is not set CONFIG_DMA_VIRT_OPS=y CONFIG_CHECK_SIGNATURE=y CONFIG_CPU_RMAP=y From 7dd139581297b1c96b9719247f96e28df0ee25e7 Mon Sep 17 00:00:00 2001 From: Simon Gaiser Date: Tue, 17 Apr 2018 02:02:48 +0200 Subject: [PATCH 6/6] Re-add synaptics patches --- ...ch-support-on-X1-Carbon-6th-and-X280.patch | 41 +++++++++++++++++++ ...ovo-X1-Carbon-5-should-use-SMBUS-RMI.patch | 28 +++++++++++++ series.conf | 2 + 3 files changed, 71 insertions(+) create mode 100644 patches.backports/Input-synaptics---add-Intertouch-support-on-X1-Carbon-6th-and-X280.patch create mode 100644 patches.backports/v2-2-2-Input-synaptics---Lenovo-X1-Carbon-5-should-use-SMBUS-RMI.patch diff --git a/patches.backports/Input-synaptics---add-Intertouch-support-on-X1-Carbon-6th-and-X280.patch b/patches.backports/Input-synaptics---add-Intertouch-support-on-X1-Carbon-6th-and-X280.patch new file mode 100644 index 0000000..f326a19 --- /dev/null +++ b/patches.backports/Input-synaptics---add-Intertouch-support-on-X1-Carbon-6th-and-X280.patch @@ -0,0 +1,41 @@ +From patchwork Mon Oct 16 14:48:55 2017 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: Input: synaptics - add Intertouch support on X1 Carbon 6th and X280 +From: Aaron Ma +X-Patchwork-Id: 10008513 +Message-Id: <1508165335-16738-1-git-send-email-aaron.ma@canonical.com> +To: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, + dmitry.torokhov@gmail.com, aaron.ma@canonical.com +Date: Mon, 16 Oct 2017 22:48:55 +0800 + +Synaptics devices reported it has Intertouch support, +and it fails via PS/2 as following logs: + +psmouse serio2: Failed to reset mouse on synaptics-pt/serio0 +psmouse serio2: Failed to enable mouse on synaptics-pt/serio0 + +Set these new devices to use SMBus to fix this issue, +then they report SMBus version 3 is using, +patch: https://patchwork.kernel.org/patch/9989547/ enabled SMBus ver 3 and +makes synaptics devices work fine on SMBus mode. + +Signed-off-by: Aaron Ma +--- + drivers/input/mouse/synaptics.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c +index 5af0b7d200bc..da3a5e40e80c 100644 +--- a/drivers/input/mouse/synaptics.c ++++ b/drivers/input/mouse/synaptics.c +@@ -173,6 +173,8 @@ static const char * const smbus_pnp_ids[] = { + "LEN0046", /* X250 */ + "LEN004a", /* W541 */ + "LEN0073", /* X1 Carbon 5 */ ++ "LEN0092", /* X1 Carbon 6 */ ++ "LEN0096", /* X280 */ + "LEN200f", /* T450s */ + NULL + }; diff --git a/patches.backports/v2-2-2-Input-synaptics---Lenovo-X1-Carbon-5-should-use-SMBUS-RMI.patch b/patches.backports/v2-2-2-Input-synaptics---Lenovo-X1-Carbon-5-should-use-SMBUS-RMI.patch new file mode 100644 index 0000000..490baa8 --- /dev/null +++ b/patches.backports/v2-2-2-Input-synaptics---Lenovo-X1-Carbon-5-should-use-SMBUS-RMI.patch @@ -0,0 +1,28 @@ +From patchwork Fri Oct 6 14:06:30 2017 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [v2,2/2] Input: synaptics - Lenovo X1 Carbon 5 should use SMBUS/RMI +From: Yiannis Marangos +X-Patchwork-Id: 9989549 +Message-Id: <20171006140630.6398-3-yiannis.marangos@gmail.com> +To: linux-input@vger.kernel.org +Cc: Yiannis Marangos +Date: Fri, 6 Oct 2017 17:06:30 +0300 + +--- + drivers/input/mouse/synaptics.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c +index 5af0b7d200bc..eecb8872c1a5 100644 +--- a/drivers/input/mouse/synaptics.c ++++ b/drivers/input/mouse/synaptics.c +@@ -172,6 +172,7 @@ static const char * const smbus_pnp_ids[] = { + "LEN0048", /* X1 Carbon 3 */ + "LEN0046", /* X250 */ + "LEN004a", /* W541 */ ++ "LEN0073", /* X1 Carbon 5 */ + "LEN200f", /* T450s */ + NULL + }; diff --git a/series.conf b/series.conf index 46a016a..a52f19f 100644 --- a/series.conf +++ b/series.conf @@ -31,3 +31,5 @@ patches.xen/b93008d1ac65-xen-xenbus-Catch-closing-of-non-existent-transaction.pa patches.xen/8fe5ab411209-xen-xenbus_dev_frontend-Verify-body-of-XS_TRANSACTIO.patch # Hardware-specific fixes, backported from newer kernel and/or developers branches +patches.backports/v2-2-2-Input-synaptics---Lenovo-X1-Carbon-5-should-use-SMBUS-RMI.patch +patches.backports/Input-synaptics---add-Intertouch-support-on-X1-Carbon-6th-and-X280.patch