From: Keir Fraser Date: Thu, 17 Dec 2009 06:27:55 +0000 (+0000) Subject: Base domain structure and public interface to support memory events. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~12881 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=db587a25fac7a71ce9d5c1934eb158646cda2d7c;p=xen.git Base domain structure and public interface to support memory events. Signed-off-by: Patrick Colp --- diff --git a/xen/include/public/mem_event.h b/xen/include/public/mem_event.h new file mode 100644 index 0000000000..4b0917324e --- /dev/null +++ b/xen/include/public/mem_event.h @@ -0,0 +1,67 @@ +/****************************************************************************** + * mem_event.h + * + * Memory event common structures. + * + * Copyright (c) 2009 by Citrix (R&D) Ltd. (Patrick Colp) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _XEN_PUBLIC_MEM_EVENT_H +#define _XEN_PUBLIC_MEM_EVENT_H + + +#include "xen.h" +#include "io/ring.h" + + +/* Memory event notification modes */ +#define MEM_EVENT_MODE_ASYNC 0 +#define MEM_EVENT_MODE_SYNC (1 << 0) +#define MEM_EVENT_MODE_SYNC_ALL (1 << 1) + +/* Memory event flags */ +#define MEM_EVENT_FLAG_PAUSED (1 << 0) + + +typedef struct mem_event_shared_page { + int port; +} mem_event_shared_page_t; + +typedef struct mem_event_st { + unsigned long gfn; + unsigned long offset; + unsigned long p2mt; + int vcpu_id; + uint64_t flags; +} mem_event_request_t, mem_event_response_t; + + +DEFINE_RING_TYPES(mem_event, mem_event_request_t, mem_event_response_t); + + +#endif + + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index d46b1dd37e..22161ae769 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -146,6 +146,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t); #define VIRQ_XENOPROF 7 /* V. XenOprofile interrupt: new sample available */ #define VIRQ_CON_RING 8 /* G. (DOM0) Bytes received on console */ #define VIRQ_PCPU_STATE 9 /* G. (DOM0) PCPU state changed */ +#define VIRQ_MEM_EVENT 10 /* G. (DOM0) A memory event has occured */ /* Architecture-specific VIRQ definitions. */ #define VIRQ_ARCH_0 16 diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 2a5ee1f116..40593946c1 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -20,6 +20,7 @@ #include #include #include +#include #ifdef CONFIG_COMPAT #include @@ -161,6 +162,32 @@ struct vcpu #define domain_unlock(d) spin_unlock_recursive(&(d)->domain_lock) #define domain_is_locked(d) spin_is_locked(&(d)->domain_lock) +/* Memory event */ +struct mem_event_domain +{ + /* ring lock */ + spinlock_t ring_lock; + /* shared page */ + mem_event_shared_page_t *shared_page; + /* shared ring page */ + void *ring_page; + /* front-end ring */ + mem_event_front_ring_t front_ring; + /* if domain has been paused due to ring contention */ + bool_t paused; + int paused_vcpus[MAX_VIRT_CPUS]; + /* the memory event mode */ + unsigned long mode; + /* domain to receive memory events */ + struct domain *domain; + /* enabled? */ + bool_t enabled; + /* event channel port (vcpu0 only) */ + int xen_port; + /* tasklet */ + struct tasklet tasklet; +}; + struct domain { domid_t domain_id; @@ -277,6 +304,9 @@ struct domain /* Non-migratable and non-restoreable? */ bool_t disable_migrate; + + /* Memory paging support */ + struct mem_event_domain mem_event; }; struct domain_setup_info