Coverage Report

Created: 2017-10-25 09:10

/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__ */