Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1364232 > unrolled thread
| Started by | Shannon Zhao <shannon.zhao@linaro.org> |
|---|---|
| First post | 2016-03-24 15:50 +0100 |
| Last post | 2016-03-30 14:50 +0200 |
| Articles | 13 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH v7 00/17] Add ACPI support for Xen Dom0 on ARM64 Shannon Zhao <shannon.zhao@linaro.org> - 2016-03-24 15:50 +0100
[PATCH v7 08/17] Xen: public/hvm: sync changes of HVM_PARAM_CALLBACK_VIA ABI from Xen Shannon Zhao <shannon.zhao@linaro.org> - 2016-03-24 16:00 +0100
[PATCH v7 06/17] Xen: ARM: Add support for mapping platform device mmio Shannon Zhao <shannon.zhao@linaro.org> - 2016-03-24 16:00 +0100
[PATCH v7 02/17] xen/grant-table: Move xlated_setup_gnttab_pages to common place Shannon Zhao <shannon.zhao@linaro.org> - 2016-03-24 16:00 +0100
[PATCH v7 10/17] arm/xen: Get event-channel irq through HVM_PARAM when booting with ACPI Shannon Zhao <shannon.zhao@linaro.org> - 2016-03-24 16:00 +0100
Re: [PATCH v7 10/17] arm/xen: Get event-channel irq through HVM_PARAM when booting with ACPI Julien Grall <julien.grall@arm.com> - 2016-03-29 18:40 +0200
Re: [PATCH v7 10/17] arm/xen: Get event-channel irq through HVM_PARAM when booting with ACPI Shannon Zhao <zhaoshenglong@huawei.com> - 2016-03-30 09:40 +0200
[PATCH v7 05/17] xen: memory : Add new XENMAPSPACE type XENMAPSPACE_dev_mmio Shannon Zhao <shannon.zhao@linaro.org> - 2016-03-24 16:00 +0100
[PATCH v7 03/17] Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn Shannon Zhao <shannon.zhao@linaro.org> - 2016-03-24 16:00 +0100
Re: [PATCH v7 03/17] Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn Julien Grall <julien.grall@arm.com> - 2016-03-29 18:30 +0200
Re: [PATCH v7 03/17] Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn Shannon Zhao <zhaoshenglong@huawei.com> - 2016-03-30 09:40 +0200
Re: [PATCH v7 03/17] Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn Julien Grall <julien.grall@arm.com> - 2016-03-30 13:30 +0200
Re: [PATCH v7 03/17] Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn Shannon Zhao <shannon.zhao@linaro.org> - 2016-03-30 14:50 +0200
| From | Shannon Zhao <shannon.zhao@linaro.org> |
|---|---|
| Date | 2016-03-24 15:50 +0100 |
| Subject | [PATCH v7 00/17] Add ACPI support for Xen Dom0 on ARM64 |
| Message-ID | <rgeKe-3Y1-7@gated-at.bofh.it> |
This patch set adds ACPI support for Xen Dom0 on ARM64. The relevant Xen
ACPI on ARM64 design document could be found from [1].
This patch set adds a new FDT node "uefi" under /hypervisor to pass UEFI
information. Introduce a bus notifier of AMBA and Platform bus to map
the new added device's MMIO space. Make Xen domain use
xlated_setup_gnttab_pages to setup grant table and a new hypercall to
get event-channel irq.
Regarding the initialization flow of Linux kernel, it needs to move
xen_early_init() before efi_init(). Then xen_early_init() will check
whether it runs on Xen through the /hypervisor node and efi_init() will
call a new function fdt_find_xen_uefi_params(), to parse those
xen,uefi-* parameters just like the existing efi_get_fdt_params().
And in arm64_enable_runtime_services() it will check whether it runs on
Xen and call another new function xen_efi_runtime_setup() to setup
runtime service instead of efi_native_runtime_setup(). The
xen_efi_runtime_setup() will assign the runtime function pointers with
the functions of driver/xen/efi.c.
And since we pass a /hypervisor node and a /chosen node to Dom0, it
needs to check whether the DTS only contains a /hypervisor node and a
/chosen node in acpi_boot_table_init().
Patches are tested on FVP base model.
Thanks,
Shannon
[1] http://lists.xen.org/archives/html/xen-devel/2015-11/msg00488.html
Changes since v6:
* rebase on linux master
* refactor codes as acpi_get_spcr_uart_addr (PATCH 1)
* sync with Xen (patch 9)
Changes since v5:
* rebase on linux master
* use acpi_dev_resource_memory to parse the device memory info(patch 1)
* sync with Xen (patch 9)
Changes since v4:
* rebase on linux master
* move the check acpi_device_should_be_hidden into
acpi_bus_type_and_status (patch 1)
* use existing function fdt_subnode_offset (patch 16)
Changes since v3:
* rebase on linux master
* print a warning when there is no SPCR table
* rephase the commit message of PATCH 3
* rephase the words of PATCH 13
* use strcmp and factor the function in PATCH 16
* Add several ACKs and RBs, thanks a lot
Changes since v2:
* Use 0 to check if it should ignore the UART
* Fix the use of page_to_xen_pfn
* Factor ACPI and DT parts in xen_guest_init
* Check "uefi" node by full path
* Fix the statement of Documentation/devicetree/bindings/arm/xen.txt
Changes since v1:
* Rebase on linux mainline and wallclock patch from Stefano
* Refactor AMBA and platform device MMIO map to one file
* Use EFI_PARAVIRT to check if it supports XEN EFI
* Refactor Xen EFI codes
* Address other comments
Shannon Zhao (17):
Xen: ACPI: Hide UART used by Xen
xen/grant-table: Move xlated_setup_gnttab_pages to common place
Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn
arm/xen: Use xen_xlate_map_ballooned_pages to setup grant table
xen: memory : Add new XENMAPSPACE type XENMAPSPACE_dev_mmio
Xen: ARM: Add support for mapping platform device mmio
Xen: ARM: Add support for mapping AMBA device mmio
Xen: public/hvm: sync changes of HVM_PARAM_CALLBACK_VIA ABI from Xen
xen/hvm/params: Add a new delivery type for event-channel in
HVM_PARAM_CALLBACK_IRQ
arm/xen: Get event-channel irq through HVM_PARAM when booting with
ACPI
ARM: XEN: Move xen_early_init() before efi_init()
ARM64: ACPI: Check if it runs on Xen to enable or disable ACPI
ARM: Xen: Document UEFI support on Xen ARM virtual platforms
XEN: EFI: Move x86 specific codes to architecture directory
ARM64: XEN: Add a function to initialize Xen specific UEFI runtime
services
FDT: Add a helper to get the subnode by given name
Xen: EFI: Parse DT parameters for Xen specific UEFI
Documentation/devicetree/bindings/arm/xen.txt | 33 +++++
arch/arm/include/asm/xen/xen-ops.h | 6 +
arch/arm/xen/Makefile | 1 +
arch/arm/xen/efi.c | 40 ++++++
arch/arm/xen/enlighten.c | 109 +++++++++++----
arch/arm64/include/asm/xen/xen-ops.h | 6 +
arch/arm64/kernel/acpi.c | 12 +-
arch/arm64/kernel/setup.c | 2 +-
arch/arm64/xen/Makefile | 1 +
arch/x86/xen/efi.c | 112 ++++++++++++++++
arch/x86/xen/grant-table.c | 57 +-------
drivers/acpi/scan.c | 68 ++++++++++
drivers/firmware/efi/arm-runtime.c | 17 ++-
drivers/firmware/efi/efi.c | 45 ++++++-
drivers/of/fdt.c | 13 ++
drivers/xen/Kconfig | 2 +-
drivers/xen/Makefile | 1 +
drivers/xen/arm-device.c | 184 ++++++++++++++++++++++++++
drivers/xen/efi.c | 174 +++++-------------------
drivers/xen/xlate_mmu.c | 67 ++++++++++
include/linux/of_fdt.h | 2 +
include/xen/interface/hvm/params.h | 40 +++++-
include/xen/interface/memory.h | 1 +
include/xen/xen-ops.h | 32 +++--
24 files changed, 778 insertions(+), 247 deletions(-)
create mode 100644 arch/arm/include/asm/xen/xen-ops.h
create mode 100644 arch/arm/xen/efi.c
create mode 100644 arch/arm64/include/asm/xen/xen-ops.h
create mode 100644 drivers/xen/arm-device.c
--
2.1.4
[toc] | [next] | [standalone]
| From | Shannon Zhao <shannon.zhao@linaro.org> |
|---|---|
| Date | 2016-03-24 16:00 +0100 |
| Subject | [PATCH v7 08/17] Xen: public/hvm: sync changes of HVM_PARAM_CALLBACK_VIA ABI from Xen |
| Message-ID | <rgeTT-42l-3@gated-at.bofh.it> |
| In reply to | #1364232 |
Sync the changes of HVM_PARAM_CALLBACK_VIA ABI introduced by
Xen commit <ca5c54b6ff05> (public/hvm: export the HVM_PARAM_CALLBACK_VIA
ABI in the API).
Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
include/xen/interface/hvm/params.h | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/include/xen/interface/hvm/params.h b/include/xen/interface/hvm/params.h
index a6c7991..70ad208 100644
--- a/include/xen/interface/hvm/params.h
+++ b/include/xen/interface/hvm/params.h
@@ -27,16 +27,31 @@
* Parameter space for HVMOP_{set,get}_param.
*/
+#define HVM_PARAM_CALLBACK_IRQ 0
/*
* How should CPU0 event-channel notifications be delivered?
- * val[63:56] == 0: val[55:0] is a delivery GSI (Global System Interrupt).
- * val[63:56] == 1: val[55:0] is a delivery PCI INTx line, as follows:
- * Domain = val[47:32], Bus = val[31:16],
- * DevFn = val[15: 8], IntX = val[ 1: 0]
- * val[63:56] == 2: val[7:0] is a vector number.
+ *
* If val == 0 then CPU0 event-channel notifications are not delivered.
+ * If val != 0, val[63:56] encodes the type, as follows:
+ */
+
+#define HVM_PARAM_CALLBACK_TYPE_GSI 0
+/*
+ * val[55:0] is a delivery GSI. GSI 0 cannot be used, as it aliases val == 0,
+ * and disables all notifications.
+ */
+
+#define HVM_PARAM_CALLBACK_TYPE_PCI_INTX 1
+/*
+ * val[55:0] is a delivery PCI INTx line:
+ * Domain = val[47:32], Bus = val[31:16] DevFn = val[15:8], IntX = val[1:0]
+ */
+
+#define HVM_PARAM_CALLBACK_TYPE_VECTOR 2
+/*
+ * val[7:0] is a vector number. Check for XENFEAT_hvm_callback_vector to know
+ * if this delivery method is available.
*/
-#define HVM_PARAM_CALLBACK_IRQ 0
#define HVM_PARAM_STORE_PFN 1
#define HVM_PARAM_STORE_EVTCHN 2
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Shannon Zhao <shannon.zhao@linaro.org> |
|---|---|
| Date | 2016-03-24 16:00 +0100 |
| Subject | [PATCH v7 06/17] Xen: ARM: Add support for mapping platform device mmio |
| Message-ID | <rgeTU-42l-21@gated-at.bofh.it> |
| In reply to | #1364232 |
Add a bus_notifier for platform bus device in order to map the device
mmio regions when DOM0 booting with ACPI.
Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
drivers/xen/Makefile | 1 +
drivers/xen/arm-device.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 142 insertions(+)
create mode 100644 drivers/xen/arm-device.c
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
index 9b7a35c..415f286 100644
--- a/drivers/xen/Makefile
+++ b/drivers/xen/Makefile
@@ -9,6 +9,7 @@ CFLAGS_features.o := $(nostackp)
CFLAGS_efi.o += -fshort-wchar
+dom0-$(CONFIG_ARM64) += arm-device.o
dom0-$(CONFIG_PCI) += pci.o
dom0-$(CONFIG_USB_SUPPORT) += dbgp.o
dom0-$(CONFIG_XEN_ACPI) += acpi.o $(xen-pad-y)
diff --git a/drivers/xen/arm-device.c b/drivers/xen/arm-device.c
new file mode 100644
index 0000000..76e26e5
--- /dev/null
+++ b/drivers/xen/arm-device.c
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2015, Linaro Limited, Shannon Zhao
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/platform_device.h>
+#include <linux/acpi.h>
+#include <xen/xen.h>
+#include <xen/page.h>
+#include <xen/interface/memory.h>
+#include <asm/xen/hypervisor.h>
+#include <asm/xen/hypercall.h>
+
+static int xen_unmap_device_mmio(struct resource *resource, unsigned int count)
+{
+ unsigned int i, j, nr;
+ int rc = 0;
+ struct resource *r;
+ struct xen_remove_from_physmap xrp;
+
+ for (i = 0; i < count; i++) {
+ r = &resource[i];
+ nr = DIV_ROUND_UP(resource_size(r), XEN_PAGE_SIZE);
+ if ((resource_type(r) != IORESOURCE_MEM) || (nr == 0))
+ continue;
+
+ for (j = 0; j < nr; j++) {
+ xrp.domid = DOMID_SELF;
+ xrp.gpfn = XEN_PFN_DOWN(r->start) + j;
+ rc = HYPERVISOR_memory_op(XENMEM_remove_from_physmap,
+ &xrp);
+ if (rc)
+ return rc;
+ }
+ }
+
+ return rc;
+}
+
+static int xen_map_device_mmio(struct resource *resource, unsigned int count)
+{
+ unsigned int i, j, nr;
+ int rc = 0;
+ struct resource *r;
+ xen_pfn_t *gpfns;
+ xen_ulong_t *idxs;
+ int *errs;
+ struct xen_add_to_physmap_range xatp;
+
+ for (i = 0; i < count; i++) {
+ r = &resource[i];
+ nr = DIV_ROUND_UP(resource_size(r), XEN_PAGE_SIZE);
+ if ((resource_type(r) != IORESOURCE_MEM) || (nr == 0))
+ continue;
+
+ gpfns = kzalloc(sizeof(xen_pfn_t) * nr, GFP_KERNEL);
+ idxs = kzalloc(sizeof(xen_ulong_t) * nr, GFP_KERNEL);
+ errs = kzalloc(sizeof(int) * nr, GFP_KERNEL);
+ if (!gpfns || !idxs || !errs) {
+ kfree(gpfns);
+ kfree(idxs);
+ kfree(errs);
+ return -ENOMEM;
+ }
+
+ for (j = 0; j < nr; j++) {
+ gpfns[j] = XEN_PFN_DOWN(r->start) + j;
+ idxs[j] = XEN_PFN_DOWN(r->start) + j;
+ }
+
+ xatp.domid = DOMID_SELF;
+ xatp.size = nr;
+ xatp.space = XENMAPSPACE_dev_mmio;
+
+ set_xen_guest_handle(xatp.gpfns, gpfns);
+ set_xen_guest_handle(xatp.idxs, idxs);
+ set_xen_guest_handle(xatp.errs, errs);
+
+ rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap_range, &xatp);
+ kfree(gpfns);
+ kfree(idxs);
+ kfree(errs);
+ if (rc)
+ return rc;
+ }
+
+ return rc;
+}
+
+static int xen_platform_notifier(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ struct platform_device *pdev = to_platform_device(data);
+ int r = 0;
+
+ if (pdev->num_resources == 0 || pdev->resource == NULL)
+ return NOTIFY_OK;
+
+ switch (action) {
+ case BUS_NOTIFY_ADD_DEVICE:
+ r = xen_map_device_mmio(pdev->resource, pdev->num_resources);
+ break;
+ case BUS_NOTIFY_DEL_DEVICE:
+ r = xen_unmap_device_mmio(pdev->resource, pdev->num_resources);
+ break;
+ default:
+ return NOTIFY_DONE;
+ }
+ if (r)
+ dev_err(&pdev->dev, "Platform: Failed to %s device %s MMIO!\n",
+ action == BUS_NOTIFY_ADD_DEVICE ? "map" :
+ (action == BUS_NOTIFY_DEL_DEVICE ? "unmap" : "?"),
+ pdev->name);
+
+ return NOTIFY_OK;
+}
+
+static struct notifier_block platform_device_nb = {
+ .notifier_call = xen_platform_notifier,
+};
+
+static int __init register_xen_platform_notifier(void)
+{
+ if (!xen_initial_domain() || acpi_disabled)
+ return 0;
+
+ return bus_register_notifier(&platform_bus_type, &platform_device_nb);
+}
+
+arch_initcall(register_xen_platform_notifier);
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Shannon Zhao <shannon.zhao@linaro.org> |
|---|---|
| Date | 2016-03-24 16:00 +0100 |
| Subject | [PATCH v7 02/17] xen/grant-table: Move xlated_setup_gnttab_pages to common place |
| Message-ID | <rgeTU-42l-23@gated-at.bofh.it> |
| In reply to | #1364232 |
Move xlated_setup_gnttab_pages to common place, so it can be reused by
ARM to setup grant table.
Rename it to xen_xlate_map_ballooned_pages.
Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
arch/x86/xen/grant-table.c | 57 +++++--------------------------------------
drivers/xen/xlate_mmu.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++
include/xen/xen-ops.h | 2 ++
3 files changed, 69 insertions(+), 51 deletions(-)
diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index e079500..de4144c 100644
--- a/arch/x86/xen/grant-table.c
+++ b/arch/x86/xen/grant-table.c
@@ -111,63 +111,18 @@ int arch_gnttab_init(unsigned long nr_shared)
}
#ifdef CONFIG_XEN_PVH
-#include <xen/balloon.h>
#include <xen/events.h>
-#include <linux/slab.h>
-static int __init xlated_setup_gnttab_pages(void)
-{
- struct page **pages;
- xen_pfn_t *pfns;
- void *vaddr;
- int rc;
- unsigned int i;
- unsigned long nr_grant_frames = gnttab_max_grant_frames();
-
- BUG_ON(nr_grant_frames == 0);
- pages = kcalloc(nr_grant_frames, sizeof(pages[0]), GFP_KERNEL);
- if (!pages)
- return -ENOMEM;
-
- pfns = kcalloc(nr_grant_frames, sizeof(pfns[0]), GFP_KERNEL);
- if (!pfns) {
- kfree(pages);
- return -ENOMEM;
- }
- rc = alloc_xenballooned_pages(nr_grant_frames, pages);
- if (rc) {
- pr_warn("%s Couldn't balloon alloc %ld pfns rc:%d\n", __func__,
- nr_grant_frames, rc);
- kfree(pages);
- kfree(pfns);
- return rc;
- }
- for (i = 0; i < nr_grant_frames; i++)
- pfns[i] = page_to_pfn(pages[i]);
-
- vaddr = vmap(pages, nr_grant_frames, 0, PAGE_KERNEL);
- if (!vaddr) {
- pr_warn("%s Couldn't map %ld pfns rc:%d\n", __func__,
- nr_grant_frames, rc);
- free_xenballooned_pages(nr_grant_frames, pages);
- kfree(pages);
- kfree(pfns);
- return -ENOMEM;
- }
- kfree(pages);
-
- xen_auto_xlat_grant_frames.pfn = pfns;
- xen_auto_xlat_grant_frames.count = nr_grant_frames;
- xen_auto_xlat_grant_frames.vaddr = vaddr;
-
- return 0;
-}
-
+#include <xen/xen-ops.h>
static int __init xen_pvh_gnttab_setup(void)
{
if (!xen_pvh_domain())
return -ENODEV;
- return xlated_setup_gnttab_pages();
+ xen_auto_xlat_grant_frames.count = gnttab_max_grant_frames();
+
+ return xen_xlate_map_ballooned_pages(&xen_auto_xlat_grant_frames.pfn,
+ &xen_auto_xlat_grant_frames.vaddr,
+ xen_auto_xlat_grant_frames.count);
}
/* Call it _before_ __gnttab_init as we need to initialize the
* xen_auto_xlat_grant_frames first. */
diff --git a/drivers/xen/xlate_mmu.c b/drivers/xen/xlate_mmu.c
index 5063c5e..9692656 100644
--- a/drivers/xen/xlate_mmu.c
+++ b/drivers/xen/xlate_mmu.c
@@ -29,6 +29,8 @@
*/
#include <linux/kernel.h>
#include <linux/mm.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
#include <asm/xen/hypercall.h>
#include <asm/xen/hypervisor.h>
@@ -37,6 +39,7 @@
#include <xen/page.h>
#include <xen/interface/xen.h>
#include <xen/interface/memory.h>
+#include <xen/balloon.h>
typedef void (*xen_gfn_fn_t)(unsigned long gfn, void *data);
@@ -185,3 +188,61 @@ int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
return 0;
}
EXPORT_SYMBOL_GPL(xen_xlate_unmap_gfn_range);
+
+/**
+ * xen_xlate_map_ballooned_pages - map a new set of ballooned pages
+ * @gfns: returns the array of corresponding GFNs
+ * @virt: returns the virtual address of the mapped region
+ * @nr_grant_frames: number of GFNs
+ * @return 0 on success, error otherwise
+ *
+ * This allocates a set of ballooned pages and maps them into the
+ * kernel's address space.
+ */
+int __init xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
+ unsigned long nr_grant_frames)
+{
+ struct page **pages;
+ xen_pfn_t *pfns;
+ void *vaddr;
+ int rc;
+ unsigned int i;
+
+ BUG_ON(nr_grant_frames == 0);
+ pages = kcalloc(nr_grant_frames, sizeof(pages[0]), GFP_KERNEL);
+ if (!pages)
+ return -ENOMEM;
+
+ pfns = kcalloc(nr_grant_frames, sizeof(pfns[0]), GFP_KERNEL);
+ if (!pfns) {
+ kfree(pages);
+ return -ENOMEM;
+ }
+ rc = alloc_xenballooned_pages(nr_grant_frames, pages);
+ if (rc) {
+ pr_warn("%s Couldn't balloon alloc %ld pfns rc:%d\n", __func__,
+ nr_grant_frames, rc);
+ kfree(pages);
+ kfree(pfns);
+ return rc;
+ }
+ for (i = 0; i < nr_grant_frames; i++)
+ pfns[i] = page_to_pfn(pages[i]);
+
+ vaddr = vmap(pages, nr_grant_frames, 0, PAGE_KERNEL);
+ if (!vaddr) {
+ pr_warn("%s Couldn't map %ld pfns rc:%d\n", __func__,
+ nr_grant_frames, rc);
+ free_xenballooned_pages(nr_grant_frames, pages);
+ kfree(pages);
+ kfree(pfns);
+ return -ENOMEM;
+ }
+ kfree(pages);
+
+ *gfns = pfns;
+ *virt = vaddr;
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(xen_xlate_map_ballooned_pages);
diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h
index 86abe07..072be1c 100644
--- a/include/xen/xen-ops.h
+++ b/include/xen/xen-ops.h
@@ -85,6 +85,8 @@ int xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
struct page **pages);
int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
int nr, struct page **pages);
+int xen_xlate_map_ballooned_pages(xen_pfn_t **pfns, void **vaddr,
+ unsigned long nr_grant_frames);
bool xen_running_on_version_or_later(unsigned int major, unsigned int minor);
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Shannon Zhao <shannon.zhao@linaro.org> |
|---|---|
| Date | 2016-03-24 16:00 +0100 |
| Subject | [PATCH v7 10/17] arm/xen: Get event-channel irq through HVM_PARAM when booting with ACPI |
| Message-ID | <rgeTU-42l-29@gated-at.bofh.it> |
| In reply to | #1364232 |
When booting with ACPI, it could get the event-channel irq through
HVM_PARAM_CALLBACK_IRQ.
Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
arch/arm/xen/enlighten.c | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
index d94f726..680aae0 100644
--- a/arch/arm/xen/enlighten.c
+++ b/arch/arm/xen/enlighten.c
@@ -30,6 +30,7 @@
#include <linux/time64.h>
#include <linux/timekeeping.h>
#include <linux/timekeeper_internal.h>
+#include <linux/acpi.h>
#include <linux/mm.h>
@@ -278,6 +279,35 @@ void __init xen_early_init(void)
add_preferred_console("hvc", 0, NULL);
}
+static void __init xen_acpi_guest_init(void)
+{
+#ifdef CONFIG_ACPI
+ struct xen_hvm_param a;
+ int interrupt, trigger, polarity;
+
+ a.domid = DOMID_SELF;
+ a.index = HVM_PARAM_CALLBACK_IRQ;
+ xen_events_irq = 0;
+
+ if (!HYPERVISOR_hvm_op(HVMOP_get_param, &a)) {
+ if ((a.value >> 56) == HVM_PARAM_CALLBACK_TYPE_PPI) {
+ interrupt = a.value & 0xff;
+ trigger = ((a.value >> 8) & 0x1) ? ACPI_EDGE_SENSITIVE
+ : ACPI_LEVEL_SENSITIVE;
+ polarity = ((a.value >> 8) & 0x2) ? ACPI_ACTIVE_LOW
+ : ACPI_ACTIVE_HIGH;
+ xen_events_irq = acpi_register_gsi(NULL, interrupt,
+ trigger, polarity);
+ }
+ }
+#endif
+}
+
+static void __init xen_dt_guest_init(void)
+{
+ xen_events_irq = irq_of_parse_and_map(xen_node, 0);
+}
+
static int __init xen_guest_init(void)
{
struct xen_add_to_physmap xatp;
@@ -286,7 +316,11 @@ static int __init xen_guest_init(void)
if (!xen_domain())
return 0;
- xen_events_irq = irq_of_parse_and_map(xen_node, 0);
+ if (!acpi_disabled)
+ xen_acpi_guest_init();
+ else
+ xen_dt_guest_init();
+
if (!xen_events_irq) {
pr_err("Xen event channel interrupt not found\n");
return -ENODEV;
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Julien Grall <julien.grall@arm.com> |
|---|---|
| Date | 2016-03-29 18:40 +0200 |
| Subject | Re: [PATCH v7 10/17] arm/xen: Get event-channel irq through HVM_PARAM when booting with ACPI |
| Message-ID | <ri4Qr-sQ-21@gated-at.bofh.it> |
| In reply to | #1364247 |
Hi Shannon,
On 24/03/16 14:44, Shannon Zhao wrote:
> When booting with ACPI, it could get the event-channel irq through
The kernel will always get the event-channel IRQ through
HVM_PARAM_CALLBACK_IRQ.
So I would say: ", the kernel will get the event-channel..."
> HVM_PARAM_CALLBACK_IRQ.
>
> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> ---
> arch/arm/xen/enlighten.c | 36 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
> index d94f726..680aae0 100644
> --- a/arch/arm/xen/enlighten.c
> +++ b/arch/arm/xen/enlighten.c
> @@ -30,6 +30,7 @@
> #include <linux/time64.h>
> #include <linux/timekeeping.h>
> #include <linux/timekeeper_internal.h>
> +#include <linux/acpi.h>
>
> #include <linux/mm.h>
>
> @@ -278,6 +279,35 @@ void __init xen_early_init(void)
> add_preferred_console("hvc", 0, NULL);
> }
>
> +static void __init xen_acpi_guest_init(void)
> +{
> +#ifdef CONFIG_ACPI
> + struct xen_hvm_param a;
> + int interrupt, trigger, polarity;
> +
> + a.domid = DOMID_SELF;
> + a.index = HVM_PARAM_CALLBACK_IRQ;
> + xen_events_irq = 0;
> +
> + if (!HYPERVISOR_hvm_op(HVMOP_get_param, &a)) {
> + if ((a.value >> 56) == HVM_PARAM_CALLBACK_TYPE_PPI) {
> + interrupt = a.value & 0xff;
> + trigger = ((a.value >> 8) & 0x1) ? ACPI_EDGE_SENSITIVE
> + : ACPI_LEVEL_SENSITIVE;
> + polarity = ((a.value >> 8) & 0x2) ? ACPI_ACTIVE_LOW
> + : ACPI_ACTIVE_HIGH;
> + xen_events_irq = acpi_register_gsi(NULL, interrupt,
> + trigger, polarity);
> + }
> + }
Can you invert the condition to remove one layer of indentation?
Regards,
--
Julien Grall
[toc] | [prev] | [next] | [standalone]
| From | Shannon Zhao <zhaoshenglong@huawei.com> |
|---|---|
| Date | 2016-03-30 09:40 +0200 |
| Subject | Re: [PATCH v7 10/17] arm/xen: Get event-channel irq through HVM_PARAM when booting with ACPI |
| Message-ID | <riiTo-24i-9@gated-at.bofh.it> |
| In reply to | #1366454 |
On 2016/3/30 0:35, Julien Grall wrote:
> Hi Shannon,
>
> On 24/03/16 14:44, Shannon Zhao wrote:
>> When booting with ACPI, it could get the event-channel irq through
>
> The kernel will always get the event-channel IRQ through
> HVM_PARAM_CALLBACK_IRQ.
>
> So I would say: ", the kernel will get the event-channel..."
>
>> HVM_PARAM_CALLBACK_IRQ.
>>
>> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
>> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>> ---
>> arch/arm/xen/enlighten.c | 36 +++++++++++++++++++++++++++++++++++-
>> 1 file changed, 35 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
>> index d94f726..680aae0 100644
>> --- a/arch/arm/xen/enlighten.c
>> +++ b/arch/arm/xen/enlighten.c
>> @@ -30,6 +30,7 @@
>> #include <linux/time64.h>
>> #include <linux/timekeeping.h>
>> #include <linux/timekeeper_internal.h>
>> +#include <linux/acpi.h>
>>
>> #include <linux/mm.h>
>>
>> @@ -278,6 +279,35 @@ void __init xen_early_init(void)
>> add_preferred_console("hvc", 0, NULL);
>> }
>>
>> +static void __init xen_acpi_guest_init(void)
>> +{
>> +#ifdef CONFIG_ACPI
>> + struct xen_hvm_param a;
>> + int interrupt, trigger, polarity;
>> +
>> + a.domid = DOMID_SELF;
>> + a.index = HVM_PARAM_CALLBACK_IRQ;
>> + xen_events_irq = 0;
>> +
>> + if (!HYPERVISOR_hvm_op(HVMOP_get_param, &a)) {
>> + if ((a.value >> 56) == HVM_PARAM_CALLBACK_TYPE_PPI) {
>> + interrupt = a.value & 0xff;
>> + trigger = ((a.value >> 8) & 0x1) ? ACPI_EDGE_SENSITIVE
>> + : ACPI_LEVEL_SENSITIVE;
>> + polarity = ((a.value >> 8) & 0x2) ? ACPI_ACTIVE_LOW
>> + : ACPI_ACTIVE_HIGH;
>> + xen_events_irq = acpi_register_gsi(NULL, interrupt,
>> + trigger, polarity);
>> + }
>> + }
>
> Can you invert the condition to remove one layer of indentation?
Sure, will update.
Thanks,
--
Shannon
[toc] | [prev] | [next] | [standalone]
| From | Shannon Zhao <shannon.zhao@linaro.org> |
|---|---|
| Date | 2016-03-24 16:00 +0100 |
| Subject | [PATCH v7 05/17] xen: memory : Add new XENMAPSPACE type XENMAPSPACE_dev_mmio |
| Message-ID | <rgeTU-42l-33@gated-at.bofh.it> |
| In reply to | #1364232 |
Add a new type of Xen map space for Dom0 to map device's MMIO region. Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> --- include/xen/interface/memory.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h index 2ecfe4f..9aa8988 100644 --- a/include/xen/interface/memory.h +++ b/include/xen/interface/memory.h @@ -160,6 +160,7 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_machphys_mapping_t); #define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another dom, * XENMEM_add_to_physmap_range only. */ +#define XENMAPSPACE_dev_mmio 5 /* device mmio region */ /* * Sets the GPFN at which a particular page appears in the specified guest's -- 2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Shannon Zhao <shannon.zhao@linaro.org> |
|---|---|
| Date | 2016-03-24 16:00 +0100 |
| Subject | [PATCH v7 03/17] Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn |
| Message-ID | <rgeTU-42l-37@gated-at.bofh.it> |
| In reply to | #1364232 |
Make xen_xlate_map_ballooned_pages work with 64K pages. In that case
Kernel pages are 64K in size but Xen pages remain 4K in size. Xen pfns
refer to 4K pages.
Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
drivers/xen/xlate_mmu.c | 26 ++++++++++++++++----------
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/drivers/xen/xlate_mmu.c b/drivers/xen/xlate_mmu.c
index 9692656..28f728b 100644
--- a/drivers/xen/xlate_mmu.c
+++ b/drivers/xen/xlate_mmu.c
@@ -207,9 +207,12 @@ int __init xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
void *vaddr;
int rc;
unsigned int i;
+ unsigned long nr_pages;
+ xen_pfn_t xen_pfn = 0;
BUG_ON(nr_grant_frames == 0);
- pages = kcalloc(nr_grant_frames, sizeof(pages[0]), GFP_KERNEL);
+ nr_pages = DIV_ROUND_UP(nr_grant_frames, XEN_PFN_PER_PAGE);
+ pages = kcalloc(nr_pages, sizeof(pages[0]), GFP_KERNEL);
if (!pages)
return -ENOMEM;
@@ -218,22 +221,25 @@ int __init xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
kfree(pages);
return -ENOMEM;
}
- rc = alloc_xenballooned_pages(nr_grant_frames, pages);
+ rc = alloc_xenballooned_pages(nr_pages, pages);
if (rc) {
- pr_warn("%s Couldn't balloon alloc %ld pfns rc:%d\n", __func__,
- nr_grant_frames, rc);
+ pr_warn("%s Couldn't balloon alloc %ld pages rc:%d\n", __func__,
+ nr_pages, rc);
kfree(pages);
kfree(pfns);
return rc;
}
- for (i = 0; i < nr_grant_frames; i++)
- pfns[i] = page_to_pfn(pages[i]);
+ for (i = 0; i < nr_grant_frames; i++) {
+ if ((i % XEN_PFN_PER_PAGE) == 0)
+ xen_pfn = page_to_xen_pfn(pages[i / XEN_PFN_PER_PAGE]);
+ pfns[i] = pfn_to_gfn(xen_pfn++);
+ }
- vaddr = vmap(pages, nr_grant_frames, 0, PAGE_KERNEL);
+ vaddr = vmap(pages, nr_pages, 0, PAGE_KERNEL);
if (!vaddr) {
- pr_warn("%s Couldn't map %ld pfns rc:%d\n", __func__,
- nr_grant_frames, rc);
- free_xenballooned_pages(nr_grant_frames, pages);
+ pr_warn("%s Couldn't map %ld pages rc:%d\n", __func__,
+ nr_pages, rc);
+ free_xenballooned_pages(nr_pages, pages);
kfree(pages);
kfree(pfns);
return -ENOMEM;
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Julien Grall <julien.grall@arm.com> |
|---|---|
| Date | 2016-03-29 18:30 +0200 |
| Subject | Re: [PATCH v7 03/17] Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn |
| Message-ID | <ri4GJ-pQ-1@gated-at.bofh.it> |
| In reply to | #1364251 |
Hi Shannon,
On 24/03/16 14:44, Shannon Zhao wrote:
> Make xen_xlate_map_ballooned_pages work with 64K pages. In that case
> Kernel pages are 64K in size but Xen pages remain 4K in size. Xen pfns
> refer to 4K pages.
>
> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> ---
> drivers/xen/xlate_mmu.c | 26 ++++++++++++++++----------
> 1 file changed, 16 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/xen/xlate_mmu.c b/drivers/xen/xlate_mmu.c
> index 9692656..28f728b 100644
> --- a/drivers/xen/xlate_mmu.c
> +++ b/drivers/xen/xlate_mmu.c
> @@ -207,9 +207,12 @@ int __init xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
> void *vaddr;
> int rc;
> unsigned int i;
> + unsigned long nr_pages;
> + xen_pfn_t xen_pfn = 0;
>
> BUG_ON(nr_grant_frames == 0);
> - pages = kcalloc(nr_grant_frames, sizeof(pages[0]), GFP_KERNEL);
> + nr_pages = DIV_ROUND_UP(nr_grant_frames, XEN_PFN_PER_PAGE);
> + pages = kcalloc(nr_pages, sizeof(pages[0]), GFP_KERNEL);
> if (!pages)
> return -ENOMEM;
>
> @@ -218,22 +221,25 @@ int __init xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
> kfree(pages);
> return -ENOMEM;
> }
> - rc = alloc_xenballooned_pages(nr_grant_frames, pages);
> + rc = alloc_xenballooned_pages(nr_pages, pages);
> if (rc) {
> - pr_warn("%s Couldn't balloon alloc %ld pfns rc:%d\n", __func__,
> - nr_grant_frames, rc);
> + pr_warn("%s Couldn't balloon alloc %ld pages rc:%d\n", __func__,
> + nr_pages, rc);
> kfree(pages);
> kfree(pfns);
> return rc;
> }
> - for (i = 0; i < nr_grant_frames; i++)
> - pfns[i] = page_to_pfn(pages[i]);
> + for (i = 0; i < nr_grant_frames; i++) {
> + if ((i % XEN_PFN_PER_PAGE) == 0)
> + xen_pfn = page_to_xen_pfn(pages[i / XEN_PFN_PER_PAGE]);
> + pfns[i] = pfn_to_gfn(xen_pfn++);
> + }
Would it be possible to re-use xen_for_each_gfn? This will avoid
open-coding the loop to break down the Linux page.
Regards,
--
Julien Grall
[toc] | [prev] | [next] | [standalone]
| From | Shannon Zhao <zhaoshenglong@huawei.com> |
|---|---|
| Date | 2016-03-30 09:40 +0200 |
| Subject | Re: [PATCH v7 03/17] Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn |
| Message-ID | <riiTn-24i-3@gated-at.bofh.it> |
| In reply to | #1366441 |
On 2016/3/30 0:28, Julien Grall wrote:
> Hi Shannon,
>
> On 24/03/16 14:44, Shannon Zhao wrote:
>> Make xen_xlate_map_ballooned_pages work with 64K pages. In that case
>> Kernel pages are 64K in size but Xen pages remain 4K in size. Xen pfns
>> refer to 4K pages.
>>
>> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
>> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>> ---
>> drivers/xen/xlate_mmu.c | 26 ++++++++++++++++----------
>> 1 file changed, 16 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/xen/xlate_mmu.c b/drivers/xen/xlate_mmu.c
>> index 9692656..28f728b 100644
>> --- a/drivers/xen/xlate_mmu.c
>> +++ b/drivers/xen/xlate_mmu.c
>> @@ -207,9 +207,12 @@ int __init
>> xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
>> void *vaddr;
>> int rc;
>> unsigned int i;
>> + unsigned long nr_pages;
>> + xen_pfn_t xen_pfn = 0;
>>
>> BUG_ON(nr_grant_frames == 0);
>> - pages = kcalloc(nr_grant_frames, sizeof(pages[0]), GFP_KERNEL);
>> + nr_pages = DIV_ROUND_UP(nr_grant_frames, XEN_PFN_PER_PAGE);
>> + pages = kcalloc(nr_pages, sizeof(pages[0]), GFP_KERNEL);
>> if (!pages)
>> return -ENOMEM;
>>
>> @@ -218,22 +221,25 @@ int __init
>> xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
>> kfree(pages);
>> return -ENOMEM;
>> }
>> - rc = alloc_xenballooned_pages(nr_grant_frames, pages);
>> + rc = alloc_xenballooned_pages(nr_pages, pages);
>> if (rc) {
>> - pr_warn("%s Couldn't balloon alloc %ld pfns rc:%d\n", __func__,
>> - nr_grant_frames, rc);
>> + pr_warn("%s Couldn't balloon alloc %ld pages rc:%d\n", __func__,
>> + nr_pages, rc);
>> kfree(pages);
>> kfree(pfns);
>> return rc;
>> }
>> - for (i = 0; i < nr_grant_frames; i++)
>> - pfns[i] = page_to_pfn(pages[i]);
>> + for (i = 0; i < nr_grant_frames; i++) {
>> + if ((i % XEN_PFN_PER_PAGE) == 0)
>> + xen_pfn = page_to_xen_pfn(pages[i / XEN_PFN_PER_PAGE]);
>> + pfns[i] = pfn_to_gfn(xen_pfn++);
>> + }
>
> Would it be possible to re-use xen_for_each_gfn? This will avoid
> open-coding the loop to break down the Linux page.
I don't think so. Using xen_acpi_guest_init will require factoring
"pfns[i] = pfn_to_gfn(xen_pfn++)" to a function with parameter pfns[i].
How can we pass pfns[i]?
Thanks,
--
Shannon
[toc] | [prev] | [next] | [standalone]
| From | Julien Grall <julien.grall@arm.com> |
|---|---|
| Date | 2016-03-30 13:30 +0200 |
| Subject | Re: [PATCH v7 03/17] Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn |
| Message-ID | <rimtY-4Cw-7@gated-at.bofh.it> |
| In reply to | #1366959 |
Hi Shannon,
On 30/03/16 08:38, Shannon Zhao wrote:
>
>
> On 2016/3/30 0:28, Julien Grall wrote:
>> On 24/03/16 14:44, Shannon Zhao wrote:
>>> Make xen_xlate_map_ballooned_pages work with 64K pages. In that case
>>> Kernel pages are 64K in size but Xen pages remain 4K in size. Xen pfns
>>> refer to 4K pages.
>>>
>>> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
>>> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>>> ---
>>> drivers/xen/xlate_mmu.c | 26 ++++++++++++++++----------
>>> 1 file changed, 16 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/drivers/xen/xlate_mmu.c b/drivers/xen/xlate_mmu.c
>>> index 9692656..28f728b 100644
>>> --- a/drivers/xen/xlate_mmu.c
>>> +++ b/drivers/xen/xlate_mmu.c
>>> @@ -207,9 +207,12 @@ int __init
>>> xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
>>> void *vaddr;
>>> int rc;
>>> unsigned int i;
>>> + unsigned long nr_pages;
>>> + xen_pfn_t xen_pfn = 0;
>>>
>>> BUG_ON(nr_grant_frames == 0);
>>> - pages = kcalloc(nr_grant_frames, sizeof(pages[0]), GFP_KERNEL);
>>> + nr_pages = DIV_ROUND_UP(nr_grant_frames, XEN_PFN_PER_PAGE);
>>> + pages = kcalloc(nr_pages, sizeof(pages[0]), GFP_KERNEL);
>>> if (!pages)
>>> return -ENOMEM;
>>>
>>> @@ -218,22 +221,25 @@ int __init
>>> xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
>>> kfree(pages);
>>> return -ENOMEM;
>>> }
>>> - rc = alloc_xenballooned_pages(nr_grant_frames, pages);
>>> + rc = alloc_xenballooned_pages(nr_pages, pages);
>>> if (rc) {
>>> - pr_warn("%s Couldn't balloon alloc %ld pfns rc:%d\n", __func__,
>>> - nr_grant_frames, rc);
>>> + pr_warn("%s Couldn't balloon alloc %ld pages rc:%d\n", __func__,
>>> + nr_pages, rc);
>>> kfree(pages);
>>> kfree(pfns);
>>> return rc;
>>> }
>>> - for (i = 0; i < nr_grant_frames; i++)
>>> - pfns[i] = page_to_pfn(pages[i]);
>>> + for (i = 0; i < nr_grant_frames; i++) {
>>> + if ((i % XEN_PFN_PER_PAGE) == 0)
>>> + xen_pfn = page_to_xen_pfn(pages[i / XEN_PFN_PER_PAGE]);
>>> + pfns[i] = pfn_to_gfn(xen_pfn++);
>>> + }
>>
>> Would it be possible to re-use xen_for_each_gfn? This will avoid
>> open-coding the loop to break down the Linux page.
> I don't think so. Using xen_acpi_guest_init will require factoring
> "pfns[i] = pfn_to_gfn(xen_pfn++)" to a function with parameter pfns[i].
> How can we pass pfns[i]?
By using the variable data. Something along those lines:
struct map_balloon_pages
{
xen_pfn_t *pfns;
unsigned int idx;
};
static void setup_balloon_gfn(unsigned long gfn, void *data)
{
struct map_balloon_pages *info = data;
data->pfns[data->idx] = gfn;
data->idx++;
}
And then in xen_xlate_map_ballooned_pages
xen_for_each_gfn(pages, nr_grant_frames, setup_balloon_gfn, &data);
Regards,
--
Julien Grall
[toc] | [prev] | [next] | [standalone]
| From | Shannon Zhao <shannon.zhao@linaro.org> |
|---|---|
| Date | 2016-03-30 14:50 +0200 |
| Subject | Re: [PATCH v7 03/17] Xen: xlate: Use page_to_xen_pfn instead of page_to_pfn |
| Message-ID | <rinJo-5qT-17@gated-at.bofh.it> |
| In reply to | #1367113 |
On 2016年03月30日 19:22, Julien Grall wrote:
> Hi Shannon,
>
> On 30/03/16 08:38, Shannon Zhao wrote:
>>
>>
>> On 2016/3/30 0:28, Julien Grall wrote:
>>> On 24/03/16 14:44, Shannon Zhao wrote:
>>>> Make xen_xlate_map_ballooned_pages work with 64K pages. In that case
>>>> Kernel pages are 64K in size but Xen pages remain 4K in size. Xen pfns
>>>> refer to 4K pages.
>>>>
>>>> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
>>>> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>>>> ---
>>>> drivers/xen/xlate_mmu.c | 26 ++++++++++++++++----------
>>>> 1 file changed, 16 insertions(+), 10 deletions(-)
>>>>
>>>> diff --git a/drivers/xen/xlate_mmu.c b/drivers/xen/xlate_mmu.c
>>>> index 9692656..28f728b 100644
>>>> --- a/drivers/xen/xlate_mmu.c
>>>> +++ b/drivers/xen/xlate_mmu.c
>>>> @@ -207,9 +207,12 @@ int __init
>>>> xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
>>>> void *vaddr;
>>>> int rc;
>>>> unsigned int i;
>>>> + unsigned long nr_pages;
>>>> + xen_pfn_t xen_pfn = 0;
>>>>
>>>> BUG_ON(nr_grant_frames == 0);
>>>> - pages = kcalloc(nr_grant_frames, sizeof(pages[0]), GFP_KERNEL);
>>>> + nr_pages = DIV_ROUND_UP(nr_grant_frames, XEN_PFN_PER_PAGE);
>>>> + pages = kcalloc(nr_pages, sizeof(pages[0]), GFP_KERNEL);
>>>> if (!pages)
>>>> return -ENOMEM;
>>>>
>>>> @@ -218,22 +221,25 @@ int __init
>>>> xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
>>>> kfree(pages);
>>>> return -ENOMEM;
>>>> }
>>>> - rc = alloc_xenballooned_pages(nr_grant_frames, pages);
>>>> + rc = alloc_xenballooned_pages(nr_pages, pages);
>>>> if (rc) {
>>>> - pr_warn("%s Couldn't balloon alloc %ld pfns rc:%d\n",
>>>> __func__,
>>>> - nr_grant_frames, rc);
>>>> + pr_warn("%s Couldn't balloon alloc %ld pages rc:%d\n",
>>>> __func__,
>>>> + nr_pages, rc);
>>>> kfree(pages);
>>>> kfree(pfns);
>>>> return rc;
>>>> }
>>>> - for (i = 0; i < nr_grant_frames; i++)
>>>> - pfns[i] = page_to_pfn(pages[i]);
>>>> + for (i = 0; i < nr_grant_frames; i++) {
>>>> + if ((i % XEN_PFN_PER_PAGE) == 0)
>>>> + xen_pfn = page_to_xen_pfn(pages[i / XEN_PFN_PER_PAGE]);
>>>> + pfns[i] = pfn_to_gfn(xen_pfn++);
>>>> + }
>>>
>>> Would it be possible to re-use xen_for_each_gfn? This will avoid
>>> open-coding the loop to break down the Linux page.
>> I don't think so. Using xen_acpi_guest_init will require factoring
>> "pfns[i] = pfn_to_gfn(xen_pfn++)" to a function with parameter pfns[i].
>> How can we pass pfns[i]?
>
> By using the variable data. Something along those lines:
>
> struct map_balloon_pages
> {
> xen_pfn_t *pfns;
> unsigned int idx;
> };
>
> static void setup_balloon_gfn(unsigned long gfn, void *data)
> {
> struct map_balloon_pages *info = data;
>
>
> data->pfns[data->idx] = gfn;
> data->idx++;
> }
>
> And then in xen_xlate_map_ballooned_pages
>
> xen_for_each_gfn(pages, nr_grant_frames, setup_balloon_gfn, &data);
I think this looks like less direct. Anyway I will update this patch as
you said.
Thanks,
--
Shannon
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web