arch/powerpc/kvm/book3s_hv_uvmem.c
Source file repositories/reference/linux-study-clean/arch/powerpc/kvm/book3s_hv_uvmem.c
File Facts
- System
- Linux kernel
- Corpus path
arch/powerpc/kvm/book3s_hv_uvmem.c- Extension
.c- Size
- 34291 bytes
- Lines
- 1224
- Domain
- Architecture Layer
- Bucket
- arch/powerpc
- 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.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/pagemap.hlinux/migrate.hlinux/kvm_host.hlinux/ksm.hlinux/of.hlinux/memremap.hasm/ultravisor.hasm/mman.hasm/kvm_ppc.hasm/kvm_book3s_uvmem.h
Detected Declarations
struct kvmppc_uvmem_slotstruct kvmppc_uvmem_page_pvtfunction kvmppc_uvmem_availablefunction kvmppc_uvmem_slot_initfunction kvmppc_uvmem_slot_freefunction kvmppc_mark_gfnfunction list_for_each_entryfunction kvmppc_gfn_secure_uvmem_pfnfunction kvmppc_gfn_secure_mem_pfnfunction kvmppc_gfn_sharedfunction kvmppc_gfn_removefunction kvmppc_gfn_is_uvmem_pfnfunction list_for_each_entryfunction kvmppc_next_nontransitioned_gfnfunction list_for_each_entryfunction kvmppc_memslot_page_mergefunction __kvmppc_uvmem_memslot_deletefunction __kvmppc_uvmem_memslot_createfunction kvmppc_h_svm_init_startfunction kvm_for_each_memslotfunction __kvmppc_svm_page_outfunction kvmppc_svm_page_outfunction kvmppc_uvmem_drop_pagesfunction kvmppc_h_svm_init_abortfunction memoryfunction kvmppc_svm_page_infunction kvmppc_uv_migrate_mem_slotfunction kvmppc_h_svm_init_donefunction kvmppc_share_pagefunction kvmppc_h_svm_page_infunction kvmppc_uvmem_migrate_to_ramfunction kvmppc_uvmem_folio_freefunction kvmppc_h_svm_page_outfunction kvmppc_send_page_to_uvfunction kvmppc_uvmem_memslot_createfunction kvmppc_uvmem_memslot_deletefunction kvmppc_get_secmem_sizefunction kvmppc_uvmem_initfunction kvmppc_uvmem_free
Annotated Snippet
struct kvmppc_uvmem_slot {
struct list_head list;
unsigned long nr_pfns;
unsigned long base_pfn;
unsigned long *pfns;
};
struct kvmppc_uvmem_page_pvt {
struct kvm *kvm;
unsigned long gpa;
bool skip_page_out;
bool remove_gfn;
};
bool kvmppc_uvmem_available(void)
{
/*
* If kvmppc_uvmem_bitmap != NULL, then there is an ultravisor
* and our data structures have been initialized successfully.
*/
return !!kvmppc_uvmem_bitmap;
}
int kvmppc_uvmem_slot_init(struct kvm *kvm, const struct kvm_memory_slot *slot)
{
struct kvmppc_uvmem_slot *p;
p = kzalloc_obj(*p);
if (!p)
return -ENOMEM;
p->pfns = vcalloc(slot->npages, sizeof(*p->pfns));
if (!p->pfns) {
kfree(p);
return -ENOMEM;
}
p->nr_pfns = slot->npages;
p->base_pfn = slot->base_gfn;
mutex_lock(&kvm->arch.uvmem_lock);
list_add(&p->list, &kvm->arch.uvmem_pfns);
mutex_unlock(&kvm->arch.uvmem_lock);
return 0;
}
/*
* All device PFNs are already released by the time we come here.
*/
void kvmppc_uvmem_slot_free(struct kvm *kvm, const struct kvm_memory_slot *slot)
{
struct kvmppc_uvmem_slot *p, *next;
mutex_lock(&kvm->arch.uvmem_lock);
list_for_each_entry_safe(p, next, &kvm->arch.uvmem_pfns, list) {
if (p->base_pfn == slot->base_gfn) {
vfree(p->pfns);
list_del(&p->list);
kfree(p);
break;
}
}
mutex_unlock(&kvm->arch.uvmem_lock);
}
static void kvmppc_mark_gfn(unsigned long gfn, struct kvm *kvm,
unsigned long flag, unsigned long uvmem_pfn)
{
struct kvmppc_uvmem_slot *p;
list_for_each_entry(p, &kvm->arch.uvmem_pfns, list) {
if (gfn >= p->base_pfn && gfn < p->base_pfn + p->nr_pfns) {
unsigned long index = gfn - p->base_pfn;
if (flag == KVMPPC_GFN_UVMEM_PFN)
p->pfns[index] = uvmem_pfn | flag;
else
p->pfns[index] = flag;
return;
}
}
}
/* mark the GFN as secure-GFN associated with @uvmem pfn device-PFN. */
static void kvmppc_gfn_secure_uvmem_pfn(unsigned long gfn,
unsigned long uvmem_pfn, struct kvm *kvm)
{
kvmppc_mark_gfn(gfn, kvm, KVMPPC_GFN_UVMEM_PFN, uvmem_pfn);
}
/* mark the GFN as secure-GFN associated with a memory-PFN. */
static void kvmppc_gfn_secure_mem_pfn(unsigned long gfn, struct kvm *kvm)
Annotation
- Immediate include surface: `linux/pagemap.h`, `linux/migrate.h`, `linux/kvm_host.h`, `linux/ksm.h`, `linux/of.h`, `linux/memremap.h`, `asm/ultravisor.h`, `asm/mman.h`.
- Detected declarations: `struct kvmppc_uvmem_slot`, `struct kvmppc_uvmem_page_pvt`, `function kvmppc_uvmem_available`, `function kvmppc_uvmem_slot_init`, `function kvmppc_uvmem_slot_free`, `function kvmppc_mark_gfn`, `function list_for_each_entry`, `function kvmppc_gfn_secure_uvmem_pfn`, `function kvmppc_gfn_secure_mem_pfn`, `function kvmppc_gfn_shared`.
- Atlas domain: Architecture Layer / arch/powerpc.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.