aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/xen
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/xen')
-rw-r--r--drivers/xen/events.c6
-rw-r--r--drivers/xen/gntalloc.c14
-rw-r--r--drivers/xen/gntdev.c16
-rw-r--r--drivers/xen/manage.c15
4 files changed, 39 insertions, 12 deletions
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index e51f3c50bd40..35e02a10110b 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -929,8 +929,7 @@ int bind_evtchn_to_irqhandler(unsigned int evtchn,
929 unsigned long irqflags, 929 unsigned long irqflags,
930 const char *devname, void *dev_id) 930 const char *devname, void *dev_id)
931{ 931{
932 unsigned int irq; 932 int irq, retval;
933 int retval;
934 933
935 irq = bind_evtchn_to_irq(evtchn); 934 irq = bind_evtchn_to_irq(evtchn);
936 if (irq < 0) 935 if (irq < 0)
@@ -972,8 +971,7 @@ int bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu,
972 irq_handler_t handler, 971 irq_handler_t handler,
973 unsigned long irqflags, const char *devname, void *dev_id) 972 unsigned long irqflags, const char *devname, void *dev_id)
974{ 973{
975 unsigned int irq; 974 int irq, retval;
976 int retval;
977 975
978 irq = bind_virq_to_irq(virq, cpu); 976 irq = bind_virq_to_irq(virq, cpu);
979 if (irq < 0) 977 if (irq < 0)
diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index a7ffdfe19fc9..f6832f46aea4 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -427,6 +427,17 @@ static long gntalloc_ioctl(struct file *filp, unsigned int cmd,
427 return 0; 427 return 0;
428} 428}
429 429
430static void gntalloc_vma_open(struct vm_area_struct *vma)
431{
432 struct gntalloc_gref *gref = vma->vm_private_data;
433 if (!gref)
434 return;
435
436 spin_lock(&gref_lock);
437 gref->users++;
438 spin_unlock(&gref_lock);
439}
440
430static void gntalloc_vma_close(struct vm_area_struct *vma) 441static void gntalloc_vma_close(struct vm_area_struct *vma)
431{ 442{
432 struct gntalloc_gref *gref = vma->vm_private_data; 443 struct gntalloc_gref *gref = vma->vm_private_data;
@@ -441,6 +452,7 @@ static void gntalloc_vma_close(struct vm_area_struct *vma)
441} 452}
442 453
443static struct vm_operations_struct gntalloc_vmops = { 454static struct vm_operations_struct gntalloc_vmops = {
455 .open = gntalloc_vma_open,
444 .close = gntalloc_vma_close, 456 .close = gntalloc_vma_close,
445}; 457};
446 458
@@ -471,8 +483,6 @@ static int gntalloc_mmap(struct file *filp, struct vm_area_struct *vma)
471 vma->vm_private_data = gref; 483 vma->vm_private_data = gref;
472 484
473 vma->vm_flags |= VM_RESERVED; 485 vma->vm_flags |= VM_RESERVED;
474 vma->vm_flags |= VM_DONTCOPY;
475 vma->vm_flags |= VM_PFNMAP | VM_PFN_AT_MMAP;
476 486
477 vma->vm_ops = &gntalloc_vmops; 487 vma->vm_ops = &gntalloc_vmops;
478 488
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index b0f9e8fb0052..f914b26cf0c2 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -330,17 +330,26 @@ static int unmap_grant_pages(struct grant_map *map, int offset, int pages)
330 330
331/* ------------------------------------------------------------------ */ 331/* ------------------------------------------------------------------ */
332 332
333static void gntdev_vma_open(struct vm_area_struct *vma)
334{
335 struct grant_map *map = vma->vm_private_data;
336
337 pr_debug("gntdev_vma_open %p\n", vma);
338 atomic_inc(&map->users);
339}
340
333static void gntdev_vma_close(struct vm_area_struct *vma) 341static void gntdev_vma_close(struct vm_area_struct *vma)
334{ 342{
335 struct grant_map *map = vma->vm_private_data; 343 struct grant_map *map = vma->vm_private_data;
336 344
337 pr_debug("close %p\n", vma); 345 pr_debug("gntdev_vma_close %p\n", vma);
338 map->vma = NULL; 346 map->vma = NULL;
339 vma->vm_private_data = NULL; 347 vma->vm_private_data = NULL;
340 gntdev_put_map(map); 348 gntdev_put_map(map);
341} 349}
342 350
343static struct vm_operations_struct gntdev_vmops = { 351static struct vm_operations_struct gntdev_vmops = {
352 .open = gntdev_vma_open,
344 .close = gntdev_vma_close, 353 .close = gntdev_vma_close,
345}; 354};
346 355
@@ -652,7 +661,10 @@ static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma)
652 661
653 vma->vm_ops = &gntdev_vmops; 662 vma->vm_ops = &gntdev_vmops;
654 663
655 vma->vm_flags |= VM_RESERVED|VM_DONTCOPY|VM_DONTEXPAND|VM_PFNMAP; 664 vma->vm_flags |= VM_RESERVED|VM_DONTEXPAND;
665
666 if (use_ptemod)
667 vma->vm_flags |= VM_DONTCOPY|VM_PFNMAP;
656 668
657 vma->vm_private_data = map; 669 vma->vm_private_data = map;
658 670
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
index 95143dd6904d..a2eee574784e 100644
--- a/drivers/xen/manage.c
+++ b/drivers/xen/manage.c
@@ -8,6 +8,7 @@
8#include <linux/sysrq.h> 8#include <linux/sysrq.h>
9#include <linux/stop_machine.h> 9#include <linux/stop_machine.h>
10#include <linux/freezer.h> 10#include <linux/freezer.h>
11#include <linux/syscore_ops.h>
11 12
12#include <xen/xen.h> 13#include <xen/xen.h>
13#include <xen/xenbus.h> 14#include <xen/xenbus.h>
@@ -61,7 +62,7 @@ static void xen_post_suspend(int cancelled)
61 xen_mm_unpin_all(); 62 xen_mm_unpin_all();
62} 63}
63 64
64#ifdef CONFIG_HIBERNATION 65#ifdef CONFIG_HIBERNATE_CALLBACKS
65static int xen_suspend(void *data) 66static int xen_suspend(void *data)
66{ 67{
67 struct suspend_info *si = data; 68 struct suspend_info *si = data;
@@ -70,8 +71,13 @@ static int xen_suspend(void *data)
70 BUG_ON(!irqs_disabled()); 71 BUG_ON(!irqs_disabled());
71 72
72 err = sysdev_suspend(PMSG_FREEZE); 73 err = sysdev_suspend(PMSG_FREEZE);
74 if (!err) {
75 err = syscore_suspend();
76 if (err)
77 sysdev_resume();
78 }
73 if (err) { 79 if (err) {
74 printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n", 80 printk(KERN_ERR "xen_suspend: system core suspend failed: %d\n",
75 err); 81 err);
76 return err; 82 return err;
77 } 83 }
@@ -95,6 +101,7 @@ static int xen_suspend(void *data)
95 xen_timer_resume(); 101 xen_timer_resume();
96 } 102 }
97 103
104 syscore_resume();
98 sysdev_resume(); 105 sysdev_resume();
99 106
100 return 0; 107 return 0;
@@ -173,7 +180,7 @@ out:
173#endif 180#endif
174 shutting_down = SHUTDOWN_INVALID; 181 shutting_down = SHUTDOWN_INVALID;
175} 182}
176#endif /* CONFIG_HIBERNATION */ 183#endif /* CONFIG_HIBERNATE_CALLBACKS */
177 184
178struct shutdown_handler { 185struct shutdown_handler {
179 const char *command; 186 const char *command;
@@ -202,7 +209,7 @@ static void shutdown_handler(struct xenbus_watch *watch,
202 { "poweroff", do_poweroff }, 209 { "poweroff", do_poweroff },
203 { "halt", do_poweroff }, 210 { "halt", do_poweroff },
204 { "reboot", do_reboot }, 211 { "reboot", do_reboot },
205#ifdef CONFIG_HIBERNATION 212#ifdef CONFIG_HIBERNATE_CALLBACKS
206 { "suspend", do_suspend }, 213 { "suspend", do_suspend },
207#endif 214#endif
208 {NULL, NULL}, 215 {NULL, NULL},