Merge tag 'for-linus-4.17-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 12 Apr 2018 18:04:35 +0000 (11:04 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 12 Apr 2018 18:04:35 +0000 (11:04 -0700)
Pull xen fixes from Juergen Gross:
 "A few fixes of Xen related core code and drivers"

* tag 'for-linus-4.17-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  xen/pvh: Indicate XENFEAT_linux_rsdp_unrestricted to Xen
  xen/acpi: off by one in read_acpi_id()
  xen/acpi: upload _PSD info for non Dom0 CPUs too
  x86/xen: Delay get_cpu_cap until stack canary is established
  xen: xenbus_dev_frontend: Verify body of XS_TRANSACTION_END
  xen: xenbus: Catch closing of non existent transactions
  xen: xenbus_dev_frontend: Fix XS_TRANSACTION_END handling

arch/x86/xen/enlighten_pv.c
arch/x86/xen/xen-head.S
drivers/acpi/processor_perflib.c
drivers/xen/xen-acpi-processor.c
drivers/xen/xenbus/xenbus_dev_frontend.c
drivers/xen/xenbus/xenbus_xs.c
include/acpi/processor.h
include/xen/interface/features.h

index 3c2c2530737efc717c9945ee1e2990e5b5bfd4c5..c36d23aa6c3502a004d1357027dca057fca7e3a6 100644 (file)
@@ -1259,10 +1259,6 @@ asmlinkage __visible void __init xen_start_kernel(void)
         */
        __userpte_alloc_gfp &= ~__GFP_HIGHMEM;
 
-       /* Work out if we support NX */
-       get_cpu_cap(&boot_cpu_data);
-       x86_configure_nx();
-
        /* Get mfn list */
        xen_build_dynamic_phys_to_machine();
 
@@ -1272,6 +1268,10 @@ asmlinkage __visible void __init xen_start_kernel(void)
         */
        xen_setup_gdt(0);
 
+       /* Work out if we support NX */
+       get_cpu_cap(&boot_cpu_data);
+       x86_configure_nx();
+
        xen_init_irq_ops();
 
        /* Let's presume PV guests always boot on vCPU with id 0. */
index 96f26e026783d8dd04078aeb5ddc8ff9a3f29e06..5077ead5e59cad4b4fc1db004237a746bf6ca960 100644 (file)
@@ -89,7 +89,9 @@ END(hypercall_page)
        ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,
                .ascii "!writable_page_tables|pae_pgdir_above_4gb")
        ELFNOTE(Xen, XEN_ELFNOTE_SUPPORTED_FEATURES,
-               .long (1 << XENFEAT_writable_page_tables) | (1 << XENFEAT_dom0))
+               .long (1 << XENFEAT_writable_page_tables) |       \
+                     (1 << XENFEAT_dom0) |                       \
+                     (1 << XENFEAT_linux_rsdp_unrestricted))
        ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz "yes")
        ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz "generic")
        ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,
index c7cf48ad5cb9dafc42826a26fedd229733cb87ef..a651ab3490d8bbbe843204c6065bb30c64f7dfb8 100644 (file)
@@ -533,7 +533,7 @@ int acpi_processor_notify_smm(struct module *calling_module)
 
 EXPORT_SYMBOL(acpi_processor_notify_smm);
 
-static int acpi_processor_get_psd(struct acpi_processor        *pr)
+int acpi_processor_get_psd(acpi_handle handle, struct acpi_psd_package *pdomain)
 {
        int result = 0;
        acpi_status status = AE_OK;
@@ -541,9 +541,8 @@ static int acpi_processor_get_psd(struct acpi_processor     *pr)
        struct acpi_buffer format = {sizeof("NNNNN"), "NNNNN"};
        struct acpi_buffer state = {0, NULL};
        union acpi_object  *psd = NULL;
-       struct acpi_psd_package *pdomain;
 
-       status = acpi_evaluate_object(pr->handle, "_PSD", NULL, &buffer);
+       status = acpi_evaluate_object(handle, "_PSD", NULL, &buffer);
        if (ACPI_FAILURE(status)) {
                return -ENODEV;
        }
@@ -561,8 +560,6 @@ static int acpi_processor_get_psd(struct acpi_processor     *pr)
                goto end;
        }
 
-       pdomain = &(pr->performance->domain_info);
-
        state.length = sizeof(struct acpi_psd_package);
        state.pointer = pdomain;
 
@@ -597,6 +594,7 @@ end:
        kfree(buffer.pointer);
        return result;
 }
+EXPORT_SYMBOL(acpi_processor_get_psd);
 
 int acpi_processor_preregister_performance(
                struct acpi_processor_performance __percpu *performance)
