Commit 5f8b2591 authored by Marc Zyngier's avatar Marc Zyngier

Merge branch kvm-arm64/memory-accounting into kvmarm-master/next

* kvm-arm64/memory-accounting:
  : .
  : Sprinkle a bunch of GFP_KERNEL_ACCOUNT all over the code base
  : to better track memory allocation made on behalf of a VM.
  : .
  KVM: arm64: Add memcg accounting to KVM allocations
  KVM: arm64: vgic: Add memcg accounting to vgic allocations
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parents 551a1334 115bae92
...@@ -291,10 +291,12 @@ long kvm_arch_dev_ioctl(struct file *filp, ...@@ -291,10 +291,12 @@ long kvm_arch_dev_ioctl(struct file *filp,
struct kvm *kvm_arch_alloc_vm(void) struct kvm *kvm_arch_alloc_vm(void)
{ {
size_t sz = sizeof(struct kvm);
if (!has_vhe()) if (!has_vhe())
return kzalloc(sizeof(struct kvm), GFP_KERNEL); return kzalloc(sz, GFP_KERNEL_ACCOUNT);
return vzalloc(sizeof(struct kvm)); return __vmalloc(sz, GFP_KERNEL_ACCOUNT | __GFP_HIGHMEM | __GFP_ZERO);
} }
void kvm_arch_free_vm(struct kvm *kvm) void kvm_arch_free_vm(struct kvm *kvm)
......
...@@ -512,7 +512,7 @@ int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu) ...@@ -512,7 +512,7 @@ int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu)
return -EINVAL; return -EINVAL;
} }
pgt = kzalloc(sizeof(*pgt), GFP_KERNEL); pgt = kzalloc(sizeof(*pgt), GFP_KERNEL_ACCOUNT);
if (!pgt) if (!pgt)
return -ENOMEM; return -ENOMEM;
......
...@@ -978,7 +978,7 @@ int kvm_arm_pmu_v3_set_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr) ...@@ -978,7 +978,7 @@ int kvm_arm_pmu_v3_set_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr)
mutex_lock(&vcpu->kvm->lock); mutex_lock(&vcpu->kvm->lock);
if (!vcpu->kvm->arch.pmu_filter) { if (!vcpu->kvm->arch.pmu_filter) {
vcpu->kvm->arch.pmu_filter = bitmap_alloc(nr_events, GFP_KERNEL); vcpu->kvm->arch.pmu_filter = bitmap_alloc(nr_events, GFP_KERNEL_ACCOUNT);
if (!vcpu->kvm->arch.pmu_filter) { if (!vcpu->kvm->arch.pmu_filter) {
mutex_unlock(&vcpu->kvm->lock); mutex_unlock(&vcpu->kvm->lock);
return -ENOMEM; return -ENOMEM;
......
...@@ -106,7 +106,7 @@ static int kvm_vcpu_finalize_sve(struct kvm_vcpu *vcpu) ...@@ -106,7 +106,7 @@ static int kvm_vcpu_finalize_sve(struct kvm_vcpu *vcpu)
vl > SVE_VL_ARCH_MAX)) vl > SVE_VL_ARCH_MAX))
return -EIO; return -EIO;
buf = kzalloc(SVE_SIG_REGS_SIZE(sve_vq_from_vl(vl)), GFP_KERNEL); buf = kzalloc(SVE_SIG_REGS_SIZE(sve_vq_from_vl(vl)), GFP_KERNEL_ACCOUNT);
if (!buf) if (!buf)
return -ENOMEM; return -ENOMEM;
......
...@@ -134,7 +134,7 @@ static int kvm_vgic_dist_init(struct kvm *kvm, unsigned int nr_spis) ...@@ -134,7 +134,7 @@ static int kvm_vgic_dist_init(struct kvm *kvm, unsigned int nr_spis)
struct kvm_vcpu *vcpu0 = kvm_get_vcpu(kvm, 0); struct kvm_vcpu *vcpu0 = kvm_get_vcpu(kvm, 0);
int i; int i;
dist->spis = kcalloc(nr_spis, sizeof(struct vgic_irq), GFP_KERNEL); dist->spis = kcalloc(nr_spis, sizeof(struct vgic_irq), GFP_KERNEL_ACCOUNT);
if (!dist->spis) if (!dist->spis)
return -ENOMEM; return -ENOMEM;
......
...@@ -139,7 +139,7 @@ int kvm_vgic_setup_default_irq_routing(struct kvm *kvm) ...@@ -139,7 +139,7 @@ int kvm_vgic_setup_default_irq_routing(struct kvm *kvm)
u32 nr = dist->nr_spis; u32 nr = dist->nr_spis;
int i, ret; int i, ret;
entries = kcalloc(nr, sizeof(*entries), GFP_KERNEL); entries = kcalloc(nr, sizeof(*entries), GFP_KERNEL_ACCOUNT);
if (!entries) if (!entries)
return -ENOMEM; return -ENOMEM;
......
...@@ -48,7 +48,7 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid, ...@@ -48,7 +48,7 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
if (irq) if (irq)
return irq; return irq;
irq = kzalloc(sizeof(struct vgic_irq), GFP_KERNEL); irq = kzalloc(sizeof(struct vgic_irq), GFP_KERNEL_ACCOUNT);
if (!irq) if (!irq)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -332,7 +332,7 @@ int vgic_copy_lpi_list(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 **intid_ptr) ...@@ -332,7 +332,7 @@ int vgic_copy_lpi_list(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 **intid_ptr)
* we must be careful not to overrun the array. * we must be careful not to overrun the array.
*/ */
irq_count = READ_ONCE(dist->lpi_list_count); irq_count = READ_ONCE(dist->lpi_list_count);
intids = kmalloc_array(irq_count, sizeof(intids[0]), GFP_KERNEL); intids = kmalloc_array(irq_count, sizeof(intids[0]), GFP_KERNEL_ACCOUNT);
if (!intids) if (!intids)
return -ENOMEM; return -ENOMEM;
...@@ -985,7 +985,7 @@ static int vgic_its_alloc_collection(struct vgic_its *its, ...@@ -985,7 +985,7 @@ static int vgic_its_alloc_collection(struct vgic_its *its,
if (!vgic_its_check_id(its, its->baser_coll_table, coll_id, NULL)) if (!vgic_its_check_id(its, its->baser_coll_table, coll_id, NULL))
return E_ITS_MAPC_COLLECTION_OOR; return E_ITS_MAPC_COLLECTION_OOR;
collection = kzalloc(sizeof(*collection), GFP_KERNEL); collection = kzalloc(sizeof(*collection), GFP_KERNEL_ACCOUNT);
if (!collection) if (!collection)
return -ENOMEM; return -ENOMEM;
...@@ -1029,7 +1029,7 @@ static struct its_ite *vgic_its_alloc_ite(struct its_device *device, ...@@ -1029,7 +1029,7 @@ static struct its_ite *vgic_its_alloc_ite(struct its_device *device,
{ {
struct its_ite *ite; struct its_ite *ite;
ite = kzalloc(sizeof(*ite), GFP_KERNEL); ite = kzalloc(sizeof(*ite), GFP_KERNEL_ACCOUNT);
if (!ite) if (!ite)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -1150,7 +1150,7 @@ static struct its_device *vgic_its_alloc_device(struct vgic_its *its, ...@@ -1150,7 +1150,7 @@ static struct its_device *vgic_its_alloc_device(struct vgic_its *its,
{ {
struct its_device *device; struct its_device *device;
device = kzalloc(sizeof(*device), GFP_KERNEL); device = kzalloc(sizeof(*device), GFP_KERNEL_ACCOUNT);
if (!device) if (!device)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -1847,7 +1847,7 @@ void vgic_lpi_translation_cache_init(struct kvm *kvm) ...@@ -1847,7 +1847,7 @@ void vgic_lpi_translation_cache_init(struct kvm *kvm)
struct vgic_translation_cache_entry *cte; struct vgic_translation_cache_entry *cte;
/* An allocation failure is not fatal */ /* An allocation failure is not fatal */
cte = kzalloc(sizeof(*cte), GFP_KERNEL); cte = kzalloc(sizeof(*cte), GFP_KERNEL_ACCOUNT);
if (WARN_ON(!cte)) if (WARN_ON(!cte))
break; break;
...@@ -1888,7 +1888,7 @@ static int vgic_its_create(struct kvm_device *dev, u32 type) ...@@ -1888,7 +1888,7 @@ static int vgic_its_create(struct kvm_device *dev, u32 type)
if (type != KVM_DEV_TYPE_ARM_VGIC_ITS) if (type != KVM_DEV_TYPE_ARM_VGIC_ITS)
return -ENODEV; return -ENODEV;
its = kzalloc(sizeof(struct vgic_its), GFP_KERNEL); its = kzalloc(sizeof(struct vgic_its), GFP_KERNEL_ACCOUNT);
if (!its) if (!its)
return -ENOMEM; return -ENOMEM;
......
...@@ -836,7 +836,7 @@ static int vgic_v3_alloc_redist_region(struct kvm *kvm, uint32_t index, ...@@ -836,7 +836,7 @@ static int vgic_v3_alloc_redist_region(struct kvm *kvm, uint32_t index,
if (vgic_v3_rdist_overlap(kvm, base, size)) if (vgic_v3_rdist_overlap(kvm, base, size))
return -EINVAL; return -EINVAL;
rdreg = kzalloc(sizeof(*rdreg), GFP_KERNEL); rdreg = kzalloc(sizeof(*rdreg), GFP_KERNEL_ACCOUNT);
if (!rdreg) if (!rdreg)
return -ENOMEM; return -ENOMEM;
......
...@@ -246,7 +246,7 @@ int vgic_v4_init(struct kvm *kvm) ...@@ -246,7 +246,7 @@ int vgic_v4_init(struct kvm *kvm)
nr_vcpus = atomic_read(&kvm->online_vcpus); nr_vcpus = atomic_read(&kvm->online_vcpus);
dist->its_vm.vpes = kcalloc(nr_vcpus, sizeof(*dist->its_vm.vpes), dist->its_vm.vpes = kcalloc(nr_vcpus, sizeof(*dist->its_vm.vpes),
GFP_KERNEL); GFP_KERNEL_ACCOUNT);
if (!dist->its_vm.vpes) if (!dist->its_vm.vpes)
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment