Skip to content

Commit 051089a

Browse files
committed
Merge tag 'for-linus-4.15-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip
Pull xen updates from Juergen Gross: "Xen features and fixes for v4.15-rc1 Apart from several small fixes it contains the following features: - a series by Joao Martins to add vdso support of the pv clock interface - a series by Juergen Gross to add support for Xen pv guests to be able to run on 5 level paging hosts - a series by Stefano Stabellini adding the Xen pvcalls frontend driver using a paravirtualized socket interface" * tag 'for-linus-4.15-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip: (34 commits) xen/pvcalls: fix potential endless loop in pvcalls-front.c xen/pvcalls: Add MODULE_LICENSE() MAINTAINERS: xen, kvm: track pvclock-abi.h changes x86/xen/time: setup vcpu 0 time info page x86/xen/time: set pvclock flags on xen_time_init() x86/pvclock: add setter for pvclock_pvti_cpu0_va ptp_kvm: probe for kvm guest availability xen/privcmd: remove unused variable pageidx xen: select grant interface version xen: update arch/x86/include/asm/xen/cpuid.h xen: add grant interface version dependent constants to gnttab_ops xen: limit grant v2 interface to the v1 functionality xen: re-introduce support for grant v2 interface xen: support priv-mapping in an HVM tools domain xen/pvcalls: remove redundant check for irq >= 0 xen/pvcalls: fix unsigned less than zero error check xen/time: Return -ENODEV from xen_get_wallclock() xen/pvcalls-front: mark expected switch fall-through xen: xenbus_probe_frontend: mark expected switch fall-throughs xen/time: do not decrease steal time after live migration on xen ...
2 parents 974aa56 + 646d944 commit 051089a

28 files changed

+1941
-75
lines changed

MAINTAINERS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7650,6 +7650,7 @@ S: Supported
76507650
F: arch/x86/kvm/
76517651
F: arch/x86/include/uapi/asm/kvm*
76527652
F: arch/x86/include/asm/kvm*
7653+
F: arch/x86/include/asm/pvclock-abi.h
76537654
F: arch/x86/kernel/kvm.c
76547655
F: arch/x86/kernel/kvmclock.c
76557656

@@ -14838,6 +14839,7 @@ F: arch/x86/xen/
1483814839
F: drivers/*/xen-*front.c
1483914840
F: drivers/xen/
1484014841
F: arch/x86/include/asm/xen/
14842+
F: arch/x86/include/asm/pvclock-abi.h
1484114843
F: include/xen/
1484214844
F: include/uapi/xen/
1484314845
F: Documentation/ABI/stable/sysfs-hypervisor-xen

arch/arm/xen/grant-table.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,14 @@ void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)
4545
return;
4646
}
4747

48-
int arch_gnttab_init(unsigned long nr_shared)
48+
int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
49+
unsigned long max_nr_gframes,
50+
grant_status_t **__shared)
51+
{
52+
return -ENOSYS;
53+
}
54+
55+
int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status)
4956
{
5057
return 0;
5158
}

arch/x86/entry/vdso/vma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ static int vvar_fault(const struct vm_special_mapping *sm,
112112
__pa_symbol(&__vvar_page) >> PAGE_SHIFT);
113113
} else if (sym_offset == image->sym_pvclock_page) {
114114
struct pvclock_vsyscall_time_info *pvti =
115-
pvclock_pvti_cpu0_va();
115+
pvclock_get_pvti_cpu0_va();
116116
if (pvti && vclock_was_used(VCLOCK_PVCLOCK)) {
117117
ret = vm_insert_pfn_prot(
118118
vma,

arch/x86/include/asm/pvclock.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,6 @@
55
#include <linux/clocksource.h>
66
#include <asm/pvclock-abi.h>
77

8-
#ifdef CONFIG_KVM_GUEST
9-
extern struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void);
10-
#else
11-
static inline struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void)
12-
{
13-
return NULL;
14-
}
15-
#endif
16-
178
/* some helper functions for xen and kvm pv clock sources */
189
u64 pvclock_clocksource_read(struct pvclock_vcpu_time_info *src);
1910
u8 pvclock_read_flags(struct pvclock_vcpu_time_info *src);
@@ -102,4 +93,14 @@ struct pvclock_vsyscall_time_info {
10293

10394
#define PVTI_SIZE sizeof(struct pvclock_vsyscall_time_info)
10495

96+
#ifdef CONFIG_PARAVIRT_CLOCK
97+
void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti);
98+
struct pvclock_vsyscall_time_info *pvclock_get_pvti_cpu0_va(void);
99+
#else
100+
static inline struct pvclock_vsyscall_time_info *pvclock_get_pvti_cpu0_va(void)
101+
{
102+
return NULL;
103+
}
104+
#endif
105+
105106
#endif /* _ASM_X86_PVCLOCK_H */