@@ -645,7 +643,8 @@ int acpi_processor_preregister_performance(
 
                pr->performance = per_cpu_ptr(performance, i);
                cpumask_set_cpu(i, pr->performance->shared_cpu_map);
-               if (acpi_processor_get_psd(pr)) {
+               pdomain = &(pr->performance->domain_info);
+               if (acpi_processor_get_psd(pr->handle, pdomain)) {
                        retval = -EINVAL;
                        continue;
                }
index 23e391d3ec015d0c5b38b21619898c282826f59c..b29f4e40851f0cab2894450e61352285fd28b9f4 100644 (file)
@@ -53,6 +53,8 @@ static unsigned long *acpi_ids_done;
 static unsigned long *acpi_id_present;
 /* And if there is an _CST definition (or a PBLK) for the ACPI IDs */
 static unsigned long *acpi_id_cst_present;
+/* Which ACPI P-State dependencies for a enumerated processor */
+static struct acpi_psd_package *acpi_psd;
 
 static int push_cxx_to_hypervisor(struct acpi_processor *_pr)
 {
@@ -362,9 +364,9 @@ read_acpi_id(acpi_handle handle, u32 lvl, void *context, void **rv)
        }
        /* There are more ACPI Processor objects than in x2APIC or MADT.
         * This can happen with incorrect ACPI SSDT declerations. */
-       if (acpi_id > nr_acpi_bits) {
-               pr_debug("We only have %u, trying to set %u\n",
-                        nr_acpi_bits, acpi_id);
+       if (acpi_id >= nr_acpi_bits) {
+               pr_debug("max acpi id %u, trying to set %u\n",
+                        nr_acpi_bits - 1, acpi_id);
                return AE_OK;
        }
        /* OK, There is a ACPI Processor object */
@@ -372,6 +374,13 @@ read_acpi_id(acpi_handle handle, u32 lvl, void *context, void **rv)
 
        pr_debug("ACPI CPU%u w/ PBLK:0x%lx\n", acpi_id, (unsigned long)pblk);
 
+       /* It has P-state dependencies */
+       if (!acpi_processor_get_psd(handle, &acpi_psd[acpi_id])) {
+               pr_debug("ACPI CPU%u w/ PST:coord_type = %llu domain = %llu\n",
+                        acpi_id, acpi_psd[acpi_id].coord_type,
+                        acpi_psd[acpi_id].domain);
+       }
+
        status = acpi_evaluate_object(handle, "_CST", NULL, &buffer);
        if (ACPI_FAILURE(status)) {
                if (!pblk)
@@ -405,6 +414,14 @@ static int check_acpi_ids(struct acpi_processor *pr_backup)
                return -ENOMEM;
        }
 
+       acpi_psd = kcalloc(nr_acpi_bits, sizeof(struct acpi_psd_package),
+                          GFP_KERNEL);
+       if (!acpi_psd) {
+               kfree(acpi_id_present);
+               kfree(acpi_id_cst_present);
+               return -ENOMEM;
+       }
+
        acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
                            ACPI_UINT32_MAX,
                            read_acpi_id, NULL, NULL, NULL);
@@ -417,6 +434,12 @@ upload:
                        pr_backup->acpi_id = i;
                        /* Mask out C-states if there are no _CST or PBLK */
                        pr_backup->flags.power = test_bit(i, acpi_id_cst_present);
+                       /* num_entries is non-zero if we evaluated _PSD */
+                       if (acpi_psd[i].num_entries) {
+                               memcpy(&pr_backup->performance->domain_info,
+                                      &acpi_psd[i],
+                                      sizeof(struct acpi_psd_package));
+                       }
                        (void)upload_pm_data(pr_backup);
                }
        }
@@ -566,6 +589,7 @@ static void __exit xen_acpi_processor_exit(void)
        kfree(acpi_ids_done);
        kfree(acpi_id_present);
        kfree(acpi_id_cst_present);
+       kfree(acpi_psd);
        for_each_possible_cpu(i)
                acpi_processor_unregister_performance(i);
 
index a493e99bed2131a33afc65e50110f5e0ff6d5244..0d6d9264d6a9ec47c5af4f0be618bdb51a7f0c7e 100644 (file)
@@ -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;
@@ -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);
index 3f3b29398ab8e2b711ce724cf756ea8c241433cb..49a3874ae6bb45e2c5031fa183a252d78e8d882f 100644 (file)
@@ -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);
 
index d591bb77f592b21a56a0496d223ac0455b31b359..40a916efd7c039d2132014fcaf5ec780e4a8248e 100644 (file)
@@ -254,6 +254,8 @@ int acpi_processor_pstate_control(void);
 /* note: this locks both the calling module and the processor module
          if a _PPC object exists, rmmod is disallowed then */
 int acpi_processor_notify_smm(struct module *calling_module);
+int acpi_processor_get_psd(acpi_handle handle,
+                          struct acpi_psd_package *pdomain);
 
 /* parsing the _P* objects. */
 extern int acpi_processor_get_performance_info(struct acpi_processor *pr);
index 9b0eb574f0d155f0ac87893e538c21918b438eaf..6d1384abfbdf96edf21665022b9ef1eb9a5fe7d1 100644 (file)
@@ -42,6 +42,9 @@
 /* x86: Does this Xen host support the MMU_PT_UPDATE_PRESERVE_AD hypercall? */
 #define XENFEAT_mmu_pt_update_preserve_ad  5
 
+/* x86: Does this Xen host support the MMU_{CLEAR,COPY}_PAGE hypercall? */
+#define XENFEAT_highmem_assist             6
+
 /*
  * If set, GNTTABOP_map_grant_ref honors flags to be placed into guest kernel
  * available pte bits.
 /* operation as Dom0 is supported */
 #define XENFEAT_dom0                      11
 
+/* Xen also maps grant references at pfn = mfn.
+ * This feature flag is deprecated and should not be used.
+#define XENFEAT_grant_map_identity        12
+ */
+
+/* Guest can use XENMEMF_vnode to specify virtual node for memory op. */
+#define XENFEAT_memory_op_vnode_supported 13
+
+/* arm: Hypervisor supports ARM SMC calling convention. */
+#define XENFEAT_ARM_SMCCC_supported       14
+
+/*
+ * x86/PVH: If set, ACPI RSDP can be placed at any address. Otherwise RSDP
+ * must be located in lower 1MB, as required by ACPI Specification for IA-PC
+ * systems.
+ * This feature flag is only consulted if XEN_ELFNOTE_GUEST_OS contains
+ * the "linux" string.
+ */
+#define XENFEAT_linux_rsdp_unrestricted   15
+
 #define XENFEAT_NR_SUBMAPS 1
 
 #endif /* __XEN_PUBLIC_FEATURES_H__ */