arch/s390/kvm/gmap.h

Source file repositories/reference/linux-study-clean/arch/s390/kvm/gmap.h

File Facts

System
Linux kernel
Corpus path
arch/s390/kvm/gmap.h
Extension
.h
Size
11753 bytes
Lines
324
Domain
Architecture Layer
Bucket
arch/s390
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

struct gmap {
	unsigned long flags;
	unsigned char edat_level;
	bool invalidated;
	struct kvm *kvm;
	union asce asce;
	struct list_head list;
	spinlock_t children_lock;	/* Protects: children, scb_users */
	struct list_head children;
	struct list_head scb_users;
	struct gmap *parent;
	union asce guest_asce;
	spinlock_t host_to_rmap_lock;	/* Protects host_to_rmap */
	struct radix_tree_root host_to_rmap;
	refcount_t refcount;
};

struct gmap_cache {
	struct list_head list;
	struct gmap *gmap;
};

#define gmap_for_each_rmap_safe(pos, n, head) \
	for (pos = (head); n = pos ? pos->next : NULL, pos; pos = n)

int s390_replace_asce(struct gmap *gmap);
bool _gmap_unmap_prefix(struct gmap *gmap, gfn_t gfn, gfn_t end, bool hint);
bool gmap_age_gfn(struct gmap *gmap, gfn_t start, gfn_t end);
bool gmap_unmap_gfn_range(struct gmap *gmap, struct kvm_memory_slot *slot, gfn_t start, gfn_t end);
int gmap_try_fixup_minor(struct gmap *gmap, struct guest_fault *fault);
struct gmap *gmap_new(struct kvm *kvm, gfn_t limit);
struct gmap *gmap_new_child(struct gmap *parent, gfn_t limit);
void gmap_remove_child(struct gmap *child);
void gmap_dispose(struct gmap *gmap);
int gmap_link(struct kvm_s390_mmu_cache *mc, struct gmap *gmap, struct guest_fault *fault,
	      struct kvm_memory_slot *slot);
void gmap_sync_dirty_log(struct gmap *gmap, gfn_t start, gfn_t end);
int gmap_set_limit(struct gmap *gmap, gfn_t limit);
int gmap_ucas_translate(struct kvm_s390_mmu_cache *mc, struct gmap *gmap, gpa_t *gaddr);
int gmap_ucas_map(struct gmap *gmap, gfn_t p_gfn, gfn_t c_gfn, unsigned long count);
void gmap_ucas_unmap(struct gmap *gmap, gfn_t c_gfn, unsigned long count);
int gmap_enable_skeys(struct gmap *gmap);
int gmap_pv_destroy_range(struct gmap *gmap, gfn_t start, gfn_t end, bool interruptible);
int gmap_insert_rmap(struct kvm_s390_mmu_cache *mc, struct gmap *sg, gfn_t p_gfn,
		     gfn_t r_gfn, int level);
int gmap_protect_rmap(struct kvm_s390_mmu_cache *mc, struct gmap *sg, gfn_t p_gfn, gfn_t r_gfn,
		      kvm_pfn_t pfn, int level, bool wr);
void gmap_set_cmma_all_dirty(struct gmap *gmap);
void _gmap_handle_vsie_unshadow_event(struct gmap *parent, gfn_t gfn);
struct gmap *gmap_create_shadow(struct kvm_s390_mmu_cache *mc, struct gmap *gmap,
				union asce asce, int edat_level);
void gmap_split_huge_pages(struct gmap *gmap);

static inline bool uses_skeys(struct gmap *gmap)
{
	return test_bit(GMAP_FLAG_USES_SKEYS, &gmap->flags);
}

static inline bool uses_cmm(struct gmap *gmap)
{
	return test_bit(GMAP_FLAG_USES_CMM, &gmap->flags);
}

static inline bool pfault_enabled(struct gmap *gmap)
{
	return test_bit(GMAP_FLAG_PFAULT_ENABLED, &gmap->flags);
}

static inline bool is_ucontrol(struct gmap *gmap)
{
	return test_bit(GMAP_FLAG_IS_UCONTROL, &gmap->flags);
}

static inline bool is_shadow(struct gmap *gmap)
{
	return test_bit(GMAP_FLAG_SHADOW, &gmap->flags);
}

static inline bool owns_page_tables(struct gmap *gmap)
{
	return test_bit(GMAP_FLAG_OWNS_PAGETABLES, &gmap->flags);
}

static inline struct gmap *gmap_put(struct gmap *gmap)
{
	if (refcount_dec_and_test(&gmap->refcount))
		gmap_dispose(gmap);
	return NULL;
}

Annotation

Implementation Notes