Commit 3ef23167 authored by Jia He's avatar Jia He Committed by Marc Zyngier

KVM: arm64: vgic: Add memcg accounting to vgic allocations

Inspired by commit 254272ce ("kvm: x86: Add memcg accounting to KVM
allocations"), it would be better to make arm64 vgic consistent with
common kvm codes.

The memory allocations of VM scope should be charged into VM process
cgroup, hence change GFP_KERNEL to GFP_KERNEL_ACCOUNT.

There remain a few cases since these allocations are global, not in VM
scope.
Signed-off-by: default avatarJia He <justin.he@arm.com>
Reviewed-by: default avatarOliver Upton <oupton@google.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20210907123112.10232-2-justin.he@arm.com
parent 9e1ff307
...@@ -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;
......
...@@ -834,7 +834,7 @@ static int vgic_v3_alloc_redist_region(struct kvm *kvm, uint32_t index, ...@@ -834,7 +834,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