diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-12-17 06:27:55 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-12-17 06:27:55 +0000 |
commit | 35b1c10cb4210e14a579e3030d65bb08949ab709 (patch) | |
tree | 7351941b115cadf4fc55495dcd23843e51d8263b | |
parent | b41ecc03e9d1527905dc955b14ada0e8c7171f52 (diff) | |
download | xen-35b1c10cb4210e14a579e3030d65bb08949ab709.tar.gz xen-35b1c10cb4210e14a579e3030d65bb08949ab709.tar.bz2 xen-35b1c10cb4210e14a579e3030d65bb08949ab709.zip |
Memory paging domctl support, which is a sub-operation of the generic memory
event domctl support.
Signed-off-by: Patrick Colp <Patrick.Colp@citrix.com>
-rw-r--r-- | xen/arch/x86/mm/Makefile | 1 | ||||
-rw-r--r-- | xen/arch/x86/mm/mem_event.c | 6 | ||||
-rw-r--r-- | xen/arch/x86/mm/mem_paging.c | 79 | ||||
-rw-r--r-- | xen/include/asm-x86/mem_paging.h | 35 | ||||
-rw-r--r-- | xen/include/public/domctl.h | 12 |
5 files changed, 133 insertions, 0 deletions
diff --git a/xen/arch/x86/mm/Makefile b/xen/arch/x86/mm/Makefile index d4ffe37af5..c68cb8b0df 100644 --- a/xen/arch/x86/mm/Makefile +++ b/xen/arch/x86/mm/Makefile @@ -7,6 +7,7 @@ obj-y += guest_walk_2.o obj-y += guest_walk_3.o obj-$(x86_64) += guest_walk_4.o obj-y += mem_event.o +obj-y += mem_paging.o guest_walk_%.o: guest_walk.c Makefile $(CC) $(CFLAGS) -DGUEST_PAGING_LEVELS=$* -c $< -o $@ diff --git a/xen/arch/x86/mm/mem_event.c b/xen/arch/x86/mm/mem_event.c index 5701bfee42..a89c7b9b50 100644 --- a/xen/arch/x86/mm/mem_event.c +++ b/xen/arch/x86/mm/mem_event.c @@ -24,6 +24,7 @@ #include <xen/event.h> #include <asm/p2m.h> #include <asm/mem_event.h> +#include <asm/mem_paging.h> #define xen_mb() mb() @@ -274,8 +275,13 @@ int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec, } } else + { rc = -ENOSYS; + if ( mec->mode & XEN_DOMCTL_MEM_EVENT_OP_PAGING ) + rc = mem_paging_domctl(d, mec, u_domctl); + } + return rc; } diff --git a/xen/arch/x86/mm/mem_paging.c b/xen/arch/x86/mm/mem_paging.c new file mode 100644 index 0000000000..6b41d674c3 --- /dev/null +++ b/xen/arch/x86/mm/mem_paging.c @@ -0,0 +1,79 @@ +/****************************************************************************** + * arch/x86/mm/mem_paging.c + * + * Memory paging support. + * + * Copyright (c) 2009 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 + */ + + +#include <asm/p2m.h> +#include <asm/mem_event.h> + + +int mem_paging_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec, + XEN_GUEST_HANDLE(void) u_domctl) +{ + int rc; + + switch( mec->op ) + { + case XEN_DOMCTL_MEM_EVENT_OP_PAGING_NOMINATE: + { + unsigned long gfn = mec->gfn; + rc = p2m_mem_paging_nominate(d, gfn); + } + break; + + case XEN_DOMCTL_MEM_EVENT_OP_PAGING_EVICT: + { + unsigned long gfn = mec->gfn; + rc = p2m_mem_paging_evict(d, gfn); + } + break; + + case XEN_DOMCTL_MEM_EVENT_OP_PAGING_PREP: + { + unsigned long gfn = mec->gfn; + rc = p2m_mem_paging_prep(d, gfn); + } + break; + + case XEN_DOMCTL_MEM_EVENT_OP_PAGING_RESUME: + { + p2m_mem_paging_resume(d); + rc = 0; + } + break; + + default: + rc = -ENOSYS; + break; + } + + return rc; +} + + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/asm-x86/mem_paging.h b/xen/include/asm-x86/mem_paging.h new file mode 100644 index 0000000000..d66f6e62b1 --- /dev/null +++ b/xen/include/asm-x86/mem_paging.h @@ -0,0 +1,35 @@ +/****************************************************************************** + * include/asm-x86/mem_paging.h + * + * Memory paging support. + * + * Copyright (c) 2009 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 + */ + + +int mem_paging_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec, + XEN_GUEST_HANDLE(void) u_domctl); + + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 7a378a3519..a9faa876e2 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -140,6 +140,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_getmemlist_t); #define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7U<<28) #define XEN_DOMCTL_PFINFO_LPINTAB (0x1U<<31) #define XEN_DOMCTL_PFINFO_XTAB (0xfU<<28) /* invalid page */ +#define XEN_DOMCTL_PFINFO_PAGEDTAB (0x8U<<28) #define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28) struct xen_domctl_getpageframeinfo { @@ -701,6 +702,17 @@ struct xen_domctl_gdbsx_domstatus { #define XEN_DOMCTL_MEM_EVENT_OP_ENABLE 0 #define XEN_DOMCTL_MEM_EVENT_OP_DISABLE 1 +/* + * Page memory in and out. + */ +#define XEN_DOMCTL_MEM_EVENT_OP_PAGING (1 << 0) + +/* Domain memory paging */ +#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_NOMINATE 0 +#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_EVICT 1 +#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_PREP 2 +#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_RESUME 3 + struct xen_domctl_mem_event_op { uint32_t op; /* XEN_DOMCTL_MEM_EVENT_OP_* */ uint32_t mode; /* XEN_DOMCTL_MEM_EVENT_ENABLE_* */ |