arch/x86/include/asm/xen/cpuid.h

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,22 +73,44 @@
7373
#define _XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD 0
7474
#define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD (1u<<0)
7575

76+
/*
77+
* Leaf 4 (0x40000x03)
78+
* Sub-leaf 0: EAX: bit 0: emulated tsc
79+
* bit 1: host tsc is known to be reliable
80+
* bit 2: RDTSCP instruction available
81+
* EBX: tsc_mode: 0=default (emulate if necessary), 1=emulate,
82+
* 2=no emulation, 3=no emulation + TSC_AUX support
83+
* ECX: guest tsc frequency in kHz
84+
* EDX: guest tsc incarnation (migration count)
85+
* Sub-leaf 1: EAX: tsc offset low part
86+
* EBX: tsc offset high part
87+
* ECX: multiplicator for tsc->ns conversion
88+
* EDX: shift amount for tsc->ns conversion
89+
* Sub-leaf 2: EAX: host tsc frequency in kHz
90+
*/
91+
7692
/*
7793
* Leaf 5 (0x40000x04)
7894
* HVM-specific features
79-
* EAX: Features
80-
* EBX: vcpu id (iff EAX has XEN_HVM_CPUID_VCPU_ID_PRESENT flag)
95+
* Sub-leaf 0: EAX: Features
96+
* Sub-leaf 0: EBX: vcpu id (iff EAX has XEN_HVM_CPUID_VCPU_ID_PRESENT flag)
8197
*/
82-
83-
/* Virtualized APIC registers */
84-
#define XEN_HVM_CPUID_APIC_ACCESS_VIRT (1u << 0)
85-
/* Virtualized x2APIC accesses */
86-
#define XEN_HVM_CPUID_X2APIC_VIRT (1u << 1)
98+
#define XEN_HVM_CPUID_APIC_ACCESS_VIRT (1u << 0) /* Virtualized APIC registers */
99+
#define XEN_HVM_CPUID_X2APIC_VIRT (1u << 1) /* Virtualized x2APIC accesses */
87100
/* Memory mapped from other domains has valid IOMMU entries */
88101
#define XEN_HVM_CPUID_IOMMU_MAPPINGS (1u << 2)
89-
/* vcpu id is present in EBX */
90-
#define XEN_HVM_CPUID_VCPU_ID_PRESENT (1u << 3)
102+
#define XEN_HVM_CPUID_VCPU_ID_PRESENT (1u << 3) /* vcpu id is present in EBX */
103+
104+
/*
105+
* Leaf 6 (0x40000x05)
106+
* PV-specific parameters
107+
* Sub-leaf 0: EAX: max available sub-leaf
108+
* Sub-leaf 0: EBX: bits 0-7: max machine address width
109+
*/
110+
111+
/* Max. address width in bits taking memory hotplug into account. */
112+
#define XEN_CPUID_MACHINE_ADDRESS_WIDTH_MASK (0xffu << 0)
91113

92-
#define XEN_CPUID_MAX_NUM_LEAVES 4
114+
#define XEN_CPUID_MAX_NUM_LEAVES 5
93115

94116
#endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */

arch/x86/include/asm/xen/page.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ typedef struct xpaddr {
2727
phys_addr_t paddr;
2828
} xpaddr_t;
2929

30+
#ifdef CONFIG_X86_64
31+
#define XEN_PHYSICAL_MASK __sme_clr((1UL << 52) - 1)
32+
#else
33+
#define XEN_PHYSICAL_MASK __PHYSICAL_MASK
34+
#endif
35+
36+
#define XEN_PTE_MFN_MASK ((pteval_t)(((signed long)PAGE_MASK) & \
37+
XEN_PHYSICAL_MASK))
38+
3039
#define XMADDR(x) ((xmaddr_t) { .maddr = (x) })
3140
#define XPADDR(x) ((xpaddr_t) { .paddr = (x) })
3241

@@ -278,7 +287,7 @@ static inline unsigned long bfn_to_local_pfn(unsigned long mfn)
278287

