Commit e306e3be authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'stable/for-linus-3.17-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull Xen updates from David Vrabel:
 - remove unused V2 grant table support
 - note that Konrad is xen-blkkback/front maintainer
 - add 'xen_nopv' option to disable PV extentions for x86 HVM guests
 - misc minor cleanups

* tag 'stable/for-linus-3.17-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  xen-pciback: Document the 'quirks' sysfs file
  xen/pciback: Fix error return code in xen_pcibk_attach()
  xen/events: drop negativity check of unsigned parameter
  xen/setup: Remove Identity Map Debug Message
  xen/events/fifo: remove a unecessary use of BM()
  xen/events/fifo: ensure all bitops are properly aligned even on x86
  xen/events/fifo: reset control block and local HEADs on resume
  xen/arm: use BUG_ON
  xen/grant-table: remove support for V2 tables
  x86/xen: safely map and unmap grant frames when in atomic context
  MAINTAINERS: Make me the Xen block subsystem (front and back) maintainer
  xen: Introduce 'xen_nopv' to disable PV extensions for HVM guests.
parents 7f0d32e0 8b63c998
What: /sys/bus/pci/drivers/pciback/quirks
Date: Oct 2011
KernelVersion: 3.1
Contact: xen-devel@lists.xenproject.org
Description:
If the permissive attribute is set, then writing a string in
the format of DDDD:BB:DD.F-REG:SIZE:MASK will allow the guest
to write and read from the PCI device. That is Domain:Bus:
Device.Function-Register:Size:Mask (Domain is optional).
For example:
#echo 00:19.0-E0:2:FF > /sys/bus/pci/drivers/pciback/quirks
will allow the guest to read and write to the configuration
register 0x0E.
...@@ -3745,6 +3745,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -3745,6 +3745,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
Disables the ticketlock slowpath using Xen PV Disables the ticketlock slowpath using Xen PV
optimizations. optimizations.
xen_nopv [X86]
Disables the PV optimizations forcing the HVM guest to
run as generic HVM guest with no PV drivers.
xirc2ps_cs= [NET,PCMCIA] xirc2ps_cs= [NET,PCMCIA]
Format: Format:
<irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]] <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
......
...@@ -10066,6 +10066,13 @@ S: Supported ...@@ -10066,6 +10066,13 @@ S: Supported
F: arch/x86/pci/*xen* F: arch/x86/pci/*xen*
F: drivers/pci/*xen* F: drivers/pci/*xen*
XEN BLOCK SUBSYSTEM
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
S: Supported
F: drivers/block/xen-blkback/*
F: drivers/block/xen*
XEN SWIOTLB SUBSYSTEM XEN SWIOTLB SUBSYSTEM
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
L: xen-devel@lists.xenproject.org (moderated for non-subscribers) L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
......
...@@ -181,8 +181,7 @@ static void xen_restart(enum reboot_mode reboot_mode, const char *cmd) ...@@ -181,8 +181,7 @@ static void xen_restart(enum reboot_mode reboot_mode, const char *cmd)
struct sched_shutdown r = { .reason = SHUTDOWN_reboot }; struct sched_shutdown r = { .reason = SHUTDOWN_reboot };
int rc; int rc;
rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r); rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
if (rc) BUG_ON(rc);
BUG();
} }
static void xen_power_off(void) static void xen_power_off(void)
...@@ -190,8 +189,7 @@ static void xen_power_off(void) ...@@ -190,8 +189,7 @@ static void xen_power_off(void)
struct sched_shutdown r = { .reason = SHUTDOWN_poweroff }; struct sched_shutdown r = { .reason = SHUTDOWN_poweroff };
int rc; int rc;
rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r); rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
if (rc) BUG_ON(rc);
BUG();
} }
static int xen_cpu_notification(struct notifier_block *self, static int xen_cpu_notification(struct notifier_block *self,
......
...@@ -45,11 +45,9 @@ void arch_gnttab_unmap(void *shared, unsigned long nr_gframes) ...@@ -45,11 +45,9 @@ void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)
return; return;
} }
int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes, int arch_gnttab_init(unsigned long nr_shared)
unsigned long max_nr_gframes,
grant_status_t **__shared)
{ {
return -ENOSYS; return 0;
} }
int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status) int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status)
......
...@@ -1828,8 +1828,19 @@ static void __init xen_hvm_guest_init(void) ...@@ -1828,8 +1828,19 @@ static void __init xen_hvm_guest_init(void)
xen_hvm_init_mmu_ops(); xen_hvm_init_mmu_ops();
} }
static bool xen_nopv = false;
static __init int xen_parse_nopv(char *arg)
{
xen_nopv = true;
return 0;
}
early_param("xen_nopv", xen_parse_nopv);
static uint32_t __init xen_hvm_platform(void) static uint32_t __init xen_hvm_platform(void)
{ {
if (xen_nopv)
return 0;
if (xen_pv_domain()) if (xen_pv_domain())
return 0; return 0;
...@@ -1838,6 +1849,8 @@ static uint32_t __init xen_hvm_platform(void) ...@@ -1838,6 +1849,8 @@ static uint32_t __init xen_hvm_platform(void)
bool xen_hvm_need_lapic(void) bool xen_hvm_need_lapic(void)
{ {
if (xen_nopv)
return false;
if (xen_pv_domain()) if (xen_pv_domain())
return false; return false;
if (!xen_hvm_domain()) if (!xen_hvm_domain())
......
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
static struct gnttab_vm_area { static struct gnttab_vm_area {
struct vm_struct *area; struct vm_struct *area;
pte_t **ptes; pte_t **ptes;
} gnttab_shared_vm_area, gnttab_status_vm_area; } gnttab_shared_vm_area;
int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes, int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
unsigned long max_nr_gframes, unsigned long max_nr_gframes,
...@@ -73,43 +73,16 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes, ...@@ -73,43 +73,16 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
return 0; return 0;
} }
int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
unsigned long max_nr_gframes,
grant_status_t **__shared)
{
grant_status_t *shared = *__shared;
unsigned long addr;
unsigned long i;
if (shared == NULL)
*__shared = shared = gnttab_status_vm_area.area->addr;
addr = (unsigned long)shared;
for (i = 0; i < nr_gframes; i++) {
set_pte_at(&init_mm, addr, gnttab_status_vm_area.ptes[i],
mfn_pte(frames[i], PAGE_KERNEL));
addr += PAGE_SIZE;
}
return 0;
}
void arch_gnttab_unmap(void *shared, unsigned long nr_gframes) void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)
{ {
pte_t **ptes;
unsigned long addr; unsigned long addr;
unsigned long i; unsigned long i;
if (shared == gnttab_status_vm_area.area->addr)
ptes = gnttab_status_vm_area.ptes;
else
ptes = gnttab_shared_vm_area.ptes;
addr = (unsigned long)shared; addr = (unsigned long)shared;
for (i = 0; i < nr_gframes; i++) { for (i = 0; i < nr_gframes; i++) {
set_pte_at(&init_mm, addr, ptes[i], __pte(0)); set_pte_at(&init_mm, addr, gnttab_shared_vm_area.ptes[i],
__pte(0));
addr += PAGE_SIZE; addr += PAGE_SIZE;
} }
} }
...@@ -129,35 +102,12 @@ static int arch_gnttab_valloc(struct gnttab_vm_area *area, unsigned nr_frames) ...@@ -129,35 +102,12 @@ static int arch_gnttab_valloc(struct gnttab_vm_area *area, unsigned nr_frames)
return 0; return 0;
} }
static void arch_gnttab_vfree(struct gnttab_vm_area *area) int arch_gnttab_init(unsigned long nr_shared)
{ {
free_vm_area(area->area);
kfree(area->ptes);
}
int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status)
{
int ret;
if (!xen_pv_domain()) if (!xen_pv_domain())
return 0; return 0;
ret = arch_gnttab_valloc(&gnttab_shared_vm_area, nr_shared); return arch_gnttab_valloc(&gnttab_shared_vm_area, nr_shared);
if (ret < 0)
return ret;
/*
* Always allocate the space for the status frames in case
* we're migrated to a host with V2 support.
*/
ret = arch_gnttab_valloc(&gnttab_status_vm_area, nr_status);
if (ret < 0)
goto err;
return 0;
err:
arch_gnttab_vfree(&gnttab_shared_vm_area);
return -ENOMEM;
} }
#ifdef CONFIG_XEN_PVH #ifdef CONFIG_XEN_PVH
......
...@@ -841,10 +841,9 @@ unsigned long __init set_phys_range_identity(unsigned long pfn_s, ...@@ -841,10 +841,9 @@ unsigned long __init set_phys_range_identity(unsigned long pfn_s,
pfn = ALIGN(pfn, P2M_PER_PAGE); pfn = ALIGN(pfn, P2M_PER_PAGE);
} }
if (!WARN((pfn - pfn_s) != (pfn_e - pfn_s), WARN((pfn - pfn_s) != (pfn_e - pfn_s),
"Identity mapping failed. We are %ld short of 1-1 mappings!\n", "Identity mapping failed. We are %ld short of 1-1 mappings!\n",
(pfn_e - pfn_s) - (pfn - pfn_s))) (pfn_e - pfn_s) - (pfn - pfn_s));
printk(KERN_DEBUG "1-1 mapping on %lx->%lx\n", pfn_s, pfn);
return pfn - pfn_s; return pfn - pfn_s;
} }
......
...@@ -246,7 +246,7 @@ static void xen_irq_info_cleanup(struct irq_info *info) ...@@ -246,7 +246,7 @@ static void xen_irq_info_cleanup(struct irq_info *info)
*/ */
unsigned int evtchn_from_irq(unsigned irq) unsigned int evtchn_from_irq(unsigned irq)
{ {
if (unlikely(WARN(irq < 0 || irq >= nr_irqs, "Invalid irq %d!\n", irq))) if (unlikely(WARN(irq >= nr_irqs, "Invalid irq %d!\n", irq)))
return 0; return 0;
return info_for_irq(irq)->evtchn; return info_for_irq(irq)->evtchn;
......
...@@ -67,10 +67,9 @@ static event_word_t *event_array[MAX_EVENT_ARRAY_PAGES] __read_mostly; ...@@ -67,10 +67,9 @@ static event_word_t *event_array[MAX_EVENT_ARRAY_PAGES] __read_mostly;
static unsigned event_array_pages __read_mostly; static unsigned event_array_pages __read_mostly;
/* /*
* sync_set_bit() and friends must be unsigned long aligned on non-x86 * sync_set_bit() and friends must be unsigned long aligned.
* platforms.
*/ */
#if !defined(CONFIG_X86) && BITS_PER_LONG > 32 #if BITS_PER_LONG > 32
#define BM(w) (unsigned long *)((unsigned long)w & ~0x7UL) #define BM(w) (unsigned long *)((unsigned long)w & ~0x7UL)
#define EVTCHN_FIFO_BIT(b, w) \ #define EVTCHN_FIFO_BIT(b, w) \
...@@ -100,6 +99,25 @@ static unsigned evtchn_fifo_nr_channels(void) ...@@ -100,6 +99,25 @@ static unsigned evtchn_fifo_nr_channels(void)
return event_array_pages * EVENT_WORDS_PER_PAGE; return event_array_pages * EVENT_WORDS_PER_PAGE;
} }
static int init_control_block(int cpu,
struct evtchn_fifo_control_block *control_block)
{
struct evtchn_fifo_queue *q = &per_cpu(cpu_queue, cpu);
struct evtchn_init_control init_control;
unsigned int i;
/* Reset the control block and the local HEADs. */
clear_page(control_block);
for (i = 0; i < EVTCHN_FIFO_MAX_QUEUES; i++)
q->head[i] = 0;
init_control.control_gfn = virt_to_mfn(control_block);
init_control.offset = 0;
init_control.vcpu = cpu;
return HYPERVISOR_event_channel_op(EVTCHNOP_init_control, &init_control);
}
static void free_unused_array_pages(void) static void free_unused_array_pages(void)
{ {
unsigned i; unsigned i;
...@@ -312,7 +330,7 @@ static void evtchn_fifo_handle_events(unsigned cpu) ...@@ -312,7 +330,7 @@ static void evtchn_fifo_handle_events(unsigned cpu)
ready = xchg(&control_block->ready, 0); ready = xchg(&control_block->ready, 0);
while (ready) { while (ready) {
q = find_first_bit(BM(&ready), EVTCHN_FIFO_MAX_QUEUES); q = find_first_bit(&ready, EVTCHN_FIFO_MAX_QUEUES);
consume_one_event(cpu, control_block, q, &ready); consume_one_event(cpu, control_block, q, &ready);
ready |= xchg(&control_block->ready, 0); ready |= xchg(&control_block->ready, 0);
} }
...@@ -324,7 +342,6 @@ static void evtchn_fifo_resume(void) ...@@ -324,7 +342,6 @@ static void evtchn_fifo_resume(void)
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
void *control_block = per_cpu(cpu_control_block, cpu); void *control_block = per_cpu(cpu_control_block, cpu);
struct evtchn_init_control init_control;
int ret; int ret;
if (!control_block) if (!control_block)
...@@ -341,12 +358,7 @@ static void evtchn_fifo_resume(void) ...@@ -341,12 +358,7 @@ static void evtchn_fifo_resume(void)
continue; continue;
} }
init_control.control_gfn = virt_to_mfn(control_block); ret = init_control_block(cpu, control_block);
init_control.offset = 0;
init_control.vcpu = cpu;
ret = HYPERVISOR_event_channel_op(EVTCHNOP_init_control,
&init_control);
if (ret < 0) if (ret < 0)
BUG(); BUG();
} }
...@@ -374,30 +386,25 @@ static const struct evtchn_ops evtchn_ops_fifo = { ...@@ -374,30 +386,25 @@ static const struct evtchn_ops evtchn_ops_fifo = {
.resume = evtchn_fifo_resume, .resume = evtchn_fifo_resume,
}; };
static int evtchn_fifo_init_control_block(unsigned cpu) static int evtchn_fifo_alloc_control_block(unsigned cpu)
{ {
struct page *control_block = NULL; void *control_block = NULL;
struct evtchn_init_control init_control;
int ret = -ENOMEM; int ret = -ENOMEM;
control_block = alloc_page(GFP_KERNEL|__GFP_ZERO); control_block = (void *)__get_free_page(GFP_KERNEL);
if (control_block == NULL) if (control_block == NULL)
goto error; goto error;
init_control.control_gfn = virt_to_mfn(page_address(control_block)); ret = init_control_block(cpu, control_block);
init_control.offset = 0;
init_control.vcpu = cpu;
ret = HYPERVISOR_event_channel_op(EVTCHNOP_init_control, &init_control);
if (ret < 0) if (ret < 0)
goto error; goto error;
per_cpu(cpu_control_block, cpu) = page_address(control_block); per_cpu(cpu_control_block, cpu) = control_block;
return 0; return 0;
error: error:
__free_page(control_block); free_page((unsigned long)control_block);
return ret; return ret;
} }
...@@ -411,7 +418,7 @@ static int evtchn_fifo_cpu_notification(struct notifier_block *self, ...@@ -411,7 +418,7 @@ static int evtchn_fifo_cpu_notification(struct notifier_block *self,
switch (action) { switch (action) {
case CPU_UP_PREPARE: case CPU_UP_PREPARE:
if (!per_cpu(cpu_control_block, cpu)) if (!per_cpu(cpu_control_block, cpu))
ret = evtchn_fifo_init_control_block(cpu); ret = evtchn_fifo_alloc_control_block(cpu);
break; break;
default: default:
break; break;
...@@ -428,7 +435,7 @@ int __init xen_evtchn_fifo_init(void) ...@@ -428,7 +435,7 @@ int __init xen_evtchn_fifo_init(void)
int cpu = get_cpu(); int cpu = get_cpu();
int ret; int ret;
ret = evtchn_fifo_init_control_block(cpu); ret = evtchn_fifo_alloc_control_block(cpu);
if (ret < 0) if (ret < 0)
goto out; goto out;
......
This diff is collapsed.
...@@ -174,6 +174,7 @@ static int xen_pcibk_attach(struct xen_pcibk_device *pdev) ...@@ -174,6 +174,7 @@ static int xen_pcibk_attach(struct xen_pcibk_device *pdev)
"version mismatch (%s/%s) with pcifront - " "version mismatch (%s/%s) with pcifront - "
"halting " DRV_NAME, "halting " DRV_NAME,
magic, XEN_PCI_MAGIC); magic, XEN_PCI_MAGIC);
err = -EFAULT;
goto out; goto out;
} }
......
...@@ -64,24 +64,6 @@ int gnttab_resume(void); ...@@ -64,24 +64,6 @@ int gnttab_resume(void);
int gnttab_grant_foreign_access(domid_t domid, unsigned long frame, int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
int readonly); int readonly);
int gnttab_grant_foreign_access_subpage(domid_t domid, unsigned long frame,
int flags, unsigned page_off,
unsigned length);
int gnttab_grant_foreign_access_trans(domid_t domid, int flags,
domid_t trans_domid,
grant_ref_t trans_gref);
/*
* Are sub-page grants available on this version of Xen? Returns true if they
* are, and false if they're not.
*/
bool gnttab_subpage_grants_available(void);
/*
* Are transitive grants available on this version of Xen? Returns true if they
* are, and false if they're not.
*/
bool gnttab_trans_grants_available(void);
/* /*
* End access through the given grant reference, iff the grant entry is no * End access through the given grant reference, iff the grant entry is no
...@@ -128,13 +110,6 @@ void gnttab_cancel_free_callback(struct gnttab_free_callback *callback); ...@@ -128,13 +110,6 @@ void gnttab_cancel_free_callback(struct gnttab_free_callback *callback);
void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid, void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
unsigned long frame, int readonly); unsigned long frame, int readonly);
int gnttab_grant_foreign_access_subpage_ref(grant_ref_t ref, domid_t domid,
unsigned long frame, int flags,
unsigned page_off,
unsigned length);
int gnttab_grant_foreign_access_trans_ref(grant_ref_t ref, domid_t domid,
int flags, domid_t trans_domid,
grant_ref_t trans_gref);
void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid, void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
unsigned long pfn); unsigned long pfn);
...@@ -170,13 +145,10 @@ gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, phys_addr_t addr, ...@@ -170,13 +145,10 @@ gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, phys_addr_t addr,
unmap->dev_bus_addr = 0; unmap->dev_bus_addr = 0;
} }
int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status); int arch_gnttab_init(unsigned long nr_shared);
int arch_gnttab_map_shared(xen_pfn_t *frames, unsigned long nr_gframes, int arch_gnttab_map_shared(xen_pfn_t *frames, unsigned long nr_gframes,
unsigned long max_nr_gframes, unsigned long max_nr_gframes,
void **__shared); void **__shared);
int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
unsigned long max_nr_gframes,
grant_status_t **__shared);
void arch_gnttab_unmap(void *shared, unsigned long nr_gframes); void arch_gnttab_unmap(void *shared, unsigned long nr_gframes);
struct grant_frames { struct grant_frames {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment