|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] common/vm_event: Initialize vm_event lists on domain creation
Pending livepatch code wants to check if the vm_event wait queues
are active, and this is made harder by the fact that they were
previously only initialized some time after the domain was created,
in vm_event_enable(). This patch initializes the lists immediately
after xzalloc()ating the vm_event memory, in domain_create(), in
the newly added init_domain_vm_event() function.
Signed-off-by: Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx>
---
xen/common/domain.c | 5 ++---
xen/common/vm_event.c | 23 ++++++++++++++++++++---
xen/include/xen/vm_event.h | 2 ++
3 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/xen/common/domain.c b/xen/common/domain.c
index b22aacc..89a8f1d 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -362,11 +362,10 @@ struct domain *domain_create(domid_t domid, unsigned int
domcr_flags,
poolid = 0;
- err = -ENOMEM;
- d->vm_event = xzalloc(struct vm_event_per_domain);
- if ( !d->vm_event )
+ if ( (err = init_domain_vm_event(d)) != 0 )
goto fail;
+ err = -ENOMEM;
d->pbuf = xzalloc_array(char, DOMAIN_PBUF_SIZE);
if ( !d->pbuf )
goto fail;
diff --git a/xen/common/vm_event.c b/xen/common/vm_event.c
index 9291db6..294ddd7 100644
--- a/xen/common/vm_event.c
+++ b/xen/common/vm_event.c
@@ -39,6 +39,26 @@
#define vm_event_ring_lock(_ved) spin_lock(&(_ved)->ring_lock)
#define vm_event_ring_unlock(_ved) spin_unlock(&(_ved)->ring_lock)
+int init_domain_vm_event(struct domain *d)
+{
+ d->vm_event = xzalloc(struct vm_event_per_domain);
+
+ if ( !d->vm_event )
+ return -ENOMEM;
+
+#ifdef CONFIG_HAS_MEM_PAGING
+ init_waitqueue_head(&d->vm_event->paging.wq);
+#endif
+
+ init_waitqueue_head(&d->vm_event->monitor.wq);
+
+#ifdef CONFIG_HAS_MEM_SHARING
+ init_waitqueue_head(&d->vm_event->share.wq);
+#endif
+
+ return 0;
+}
+
static int vm_event_enable(
struct domain *d,
xen_domctl_vm_event_op_t *vec,
@@ -93,9 +113,6 @@ static int vm_event_enable(
/* Save the pause flag for this particular ring. */
ved->pause_flag = pause_flag;
- /* Initialize the last-chance wait queue. */
- init_waitqueue_head(&ved->wq);
-
vm_event_ring_unlock(ved);
return 0;
diff --git a/xen/include/xen/vm_event.h b/xen/include/xen/vm_event.h
index 2fb3951..482243e 100644
--- a/xen/include/xen/vm_event.h
+++ b/xen/include/xen/vm_event.h
@@ -80,6 +80,8 @@ void vm_event_set_registers(struct vcpu *v,
vm_event_response_t *rsp);
void vm_event_monitor_next_interrupt(struct vcpu *v);
+int init_domain_vm_event(struct domain *d);
+
#endif /* __VM_EVENT_H__ */
/*
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |