From 07d0c943663f82d9682856c0a7db7145a6c911d6 Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Tue, 19 Feb 2013 22:00:58 -0500 Subject: xen: implement updated XENMEM_add_to_physmap_range ABI Allows for more fine grained error reporting. Only used by PVH and ARM both of which are marked EXPERIMENTAL precisely because the ABI is not yet stable Signed-off-by: Ian Campbell [v1: Rebased without PVH patches] Signed-off-by: Konrad Rzeszutek Wilk --- include/xen/interface/memory.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'include') diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h index b40a4315cb8b..2ecfe4f700d9 100644 --- a/include/xen/interface/memory.h +++ b/include/xen/interface/memory.h @@ -190,6 +190,7 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_add_to_physmap); #define XENMEM_add_to_physmap_range 23 struct xen_add_to_physmap_range { + /* IN */ /* Which domain to change the mapping for. */ domid_t domid; uint16_t space; /* => enum phys_map_space */ @@ -203,6 +204,11 @@ struct xen_add_to_physmap_range { /* GPFN in domid where the source mapping page should appear. */ GUEST_HANDLE(xen_pfn_t) gpfns; + + /* OUT */ + + /* Per index error code. */ + GUEST_HANDLE(int) errs; }; DEFINE_GUEST_HANDLE_STRUCT(xen_add_to_physmap_range); -- cgit v1.2.2 From dcb93b96cec723783a81e8cac7df62feaf964792 Mon Sep 17 00:00:00 2001 From: Liu Jinsong Date: Thu, 24 Jan 2013 20:16:59 +0800 Subject: xen/stub: driver for memory hotplug This patch create a file (xen-stub.c) for Xen stub drivers. Xen stub drivers are used to reserve space for Xen drivers, i.e. memory hotplug and cpu hotplug, and to block native drivers loaded, so that real Xen drivers can be modular and loaded on demand. This patch is specific for Xen memory hotplug (other Xen logic can add stub drivers on their own). The xen stub driver will occupied earlier via subsys_initcall (than native memory hotplug driver via module_init and so blocking native). Later real Xen memory hotplug logic will unregister the stub driver and register itself to take effect on demand. Signed-off-by: Liu Jinsong Signed-off-by: Konrad Rzeszutek Wilk --- include/xen/acpi.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'include') diff --git a/include/xen/acpi.h b/include/xen/acpi.h index 48a9c0171b65..ce7e5264b320 100644 --- a/include/xen/acpi.h +++ b/include/xen/acpi.h @@ -40,6 +40,13 @@ #include #include +#define ACPI_MEMORY_DEVICE_CLASS "memory" +#define ACPI_MEMORY_DEVICE_HID "PNP0C80" +#define ACPI_MEMORY_DEVICE_NAME "Hotplug Mem Device" + +int xen_stub_memory_device_init(void); +void xen_stub_memory_device_exit(void); + int xen_acpi_notify_hypervisor_state(u8 sleep_state, u32 pm1a_cnt, u32 pm1b_cnd); -- cgit v1.2.2 From ef92e7caf9901884f19fdeb4d7a24333b33c5f37 Mon Sep 17 00:00:00 2001 From: Liu Jinsong Date: Thu, 24 Jan 2013 20:19:47 +0800 Subject: xen/acpi: ACPI memory hotplug This patch implements real Xen acpi memory hotplug driver as module. When loaded, it replaces Xen stub driver. When an acpi memory device hotadd event occurs, it notifies OS and invokes notification callback, adding related memory device and parsing memory information, finally hypercall to xen hypervisor to add memory. Signed-off-by: Liu Jinsong Signed-off-by: Konrad Rzeszutek Wilk --- include/xen/interface/platform.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h index 5e36932ab407..2c4fb4bb07df 100644 --- a/include/xen/interface/platform.h +++ b/include/xen/interface/platform.h @@ -324,10 +324,14 @@ struct xenpf_cpu_ol { }; DEFINE_GUEST_HANDLE_STRUCT(xenpf_cpu_ol); -/* - * CMD 58 and 59 are reserved for cpu hotadd and memory hotadd, - * which are already occupied at Xen hypervisor side. - */ +#define XENPF_mem_hotadd 59 +struct xenpf_mem_hotadd { + uint64_t spfn; + uint64_t epfn; + uint32_t pxm; + uint32_t flags; +}; + #define XENPF_core_parking 60 struct xenpf_core_parking { /* IN variables */ @@ -357,6 +361,7 @@ struct xen_platform_op { struct xenpf_set_processor_pminfo set_pminfo; struct xenpf_pcpuinfo pcpu_info; struct xenpf_cpu_ol cpu_ol; + struct xenpf_mem_hotadd mem_add; struct xenpf_core_parking core_parking; uint8_t pad[128]; } u; -- cgit v1.2.2 From b22ff77b82598ff131d215627533e09e4a472220 Mon Sep 17 00:00:00 2001 From: Liu Jinsong Date: Thu, 24 Jan 2013 22:12:30 +0800 Subject: xen/stub: driver for CPU hotplug Add Xen stub driver for CPU hotplug, early occupy to block native, will be replaced later by real Xen processor driver module. Signed-off-by: Liu Jinsong Signed-off-by: Konrad Rzeszutek Wilk --- include/xen/acpi.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'include') diff --git a/include/xen/acpi.h b/include/xen/acpi.h index ce7e5264b320..2b3103b33725 100644 --- a/include/xen/acpi.h +++ b/include/xen/acpi.h @@ -47,6 +47,13 @@ int xen_stub_memory_device_init(void); void xen_stub_memory_device_exit(void); +#define ACPI_PROCESSOR_CLASS "processor" +#define ACPI_PROCESSOR_DEVICE_HID "ACPI0007" +#define ACPI_PROCESSOR_DEVICE_NAME "Processor" + +int xen_stub_processor_init(void); +void xen_stub_processor_exit(void); + int xen_acpi_notify_hypervisor_state(u8 sleep_state, u32 pm1a_cnt, u32 pm1b_cnd); -- cgit v1.2.2 From 40a58637a4fa10a2faea71f0f30ff0b3d74c6e00 Mon Sep 17 00:00:00 2001 From: Liu Jinsong Date: Fri, 25 Jan 2013 15:42:31 +0800 Subject: xen/acpi: Move xen_acpi_get_pxm to Xen's acpi.h So that it could be reused by Xen CPU hotplug logic. Signed-off-by: Liu, Jinsong Signed-off-by: Konrad Rzeszutek Wilk --- include/xen/acpi.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'include') diff --git a/include/xen/acpi.h b/include/xen/acpi.h index 2b3103b33725..dc69c91605b8 100644 --- a/include/xen/acpi.h +++ b/include/xen/acpi.h @@ -69,4 +69,22 @@ static inline void xen_acpi_sleep_register(void) } #endif +static inline int xen_acpi_get_pxm(acpi_handle h) +{ + unsigned long long pxm; + acpi_status status; + acpi_handle handle; + acpi_handle phandle = h; + + do { + handle = phandle; + status = acpi_evaluate_integer(handle, "_PXM", NULL, &pxm); + if (ACPI_SUCCESS(status)) + return pxm; + status = acpi_get_parent(handle, &phandle); + } while (ACPI_SUCCESS(status)); + + return -ENXIO; +} + #endif /* _XEN_ACPI_H */ -- cgit v1.2.2 From 39adc483d378f79711f291539f20e3797337892d Mon Sep 17 00:00:00 2001 From: Liu Jinsong Date: Fri, 25 Jan 2013 15:43:34 +0800 Subject: xen/acpi: ACPI cpu hotplug This patch implement real Xen ACPI cpu hotplug driver as module. When loaded, it replaces Xen stub driver. For booting existed cpus, the driver enumerates them. For hotadded cpus, which added at runtime and notify OS via device or container event, the driver is invoked to add them, parsing cpu information, hypercalling to Xen hypervisor to add them, and finally setting up new /sys interface for them. Signed-off-by: Liu Jinsong Signed-off-by: Konrad Rzeszutek Wilk --- include/xen/acpi.h | 3 +++ include/xen/interface/platform.h | 8 ++++++++ 2 files changed, 11 insertions(+) (limited to 'include') diff --git a/include/xen/acpi.h b/include/xen/acpi.h index dc69c91605b8..c962d5f5b38b 100644 --- a/include/xen/acpi.h +++ b/include/xen/acpi.h @@ -54,6 +54,9 @@ void xen_stub_memory_device_exit(void); int xen_stub_processor_init(void); void xen_stub_processor_exit(void); +void xen_pcpu_hotplug_sync(void); +int xen_pcpu_id(uint32_t acpi_id); + int xen_acpi_notify_hypervisor_state(u8 sleep_state, u32 pm1a_cnt, u32 pm1b_cnd); diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h index 2c4fb4bb07df..c57d5f67f702 100644 --- a/include/xen/interface/platform.h +++ b/include/xen/interface/platform.h @@ -324,6 +324,13 @@ struct xenpf_cpu_ol { }; DEFINE_GUEST_HANDLE_STRUCT(xenpf_cpu_ol); +#define XENPF_cpu_hotadd 58 +struct xenpf_cpu_hotadd { + uint32_t apic_id; + uint32_t acpi_id; + uint32_t pxm; +}; + #define XENPF_mem_hotadd 59 struct xenpf_mem_hotadd { uint64_t spfn; @@ -361,6 +368,7 @@ struct xen_platform_op { struct xenpf_set_processor_pminfo set_pminfo; struct xenpf_pcpuinfo pcpu_info; struct xenpf_cpu_ol cpu_ol; + struct xenpf_cpu_hotadd cpu_add; struct xenpf_mem_hotadd mem_add; struct xenpf_core_parking core_parking; uint8_t pad[128]; -- cgit v1.2.2 From 268a207563f933ff8e3d876866c324b4247f234e Mon Sep 17 00:00:00 2001 From: Liu Jinsong Date: Thu, 14 Feb 2013 15:46:26 +0800 Subject: xen/acpi: move xen_acpi_get_pxm under CONFIG_XEN_DOM0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To avoid compile issue and it's meanigfull only under CONFIG_XEN_DOM0. In file included from linux/arch/x86/xen/enlighten.c:47:0: linux/include/xen/acpi.h:75:76: error: unknown type name ‘acpi_handle’ make[3]: *** [arch/x86/xen/enlighten.o] Error 1 Signed-off-by: Liu Jinsong [v1: Fixed spelling mistakes] Signed-off-by: Konrad Rzeszutek Wilk --- include/xen/acpi.h | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'include') diff --git a/include/xen/acpi.h b/include/xen/acpi.h index c962d5f5b38b..68d73d09b770 100644 --- a/include/xen/acpi.h +++ b/include/xen/acpi.h @@ -57,21 +57,6 @@ void xen_stub_processor_exit(void); void xen_pcpu_hotplug_sync(void); int xen_pcpu_id(uint32_t acpi_id); -int xen_acpi_notify_hypervisor_state(u8 sleep_state, - u32 pm1a_cnt, u32 pm1b_cnd); - -static inline void xen_acpi_sleep_register(void) -{ - if (xen_initial_domain()) - acpi_os_set_prepare_sleep( - &xen_acpi_notify_hypervisor_state); -} -#else -static inline void xen_acpi_sleep_register(void) -{ -} -#endif - static inline int xen_acpi_get_pxm(acpi_handle h) { unsigned long long pxm; @@ -90,4 +75,19 @@ static inline int xen_acpi_get_pxm(acpi_handle h) return -ENXIO; } +int xen_acpi_notify_hypervisor_state(u8 sleep_state, + u32 pm1a_cnt, u32 pm1b_cnd); + +static inline void xen_acpi_sleep_register(void) +{ + if (xen_initial_domain()) + acpi_os_set_prepare_sleep( + &xen_acpi_notify_hypervisor_state); +} +#else +static inline void xen_acpi_sleep_register(void) +{ +} +#endif + #endif /* _XEN_ACPI_H */ -- cgit v1.2.2 From c81611c4e96f595a80d8be9367c385d2c116428b Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Wed, 20 Feb 2013 11:48:06 +0000 Subject: xen: event channel arrays are xen_ulong_t and not unsigned long On ARM we want these to be the same size on 32- and 64-bit. This is an ABI change on ARM. X86 does not change. Signed-off-by: Ian Campbell Cc: Jan Beulich Cc: Keir (Xen.org) Cc: Tim Deegan Cc: Stefano Stabellini Cc: linux-arm-kernel@lists.infradead.org Cc: xen-devel@lists.xen.org Cc: Konrad Rzeszutek Wilk Signed-off-by: Konrad Rzeszutek Wilk --- include/xen/interface/xen.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h index 886a5d80a18f..53ec4167bd0b 100644 --- a/include/xen/interface/xen.h +++ b/include/xen/interface/xen.h @@ -285,7 +285,7 @@ DEFINE_GUEST_HANDLE_STRUCT(multicall_entry); * Event channel endpoints per domain: * 1024 if a long is 32 bits; 4096 if a long is 64 bits. */ -#define NR_EVENT_CHANNELS (sizeof(unsigned long) * sizeof(unsigned long) * 64) +#define NR_EVENT_CHANNELS (sizeof(xen_ulong_t) * sizeof(xen_ulong_t) * 64) struct vcpu_time_info { /* @@ -341,7 +341,7 @@ struct vcpu_info { */ uint8_t evtchn_upcall_pending; uint8_t evtchn_upcall_mask; - unsigned long evtchn_pending_sel; + xen_ulong_t evtchn_pending_sel; struct arch_vcpu_info arch; struct pvclock_vcpu_time_info time; }; /* 64 bytes (x86) */ @@ -384,8 +384,8 @@ struct shared_info { * per-vcpu selector word to be set. Each bit in the selector covers a * 'C long' in the PENDING bitfield array. */ - unsigned long evtchn_pending[sizeof(unsigned long) * 8]; - unsigned long evtchn_mask[sizeof(unsigned long) * 8]; + xen_ulong_t evtchn_pending[sizeof(xen_ulong_t) * 8]; + xen_ulong_t evtchn_mask[sizeof(xen_ulong_t) * 8]; /* * Wallclock time: updated only by control software. Guests should base -- cgit v1.2.2