279288
static inline unsigned long pte_mfn(pte_t pte)
280289
{
281-
return (pte.pte & PTE_PFN_MASK) >> PAGE_SHIFT;
290+
return (pte.pte & XEN_PTE_MFN_MASK) >> PAGE_SHIFT;
282291
}
283292

284293
static inline pte_t mfn_pte(unsigned long page_nr, pgprot_t pgprot)

arch/x86/kernel/kvmclock.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,6 @@ early_param("no-kvmclock", parse_no_kvmclock);
4848
static struct pvclock_vsyscall_time_info *hv_clock;
4949
static struct pvclock_wall_clock *wall_clock;
5050

51-
struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va(void)
52-
{
53-
return hv_clock;
54-
}
55-
EXPORT_SYMBOL_GPL(pvclock_pvti_cpu0_va);
56-
5751
/*
5852
* The wallclock is the time of day when we booted. Since then, some time may
5953
* have elapsed since the hypervisor wrote the data. So we try to account for
@@ -377,6 +371,7 @@ int __init kvm_setup_vsyscall_timeinfo(void)
377371
return 1;
378372
}
379373

374+
pvclock_set_pvti_cpu0_va(hv_clock);
380375
put_cpu();
381376

382377
kvm_clock.archdata.vclock_mode = VCLOCK_PVCLOCK;

arch/x86/kernel/pvclock.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@
2525

2626
#include <asm/fixmap.h>
2727
#include <asm/pvclock.h>
28+
#include <asm/vgtod.h>
2829

2930
static u8 valid_flags __read_mostly = 0;
31+
static struct pvclock_vsyscall_time_info *pvti_cpu0_va __read_mostly;
3032

3133
void pvclock_set_flags(u8 flags)
3234
{
@@ -144,3 +146,15 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock,
144146

145147
set_normalized_timespec(ts, now.tv_sec, now.tv_nsec);
146148
}
149+
150+
void pvclock_set_pvti_cpu0_va(struct pvclock_vsyscall_time_info *pvti)
151+
{
152+
WARN_ON(vclock_was_used(VCLOCK_PVCLOCK));
153+
pvti_cpu0_va = pvti;
154+
}
155+
156+
struct pvclock_vsyscall_time_info *pvclock_get_pvti_cpu0_va(void)
157+
{
158+
return pvti_cpu0_va;
159+
}
160+
EXPORT_SYMBOL_GPL(pvclock_get_pvti_cpu0_va);

arch/x86/xen/grant-table.c

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
static struct gnttab_vm_area {
5050
struct vm_struct *area;
5151
pte_t **ptes;
52-
} gnttab_shared_vm_area;
52+
} gnttab_shared_vm_area, gnttab_status_vm_area;
5353

5454
int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
5555
unsigned long max_nr_gframes,
@@ -73,16 +73,43 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
7373
return 0;
7474
}
7575

76+
int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
77+
unsigned long max_nr_gframes,
78+
grant_status_t **__shared)
79+
{
80+
grant_status_t *shared = *__shared;
81+
unsigned long addr;
82+
unsigned long i;
83+
84+
if (shared == NULL)
85+
*__shared = shared = gnttab_status_vm_area.area->addr;
86+
87+
addr = (unsigned long)shared;
88+
89+
for (i = 0; i < nr_gframes; i++) {
90+
set_pte_at(&init_mm, addr, gnttab_status_vm_area.ptes[i],
91+
mfn_pte(frames[i], PAGE_KERNEL));
92+
addr += PAGE_SIZE;
93+
}
94+
95+
return 0;
96+
}
97+
7698
void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)
7799
{
100+
pte_t **ptes;
78101
unsigned long addr;
79102
unsigned long i;
80103

104+
if (shared == gnttab_status_vm_area.area->addr)
105+
ptes = gnttab_status_vm_area.ptes;
106+
else
107+
ptes = gnttab_shared_vm_area.ptes;
108+
81109
addr = (unsigned long)shared;
82110

83111
for (i = 0; i < nr_gframes; i++) {
84-
set_pte_at(&init_mm, addr, gnttab_shared_vm_area.ptes[i],
85-
__pte(0));
112+
set_pte_at(&init_mm, addr, ptes[i], __pte(0));
86113
addr += PAGE_SIZE;
87114
}
88115
}
@@ -102,12 +129,35 @@ static int arch_gnttab_valloc(struct gnttab_vm_area *area, unsigned nr_frames)
102129
return 0;
103130
}
104131

105-
int arch_gnttab_init(unsigned long nr_shared)
132+
static void arch_gnttab_vfree(struct gnttab_vm_area *area)
106133
{
134+
free_vm_area(area->area);
135+
kfree(area->ptes);
136+
}
137+
138+
int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status)
139+
{
140+
int ret;
141+
107142
if (!xen_pv_domain())
108143
return 0;
109144

110-
return arch_gnttab_valloc(&gnttab_shared_vm_area, nr_shared);
145+
ret = arch_gnttab_valloc(&gnttab_shared_vm_area, nr_shared);
146+
if (ret < 0)
147+
return ret;
148+
149+
/*
150+
* Always allocate the space for the status frames in case
151+
* we're migrated to a host with V2 support.
152+
*/
153+
ret = arch_gnttab_valloc(&gnttab_status_vm_area, nr_status);
154+
if (ret < 0)
155+
goto err;
156+
157+
return 0;
158+
err:
159+
arch_gnttab_vfree(&gnttab_shared_vm_area);
160+
return -ENOMEM;
111161
}
112162

