/root/src/xen/xen/include/asm/mem_sharing.h
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * include/asm-x86/mem_sharing.h |
3 | | * |
4 | | * Memory sharing support. |
5 | | * |
6 | | * Copyright (c) 2009 Citrix Systems, Inc. (Grzegorz Milos) |
7 | | * |
8 | | * This program is free software; you can redistribute it and/or modify |
9 | | * it under the terms of the GNU General Public License as published by |
10 | | * the Free Software Foundation; either version 2 of the License, or |
11 | | * (at your option) any later version. |
12 | | * |
13 | | * This program is distributed in the hope that it will be useful, |
14 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | | * GNU General Public License for more details. |
17 | | * |
18 | | * You should have received a copy of the GNU General Public License |
19 | | * along with this program; If not, see <http://www.gnu.org/licenses/>. |
20 | | */ |
21 | | #ifndef __MEM_SHARING_H__ |
22 | | #define __MEM_SHARING_H__ |
23 | | |
24 | | #include <public/domctl.h> |
25 | | #include <public/memory.h> |
26 | | |
27 | | /* Auditing of memory sharing code? */ |
28 | | #define MEM_SHARING_AUDIT 1 |
29 | | |
30 | | typedef uint64_t shr_handle_t; |
31 | | |
32 | | typedef struct rmap_hashtab { |
33 | | struct list_head *bucket; |
34 | | /* Overlaps with prev pointer of list_head in union below. |
35 | | * Unlike the prev pointer, this can be NULL. */ |
36 | | void *flag; |
37 | | } rmap_hashtab_t; |
38 | | |
39 | | struct page_sharing_info |
40 | | { |
41 | | struct page_info *pg; /* Back pointer to the page. */ |
42 | | shr_handle_t handle; /* Globally unique version / handle. */ |
43 | | #if MEM_SHARING_AUDIT |
44 | | struct list_head entry; /* List of all shared pages (entry). */ |
45 | | struct rcu_head rcu_head; /* List of all shared pages (entry). */ |
46 | | #endif |
47 | | /* Reverse map of <domain,gfn> tuples for this shared frame. */ |
48 | | union { |
49 | | struct list_head gfns; |
50 | | rmap_hashtab_t hash_table; |
51 | | }; |
52 | | }; |
53 | | |
54 | | #define sharing_supported(_d) \ |
55 | | (is_hvm_domain(_d) && paging_mode_hap(_d)) |
56 | | |
57 | | unsigned int mem_sharing_get_nr_saved_mfns(void); |
58 | | unsigned int mem_sharing_get_nr_shared_mfns(void); |
59 | | |
60 | 0 | #define MEM_SHARING_DESTROY_GFN (1<<1) |
61 | | /* Only fails with -ENOMEM. Enforce it with a BUG_ON wrapper. */ |
62 | | int __mem_sharing_unshare_page(struct domain *d, |
63 | | unsigned long gfn, |
64 | | uint16_t flags); |
65 | | static inline int mem_sharing_unshare_page(struct domain *d, |
66 | | unsigned long gfn, |
67 | | uint16_t flags) |
68 | 0 | { |
69 | 0 | int rc = __mem_sharing_unshare_page(d, gfn, flags); |
70 | 0 | BUG_ON( rc && (rc != -ENOMEM) ); |
71 | 0 | return rc; |
72 | 0 | } Unexecuted instantiation: domctl.c:mem_sharing_unshare_page Unexecuted instantiation: domain.c:mem_sharing_unshare_page Unexecuted instantiation: event_channel.c:mem_sharing_unshare_page Unexecuted instantiation: event_fifo.c:mem_sharing_unshare_page Unexecuted instantiation: grant_table.c:mem_sharing_unshare_page Unexecuted instantiation: guestcopy.c:mem_sharing_unshare_page Unexecuted instantiation: kernel.c:mem_sharing_unshare_page Unexecuted instantiation: kexec.c:mem_sharing_unshare_page Unexecuted instantiation: kimage.c:mem_sharing_unshare_page Unexecuted instantiation: mem_access.c:mem_sharing_unshare_page Unexecuted instantiation: memory.c:mem_sharing_unshare_page Unexecuted instantiation: multicall.c:mem_sharing_unshare_page Unexecuted instantiation: page_alloc.c:mem_sharing_unshare_page Unexecuted instantiation: sched_arinc653.c:mem_sharing_unshare_page Unexecuted instantiation: sched_rt.c:mem_sharing_unshare_page Unexecuted instantiation: schedule.c:mem_sharing_unshare_page Unexecuted instantiation: spinlock.c:mem_sharing_unshare_page Unexecuted instantiation: symbols.c:mem_sharing_unshare_page Unexecuted instantiation: sysctl.c:mem_sharing_unshare_page Unexecuted instantiation: vm_event.c:mem_sharing_unshare_page Unexecuted instantiation: xenoprof.c:mem_sharing_unshare_page Unexecuted instantiation: tmem.c:mem_sharing_unshare_page Unexecuted instantiation: tmem_xen.c:mem_sharing_unshare_page Unexecuted instantiation: tmem_control.c:mem_sharing_unshare_page Unexecuted instantiation: llvm.c:mem_sharing_unshare_page Unexecuted instantiation: libelf-loader.c:mem_sharing_unshare_page Unexecuted instantiation: console.c:mem_sharing_unshare_page Unexecuted instantiation: cpufreq.c:mem_sharing_unshare_page Unexecuted instantiation: iommu.c:mem_sharing_unshare_page Unexecuted instantiation: io.c:mem_sharing_unshare_page Unexecuted instantiation: pci.c:mem_sharing_unshare_page Unexecuted instantiation: iommu_map.c:mem_sharing_unshare_page Unexecuted instantiation: pci_amd_iommu.c:mem_sharing_unshare_page Unexecuted instantiation: iommu_guest.c:mem_sharing_unshare_page Unexecuted instantiation: pmstat.c:mem_sharing_unshare_page Unexecuted instantiation: compat.c:mem_sharing_unshare_page Unexecuted instantiation: crash.c:mem_sharing_unshare_page Unexecuted instantiation: debug.c:mem_sharing_unshare_page Unexecuted instantiation: i387.c:mem_sharing_unshare_page Unexecuted instantiation: msi.c:mem_sharing_unshare_page Unexecuted instantiation: machine_kexec.c:mem_sharing_unshare_page Unexecuted instantiation: microcode.c:mem_sharing_unshare_page Unexecuted instantiation: mm.c:mem_sharing_unshare_page Unexecuted instantiation: physdev.c:mem_sharing_unshare_page Unexecuted instantiation: platform_hypercall.c:mem_sharing_unshare_page Unexecuted instantiation: setup.c:mem_sharing_unshare_page Unexecuted instantiation: smp.c:mem_sharing_unshare_page Unexecuted instantiation: time.c:mem_sharing_unshare_page Unexecuted instantiation: traps.c:mem_sharing_unshare_page Unexecuted instantiation: xstate.c:mem_sharing_unshare_page Unexecuted instantiation: suspend.c:mem_sharing_unshare_page Unexecuted instantiation: cpu_idle.c:mem_sharing_unshare_page Unexecuted instantiation: amd.c:mem_sharing_unshare_page Unexecuted instantiation: intel.c:mem_sharing_unshare_page Unexecuted instantiation: vpmu.c:mem_sharing_unshare_page Unexecuted instantiation: vpmu_intel.c:mem_sharing_unshare_page Unexecuted instantiation: mce.c:mem_sharing_unshare_page Unexecuted instantiation: mce_intel.c:mem_sharing_unshare_page Unexecuted instantiation: vmce.c:mem_sharing_unshare_page Unexecuted instantiation: dm.c:mem_sharing_unshare_page Unexecuted instantiation: emulate.c:mem_sharing_unshare_page Unexecuted instantiation: hpet.c:mem_sharing_unshare_page Unexecuted instantiation: hvm.c:mem_sharing_unshare_page Unexecuted instantiation: hypercall.c:mem_sharing_unshare_page Unexecuted instantiation: i8254.c:mem_sharing_unshare_page Unexecuted instantiation: intercept.c:mem_sharing_unshare_page Unexecuted instantiation: ioreq.c:mem_sharing_unshare_page Unexecuted instantiation: irq.c:mem_sharing_unshare_page Unexecuted instantiation: mtrr.c:mem_sharing_unshare_page Unexecuted instantiation: nestedhvm.c:mem_sharing_unshare_page Unexecuted instantiation: pmtimer.c:mem_sharing_unshare_page Unexecuted instantiation: quirks.c:mem_sharing_unshare_page Unexecuted instantiation: rtc.c:mem_sharing_unshare_page Unexecuted instantiation: save.c:mem_sharing_unshare_page Unexecuted instantiation: stdvga.c:mem_sharing_unshare_page Unexecuted instantiation: vioapic.c:mem_sharing_unshare_page Unexecuted instantiation: viridian.c:mem_sharing_unshare_page Unexecuted instantiation: vlapic.c:mem_sharing_unshare_page Unexecuted instantiation: vmsi.c:mem_sharing_unshare_page Unexecuted instantiation: vpic.c:mem_sharing_unshare_page Unexecuted instantiation: vpt.c:mem_sharing_unshare_page Unexecuted instantiation: intr.c:mem_sharing_unshare_page Unexecuted instantiation: nestedsvm.c:mem_sharing_unshare_page Unexecuted instantiation: svm.c:mem_sharing_unshare_page Unexecuted instantiation: vmcb.c:mem_sharing_unshare_page Unexecuted instantiation: realmode.c:mem_sharing_unshare_page Unexecuted instantiation: vmcs.c:mem_sharing_unshare_page Unexecuted instantiation: vmx.c:mem_sharing_unshare_page Unexecuted instantiation: vvmx.c:mem_sharing_unshare_page Unexecuted instantiation: paging.c:mem_sharing_unshare_page Unexecuted instantiation: p2m.c:mem_sharing_unshare_page Unexecuted instantiation: p2m-pt.c:mem_sharing_unshare_page Unexecuted instantiation: p2m-ept.c:mem_sharing_unshare_page Unexecuted instantiation: p2m-pod.c:mem_sharing_unshare_page Unexecuted instantiation: altp2m.c:mem_sharing_unshare_page Unexecuted instantiation: guest_walk.c:mem_sharing_unshare_page Unexecuted instantiation: mem_paging.c:mem_sharing_unshare_page Unexecuted instantiation: mem_sharing.c:mem_sharing_unshare_page Unexecuted instantiation: common.c:mem_sharing_unshare_page Unexecuted instantiation: multi.c:mem_sharing_unshare_page Unexecuted instantiation: hap.c:mem_sharing_unshare_page Unexecuted instantiation: nested_hap.c:mem_sharing_unshare_page Unexecuted instantiation: nested_ept.c:mem_sharing_unshare_page Unexecuted instantiation: op_model_athlon.c:mem_sharing_unshare_page Unexecuted instantiation: backtrace.c:mem_sharing_unshare_page Unexecuted instantiation: callback.c:mem_sharing_unshare_page Unexecuted instantiation: descriptor-tables.c:mem_sharing_unshare_page Unexecuted instantiation: emul-gate-op.c:mem_sharing_unshare_page Unexecuted instantiation: emul-inv-op.c:mem_sharing_unshare_page Unexecuted instantiation: emul-priv-op.c:mem_sharing_unshare_page Unexecuted instantiation: iret.c:mem_sharing_unshare_page Unexecuted instantiation: ro-page-fault.c:mem_sharing_unshare_page |
73 | | |
74 | | /* If called by a foreign domain, possible errors are |
75 | | * -EBUSY -> ring full |
76 | | * -ENOSYS -> no ring to begin with |
77 | | * and the foreign mapper is responsible for retrying. |
78 | | * |
79 | | * If called by the guest vcpu itself and allow_sleep is set, may |
80 | | * sleep on a wait queue, so the caller is responsible for not |
81 | | * holding locks on entry. It may only fail with ENOSYS |
82 | | * |
83 | | * If called by the guest vcpu itself and allow_sleep is not set, |
84 | | * then it's the same as a foreign domain. |
85 | | */ |
86 | | int mem_sharing_notify_enomem(struct domain *d, unsigned long gfn, |
87 | | bool_t allow_sleep); |
88 | | int mem_sharing_memop(XEN_GUEST_HANDLE_PARAM(xen_mem_sharing_op_t) arg); |
89 | | int mem_sharing_domctl(struct domain *d, |
90 | | struct xen_domctl_mem_sharing_op *mec); |
91 | | void mem_sharing_init(void); |
92 | | |
93 | | /* Scans the p2m and relinquishes any shared pages, destroying |
94 | | * those for which this domain holds the final reference. |
95 | | * Preemptible. |
96 | | */ |
97 | | int relinquish_shared_pages(struct domain *d); |
98 | | |
99 | | #endif /* __MEM_SHARING_H__ */ |