aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/xen
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/xen')
-rw-r--r--drivers/xen/Makefile1
-rw-r--r--drivers/xen/events.c2
-rw-r--r--drivers/xen/fallback.c80
-rw-r--r--drivers/xen/gntdev.c36
-rw-r--r--drivers/xen/privcmd.c18
-rw-r--r--drivers/xen/xen-pciback/pci_stub.c2
-rw-r--r--drivers/xen/xen-selfballoon.c2
-rw-r--r--drivers/xen/xenbus/xenbus_dev_frontend.c2
8 files changed, 115 insertions, 28 deletions
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
index 3ee2b91ca4e..fb213cf81a7 100644
--- a/drivers/xen/Makefile
+++ b/drivers/xen/Makefile
@@ -2,6 +2,7 @@ ifneq ($(CONFIG_ARM),y)
2obj-y += manage.o 2obj-y += manage.o
3obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o 3obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o
4endif 4endif
5obj-$(CONFIG_X86) += fallback.o
5obj-y += grant-table.o features.o events.o balloon.o 6obj-y += grant-table.o features.o events.o balloon.o
6obj-y += xenbus/ 7obj-y += xenbus/
7 8
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 912ac81b6db..0be4df39e95 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -1395,10 +1395,10 @@ void xen_evtchn_do_upcall(struct pt_regs *regs)
1395{ 1395{
1396 struct pt_regs *old_regs = set_irq_regs(regs); 1396 struct pt_regs *old_regs = set_irq_regs(regs);
1397 1397
1398 irq_enter();
1398#ifdef CONFIG_X86 1399#ifdef CONFIG_X86
1399 exit_idle(); 1400 exit_idle();
1400#endif 1401#endif
1401 irq_enter();
1402 1402
1403 __xen_evtchn_do_upcall(); 1403 __xen_evtchn_do_upcall();
1404 1404
diff --git a/drivers/xen/fallback.c b/drivers/xen/fallback.c
new file mode 100644
index 00000000000..0ef7c4d40f8
--- /dev/null
+++ b/drivers/xen/fallback.c
@@ -0,0 +1,80 @@
1#include <linux/kernel.h>
2#include <linux/string.h>
3#include <linux/bug.h>
4#include <linux/export.h>
5#include <asm/hypervisor.h>
6#include <asm/xen/hypercall.h>
7
8int xen_event_channel_op_compat(int cmd, void *arg)
9{
10 struct evtchn_op op;
11 int rc;
12
13 op.cmd = cmd;
14 memcpy(&op.u, arg, sizeof(op.u));
15 rc = _hypercall1(int, event_channel_op_compat, &op);
16
17 switch (cmd) {
18 case EVTCHNOP_close:
19 case EVTCHNOP_send:
20 case EVTCHNOP_bind_vcpu:
21 case EVTCHNOP_unmask:
22 /* no output */
23 break;
24
25#define COPY_BACK(eop) \
26 case EVTCHNOP_##eop: \
27 memcpy(arg, &op.u.eop, sizeof(op.u.eop)); \
28 break
29
30 COPY_BACK(bind_interdomain);
31 COPY_BACK(bind_virq);
32 COPY_BACK(bind_pirq);
33 COPY_BACK(status);
34 COPY_BACK(alloc_unbound);
35 COPY_BACK(bind_ipi);
36#undef COPY_BACK
37
38 default:
39 WARN_ON(rc != -ENOSYS);
40 break;
41 }
42
43 return rc;
44}
45EXPORT_SYMBOL_GPL(xen_event_channel_op_compat);
46
47int HYPERVISOR_physdev_op_compat(int cmd, void *arg)
48{
49 struct physdev_op op;
50 int rc;
51
52 op.cmd = cmd;
53 memcpy(&op.u, arg, sizeof(op.u));
54 rc = _hypercall1(int, physdev_op_compat, &op);
55
56 switch (cmd) {
57 case PHYSDEVOP_IRQ_UNMASK_NOTIFY:
58 case PHYSDEVOP_set_iopl:
59 case PHYSDEVOP_set_iobitmap:
60 case PHYSDEVOP_apic_write:
61 /* no output */
62 break;
63
64#define COPY_BACK(pop, fld) \
65 case PHYSDEVOP_##pop: \
66 memcpy(arg, &op.u.fld, sizeof(op.u.fld)); \
67 break
68
69 COPY_BACK(irq_status_query, irq_status_query);
70 COPY_BACK(apic_read, apic_op);
71 COPY_BACK(ASSIGN_VECTOR, irq_op);
72#undef COPY_BACK
73
74 default:
75 WARN_ON(rc != -ENOSYS);
76 break;
77 }
78
79 return rc;
80}
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index 610bfc6be17..2e22df2f7a3 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -105,6 +105,21 @@ static void gntdev_print_maps(struct gntdev_priv *priv,
105#endif 105#endif
106} 106}
107 107
108static void gntdev_free_map(struct grant_map *map)
109{
110 if (map == NULL)
111 return;
112
113 if (map->pages)
114 free_xenballooned_pages(map->count, map->pages);
115 kfree(map->pages);
116 kfree(map->grants);
117 kfree(map->map_ops);
118 kfree(map->unmap_ops);
119 kfree(map->kmap_ops);
120 kfree(map);
121}
122
108static struct grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count) 123static struct grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count)
109{ 124{
110 struct grant_map *add; 125 struct grant_map *add;
@@ -142,12 +157,7 @@ static struct grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count)
142 return add; 157 return add;
143 158
144err: 159err:
145 kfree(add->pages); 160 gntdev_free_map(add);
146 kfree(add->grants);
147 kfree(add->map_ops);
148 kfree(add->unmap_ops);
149 kfree(add->kmap_ops);
150 kfree(add);
151 return NULL; 161 return NULL;
152} 162}
153 163
@@ -198,17 +208,9 @@ static void gntdev_put_map(struct grant_map *map)
198 evtchn_put(map->notify.event); 208 evtchn_put(map->notify.event);
199 } 209 }
200 210
201 if (map->pages) { 211 if (map->pages && !use_ptemod)
202 if (!use_ptemod) 212 unmap_grant_pages(map, 0, map->count);
203 unmap_grant_pages(map, 0, map->count); 213 gntdev_free_map(map);
204
205 free_xenballooned_pages(map->count, map->pages);
206 }
207 kfree(map->pages);
208 kfree(map->grants);
209 kfree(map->map_ops);
210 kfree(map->unmap_ops);
211 kfree(map);
212} 214}
213 215
214/* ------------------------------------------------------------------ */ 216/* ------------------------------------------------------------------ */
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
index b9d08987a5a..0bbbccbb1f1 100644
--- a/drivers/xen/privcmd.c
+++ b/drivers/xen/privcmd.c
@@ -405,13 +405,13 @@ static long privcmd_ioctl_mmap_batch(void __user *udata, int version)
405 down_write(&mm->mmap_sem); 405 down_write(&mm->mmap_sem);
406 406
407 vma = find_vma(mm, m.addr); 407 vma = find_vma(mm, m.addr);
408 ret = -EINVAL;
409 if (!vma || 408 if (!vma ||
410 vma->vm_ops != &privcmd_vm_ops || 409 vma->vm_ops != &privcmd_vm_ops ||
411 (m.addr != vma->vm_start) || 410 (m.addr != vma->vm_start) ||
412 ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) || 411 ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) ||
413 !privcmd_enforce_singleshot_mapping(vma)) { 412 !privcmd_enforce_singleshot_mapping(vma)) {
414 up_write(&mm->mmap_sem); 413 up_write(&mm->mmap_sem);
414 ret = -EINVAL;
415 goto out; 415 goto out;
416 } 416 }
417 if (xen_feature(XENFEAT_auto_translated_physmap)) { 417 if (xen_feature(XENFEAT_auto_translated_physmap)) {
@@ -435,12 +435,16 @@ static long privcmd_ioctl_mmap_batch(void __user *udata, int version)
435 435
436 up_write(&mm->mmap_sem); 436 up_write(&mm->mmap_sem);
437 437
438 if (state.global_error && (version == 1)) { 438 if (version == 1) {
439 /* Write back errors in second pass. */ 439 if (state.global_error) {
440 state.user_mfn = (xen_pfn_t *)m.arr; 440 /* Write back errors in second pass. */
441 state.err = err_array; 441 state.user_mfn = (xen_pfn_t *)m.arr;
442 ret = traverse_pages(m.num, sizeof(xen_pfn_t), 442 state.err = err_array;
443 &pagelist, mmap_return_errors_v1, &state); 443 ret = traverse_pages(m.num, sizeof(xen_pfn_t),
444 &pagelist, mmap_return_errors_v1, &state);
445 } else
446 ret = 0;
447
444 } else if (version == 2) { 448 } else if (version == 2) {
445 ret = __copy_to_user(m.err, err_array, m.num * sizeof(int)); 449 ret = __copy_to_user(m.err, err_array, m.num * sizeof(int));
446 if (ret) 450 if (ret)
diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c
index 129e1674f4a..cd50d251998 100644
--- a/drivers/xen/xen-pciback/pci_stub.c
+++ b/drivers/xen/xen-pciback/pci_stub.c
@@ -362,7 +362,7 @@ static int __devinit pcistub_init_device(struct pci_dev *dev)
362 if (!dev_data->pci_saved_state) 362 if (!dev_data->pci_saved_state)
363 dev_err(&dev->dev, "Could not store PCI conf saved state!\n"); 363 dev_err(&dev->dev, "Could not store PCI conf saved state!\n");
364 else { 364 else {
365 dev_dbg(&dev->dev, "reseting (FLR, D3, etc) the device\n"); 365 dev_dbg(&dev->dev, "resetting (FLR, D3, etc) the device\n");
366 __pci_reset_function_locked(dev); 366 __pci_reset_function_locked(dev);
367 pci_restore_state(dev); 367 pci_restore_state(dev);
368 } 368 }
diff --git a/drivers/xen/xen-selfballoon.c b/drivers/xen/xen-selfballoon.c
index 7d041cb6da2..2552d3e0a70 100644
--- a/drivers/xen/xen-selfballoon.c
+++ b/drivers/xen/xen-selfballoon.c
@@ -222,7 +222,7 @@ static void selfballoon_process(struct work_struct *work)
222 if (xen_selfballooning_enabled) { 222 if (xen_selfballooning_enabled) {
223 cur_pages = totalram_pages; 223 cur_pages = totalram_pages;
224 tgt_pages = cur_pages; /* default is no change */ 224 tgt_pages = cur_pages; /* default is no change */
225 goal_pages = percpu_counter_read_positive(&vm_committed_as) + 225 goal_pages = vm_memory_committed() +
226 totalreserve_pages + 226 totalreserve_pages +
227 MB2PAGES(selfballoon_reserved_mb); 227 MB2PAGES(selfballoon_reserved_mb);
228#ifdef CONFIG_FRONTSWAP 228#ifdef CONFIG_FRONTSWAP
diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c
index 89f76252a16..ac727028e65 100644
--- a/drivers/xen/xenbus/xenbus_dev_frontend.c
+++ b/drivers/xen/xenbus/xenbus_dev_frontend.c
@@ -458,7 +458,7 @@ static ssize_t xenbus_file_write(struct file *filp,
458 goto out; 458 goto out;
459 459
460 /* Can't write a xenbus message larger we can buffer */ 460 /* Can't write a xenbus message larger we can buffer */
461 if ((len + u->len) > sizeof(u->u.buffer)) { 461 if (len > sizeof(u->u.buffer) - u->len) {
462 /* On error, dump existing buffer */ 462 /* On error, dump existing buffer */
463 u->len = 0; 463 u->len = 0;
464 rc = -EINVAL; 464 rc = -EINVAL;