113163
#ifdef CONFIG_XEN_PVH

arch/x86/xen/mmu.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ int xen_remap_domain_gfn_range(struct vm_area_struct *vma,
172172
pgprot_t prot, unsigned domid,
173173
struct page **pages)
174174
{
175+
if (xen_feature(XENFEAT_auto_translated_physmap))
176+
return -EOPNOTSUPP;
177+
175178
return do_remap_gfn(vma, addr, &gfn, nr, NULL, prot, domid, pages);
176179
}
177180
EXPORT_SYMBOL_GPL(xen_remap_domain_gfn_range);
@@ -182,6 +185,10 @@ int xen_remap_domain_gfn_array(struct vm_area_struct *vma,
182185
int *err_ptr, pgprot_t prot,
183186
unsigned domid, struct page **pages)
184187
{
188+
if (xen_feature(XENFEAT_auto_translated_physmap))
189+
return xen_xlate_remap_gfn_array(vma, addr, gfn, nr, err_ptr,
190+
prot, domid, pages);
191+
185192
/* We BUG_ON because it's a programmer error to pass a NULL err_ptr,
186193
* and the consequences later is quite hard to detect what the actual
187194
* cause of "wrong memory was mapped in".
@@ -193,9 +200,12 @@ EXPORT_SYMBOL_GPL(xen_remap_domain_gfn_array);
193200

194201
/* Returns: 0 success */
195202
int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
196-
int numpgs, struct page **pages)
203+
int nr, struct page **pages)
197204
{
198-
if (!pages || !xen_feature(XENFEAT_auto_translated_physmap))
205+
if (xen_feature(XENFEAT_auto_translated_physmap))
206+
return xen_xlate_unmap_gfn_range(vma, nr, pages);
207+
208+
if (!pages)
199209
return 0;
200210

201211
return -EINVAL;

arch/x86/xen/mmu_pv.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr,
315315
static pteval_t pte_mfn_to_pfn(pteval_t val)
316316
{
317317
if (val & _PAGE_PRESENT) {
318-
unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT;
318+
unsigned long mfn = (val & XEN_PTE_MFN_MASK) >> PAGE_SHIFT;
319319
unsigned long pfn = mfn_to_pfn(mfn);
320320

321321
pteval_t flags = val & PTE_FLAGS_MASK;
@@ -1721,7 +1721,7 @@ static unsigned long __init m2p(phys_addr_t maddr)
17211721
{
17221722
phys_addr_t paddr;
17231723

1724-
maddr &= PTE_PFN_MASK;
1724+
maddr &= XEN_PTE_MFN_MASK;
17251725
paddr = mfn_to_pfn(maddr >> PAGE_SHIFT) << PAGE_SHIFT;
17261726

17271727
return paddr;

arch/x86/xen/suspend.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
void xen_arch_pre_suspend(void)
1919
{
20+
xen_save_time_memory_area();
21+
2022
if (xen_pv_domain())
2123
xen_pv_pre_suspend();
2224
}
@@ -27,6 +29,8 @@ void xen_arch_post_suspend(int cancelled)
2729
xen_pv_post_suspend(cancelled);
2830
else
2931
xen_hvm_post_suspend(cancelled);
32+
33+
xen_restore_time_memory_area();
3034
}
3135

3236
static void xen_vcpu_notify_restore(void *data)

0 commit comments

Comments
 (0)