Merge tag 'stable/for-linus-3.7-x86-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen
Pull Xen update from Konrad Rzeszutek Wilk:
"Features:
- When hotplugging PCI devices in a PV guest we can allocate
Xen-SWIOTLB later.
- Cleanup Xen SWIOTLB.
- Support pages out grants from HVM domains in the backends.
- Support wild cards in xen-pciback.hide=(BDF) arguments.
- Update grant status updates with upstream hypervisor.
- Boot PV guests with more than 128GB.
- Cleanup Xen MMU code/add comments.
- Obtain XENVERS using a preferred method.
- Lay out generic changes to support Xen ARM.
- Allow privcmd ioctl for HVM (used to do only PV).
- Do v2 of mmap_batch for privcmd ioctls.
- If hypervisor saves the LED keyboard light - we will now instruct
the kernel about its state.
Fixes:
- More fixes to Xen PCI backend for various calls/FLR/etc.
- With more than 4GB in a 64-bit PV guest disable native SWIOTLB.
- Fix up smatch warnings.
- Fix up various return values in privmcmd and mm."
* tag 'stable/for-linus-3.7-x86-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen: (48 commits)
xen/pciback: Restore the PCI config space after an FLR.
xen-pciback: properly clean up after calling pcistub_device_find()
xen/vga: add the xen EFI video mode support
xen/x86: retrieve keyboard shift status flags from hypervisor.
xen/gndev: Xen backend support for paged out grant targets V4.
xen-pciback: support wild cards in slot specifications
xen/swiotlb: Fix compile warnings when using plain integer instead of NULL pointer.
xen/swiotlb: Remove functions not needed anymore.
xen/pcifront: Use Xen-SWIOTLB when initting if required.
xen/swiotlb: For early initialization, return zero on success.
xen/swiotlb: Use the swiotlb_late_init_with_tbl to init Xen-SWIOTLB late when PV PCI is used.
xen/swiotlb: Move the error strings to its own function.
xen/swiotlb: Move the nr_tbl determination in its own function.
xen/arm: compile and run xenbus
xen: resynchronise grant table status codes with upstream
xen/privcmd: return -EFAULT on error
xen/privcmd: Fix mmap batch ioctl error status copy back.
xen/privcmd: add PRIVCMD_MMAPBATCH_V2 ioctl
xen/mm: return more precise error from xen_remap_domain_range()
xen/mmu: If the revector fails, don't attempt to revector anything else.
...
This commit is contained in:
@@ -190,4 +190,16 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
|
||||
struct gnttab_map_grant_ref *kunmap_ops,
|
||||
struct page **pages, unsigned int count);
|
||||
|
||||
/* Perform a batch of grant map/copy operations. Retry every batch slot
|
||||
* for which the hypervisor returns GNTST_eagain. This is typically due
|
||||
* to paged out target frames.
|
||||
*
|
||||
* Will retry for 1, 2, ... 255 ms, i.e. 256 times during 32 seconds.
|
||||
*
|
||||
* Return value in each iand every status field of the batch guaranteed
|
||||
* to not be GNTST_eagain.
|
||||
*/
|
||||
void gnttab_batch_map(struct gnttab_map_grant_ref *batch, unsigned count);
|
||||
void gnttab_batch_copy(struct gnttab_copy *batch, unsigned count);
|
||||
|
||||
#endif /* __ASM_GNTTAB_H__ */
|
||||
|
||||
@@ -338,7 +338,7 @@ DEFINE_GUEST_HANDLE_STRUCT(gnttab_dump_table);
|
||||
#define GNTTABOP_transfer 4
|
||||
struct gnttab_transfer {
|
||||
/* IN parameters. */
|
||||
unsigned long mfn;
|
||||
xen_pfn_t mfn;
|
||||
domid_t domid;
|
||||
grant_ref_t ref;
|
||||
/* OUT parameters. */
|
||||
@@ -375,7 +375,7 @@ struct gnttab_copy {
|
||||
struct {
|
||||
union {
|
||||
grant_ref_t ref;
|
||||
unsigned long gmfn;
|
||||
xen_pfn_t gmfn;
|
||||
} u;
|
||||
domid_t domid;
|
||||
uint16_t offset;
|
||||
@@ -519,7 +519,9 @@ DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_version);
|
||||
#define GNTST_no_device_space (-7) /* Out of space in I/O MMU. */
|
||||
#define GNTST_permission_denied (-8) /* Not enough privilege for operation. */
|
||||
#define GNTST_bad_page (-9) /* Specified page was invalid for op. */
|
||||
#define GNTST_bad_copy_arg (-10) /* copy arguments cross page boundary */
|
||||
#define GNTST_bad_copy_arg (-10) /* copy arguments cross page boundary. */
|
||||
#define GNTST_address_too_big (-11) /* transfer page address too large. */
|
||||
#define GNTST_eagain (-12) /* Operation not done; try again. */
|
||||
|
||||
#define GNTTABOP_error_msgs { \
|
||||
"okay", \
|
||||
@@ -532,7 +534,9 @@ DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_version);
|
||||
"no spare translation slot in the I/O MMU", \
|
||||
"permission denied", \
|
||||
"bad page", \
|
||||
"copy arguments cross page boundary" \
|
||||
"copy arguments cross page boundary", \
|
||||
"page address size too large", \
|
||||
"operation not done; try again" \
|
||||
}
|
||||
|
||||
#endif /* __XEN_PUBLIC_GRANT_TABLE_H__ */
|
||||
|
||||
@@ -31,7 +31,7 @@ struct xen_memory_reservation {
|
||||
* OUT: GMFN bases of extents that were allocated
|
||||
* (NB. This command also updates the mach_to_phys translation table)
|
||||
*/
|
||||
GUEST_HANDLE(ulong) extent_start;
|
||||
GUEST_HANDLE(xen_pfn_t) extent_start;
|
||||
|
||||
/* Number of extents, and size/alignment of each (2^extent_order pages). */
|
||||
unsigned long nr_extents;
|
||||
@@ -130,7 +130,7 @@ struct xen_machphys_mfn_list {
|
||||
* any large discontiguities in the machine address space, 2MB gaps in
|
||||
* the machphys table will be represented by an MFN base of zero.
|
||||
*/
|
||||
GUEST_HANDLE(ulong) extent_start;
|
||||
GUEST_HANDLE(xen_pfn_t) extent_start;
|
||||
|
||||
/*
|
||||
* Number of extents written to the above array. This will be smaller
|
||||
@@ -163,6 +163,9 @@ struct xen_add_to_physmap {
|
||||
/* Which domain to change the mapping for. */
|
||||
domid_t domid;
|
||||
|
||||
/* Number of pages to go through for gmfn_range */
|
||||
uint16_t size;
|
||||
|
||||
/* Source mapping space. */
|
||||
#define XENMAPSPACE_shared_info 0 /* shared info page */
|
||||
#define XENMAPSPACE_grant_table 1 /* grant table page */
|
||||
@@ -172,7 +175,7 @@ struct xen_add_to_physmap {
|
||||
unsigned long idx;
|
||||
|
||||
/* GPFN where the source mapping page should appear. */
|
||||
unsigned long gpfn;
|
||||
xen_pfn_t gpfn;
|
||||
};
|
||||
DEFINE_GUEST_HANDLE_STRUCT(xen_add_to_physmap);
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ DEFINE_GUEST_HANDLE_STRUCT(xenpf_settime_t);
|
||||
#define XENPF_add_memtype 31
|
||||
struct xenpf_add_memtype {
|
||||
/* IN variables. */
|
||||
unsigned long mfn;
|
||||
xen_pfn_t mfn;
|
||||
uint64_t nr_mfns;
|
||||
uint32_t type;
|
||||
/* OUT variables. */
|
||||
@@ -84,7 +84,7 @@ struct xenpf_read_memtype {
|
||||
/* IN variables. */
|
||||
uint32_t reg;
|
||||
/* OUT variables. */
|
||||
unsigned long mfn;
|
||||
xen_pfn_t mfn;
|
||||
uint64_t nr_mfns;
|
||||
uint32_t type;
|
||||
};
|
||||
@@ -112,6 +112,7 @@ DEFINE_GUEST_HANDLE_STRUCT(xenpf_platform_quirk_t);
|
||||
#define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */
|
||||
#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */
|
||||
#define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */
|
||||
#define XEN_FW_KBD_SHIFT_FLAGS 5 /* Int16, Fn02: Get keyboard shift flags. */
|
||||
struct xenpf_firmware_info {
|
||||
/* IN variables. */
|
||||
uint32_t type;
|
||||
@@ -142,6 +143,8 @@ struct xenpf_firmware_info {
|
||||
/* must refer to 128-byte buffer */
|
||||
GUEST_HANDLE(uchar) edid;
|
||||
} vbeddc_info; /* XEN_FW_VBEDDC_INFO */
|
||||
|
||||
uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */
|
||||
} u;
|
||||
};
|
||||
DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t);
|
||||
|
||||
@@ -60,4 +60,7 @@ struct xen_feature_info {
|
||||
/* arg == NULL; returns host memory page size. */
|
||||
#define XENVER_pagesize 7
|
||||
|
||||
/* arg == xen_domain_handle_t. */
|
||||
#define XENVER_guest_handle 8
|
||||
|
||||
#endif /* __XEN_PUBLIC_VERSION_H__ */
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
#define __XEN_PUBLIC_XEN_H__
|
||||
|
||||
#include <asm/xen/interface.h>
|
||||
#include <asm/pvclock-abi.h>
|
||||
|
||||
/*
|
||||
* XEN "SYSTEM CALLS" (a.k.a. HYPERCALLS).
|
||||
@@ -190,7 +189,7 @@ struct mmuext_op {
|
||||
unsigned int cmd;
|
||||
union {
|
||||
/* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR */
|
||||
unsigned long mfn;
|
||||
xen_pfn_t mfn;
|
||||
/* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */
|
||||
unsigned long linear_addr;
|
||||
} arg1;
|
||||
@@ -430,11 +429,11 @@ struct start_info {
|
||||
unsigned long nr_pages; /* Total pages allocated to this domain. */
|
||||
unsigned long shared_info; /* MACHINE address of shared info struct. */
|
||||
uint32_t flags; /* SIF_xxx flags. */
|
||||
unsigned long store_mfn; /* MACHINE page number of shared page. */
|
||||
xen_pfn_t store_mfn; /* MACHINE page number of shared page. */
|
||||
uint32_t store_evtchn; /* Event channel for store communication. */
|
||||
union {
|
||||
struct {
|
||||
unsigned long mfn; /* MACHINE page number of console page. */
|
||||
xen_pfn_t mfn; /* MACHINE page number of console page. */
|
||||
uint32_t evtchn; /* Event channel for console page. */
|
||||
} domU;
|
||||
struct {
|
||||
@@ -455,6 +454,7 @@ struct dom0_vga_console_info {
|
||||
uint8_t video_type;
|
||||
#define XEN_VGATYPE_TEXT_MODE_3 0x03
|
||||
#define XEN_VGATYPE_VESA_LFB 0x23
|
||||
#define XEN_VGATYPE_EFI_LFB 0x70
|
||||
|
||||
union {
|
||||
struct {
|
||||
|
||||
@@ -35,8 +35,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
typedef unsigned long xen_pfn_t;
|
||||
#include <xen/interface/xen.h>
|
||||
|
||||
struct privcmd_hypercall {
|
||||
__u64 op;
|
||||
@@ -59,13 +58,33 @@ struct privcmd_mmapbatch {
|
||||
int num; /* number of pages to populate */
|
||||
domid_t dom; /* target domain */
|
||||
__u64 addr; /* virtual address */
|
||||
xen_pfn_t __user *arr; /* array of mfns - top nibble set on err */
|
||||
xen_pfn_t __user *arr; /* array of mfns - or'd with
|
||||
PRIVCMD_MMAPBATCH_*_ERROR on err */
|
||||
};
|
||||
|
||||
#define PRIVCMD_MMAPBATCH_MFN_ERROR 0xf0000000U
|
||||
#define PRIVCMD_MMAPBATCH_PAGED_ERROR 0x80000000U
|
||||
|
||||
struct privcmd_mmapbatch_v2 {
|
||||
unsigned int num; /* number of pages to populate */
|
||||
domid_t dom; /* target domain */
|
||||
__u64 addr; /* virtual address */
|
||||
const xen_pfn_t __user *arr; /* array of mfns */
|
||||
int __user *err; /* array of error codes */
|
||||
};
|
||||
|
||||
/*
|
||||
* @cmd: IOCTL_PRIVCMD_HYPERCALL
|
||||
* @arg: &privcmd_hypercall_t
|
||||
* Return: Value returned from execution of the specified hypercall.
|
||||
*
|
||||
* @cmd: IOCTL_PRIVCMD_MMAPBATCH_V2
|
||||
* @arg: &struct privcmd_mmapbatch_v2
|
||||
* Return: 0 on success (i.e., arg->err contains valid error codes for
|
||||
* each frame). On an error other than a failed frame remap, -1 is
|
||||
* returned and errno is set to EINVAL, EFAULT etc. As an exception,
|
||||
* if the operation was otherwise successful but any frame failed with
|
||||
* -ENOENT, then -1 is returned and errno is set to ENOENT.
|
||||
*/
|
||||
#define IOCTL_PRIVCMD_HYPERCALL \
|
||||
_IOC(_IOC_NONE, 'P', 0, sizeof(struct privcmd_hypercall))
|
||||
@@ -73,5 +92,7 @@ struct privcmd_mmapbatch {
|
||||
_IOC(_IOC_NONE, 'P', 2, sizeof(struct privcmd_mmap))
|
||||
#define IOCTL_PRIVCMD_MMAPBATCH \
|
||||
_IOC(_IOC_NONE, 'P', 3, sizeof(struct privcmd_mmapbatch))
|
||||
#define IOCTL_PRIVCMD_MMAPBATCH_V2 \
|
||||
_IOC(_IOC_NONE, 'P', 4, sizeof(struct privcmd_mmapbatch_v2))
|
||||
|
||||
#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
#include <linux/swiotlb.h>
|
||||
|
||||
extern void xen_swiotlb_init(int verbose);
|
||||
extern int xen_swiotlb_init(int verbose, bool early);
|
||||
|
||||
extern void
|
||||
*xen_swiotlb_alloc_coherent(struct device *hwdev, size_t size,
|
||||
@@ -23,15 +23,6 @@ extern dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,
|
||||
extern void xen_swiotlb_unmap_page(struct device *hwdev, dma_addr_t dev_addr,
|
||||
size_t size, enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs);
|
||||
/*
|
||||
extern int
|
||||
xen_swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction dir);
|
||||
|
||||
extern void
|
||||
xen_swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction dir);
|
||||
*/
|
||||
extern int
|
||||
xen_swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl,
|
||||
int nelems, enum dma_data_direction dir,
|
||||
|
||||
Reference in New Issue
Block a user