ANDROID: KVM: arm64: Pad IOMMU structs for KMI

KMI is going to be frozen soon, so add padding in IOMMU structs as
it can be helpful to update the driver without changing the ABI.

The updated structs are:
kvm_iommu_ops: kvm_iommu_driver: reserve 8 qwords, this is only
instantiated once, and the most likely one to change, as it
implements the callbacks between the IOMMU code and the hypervisor module.

kvm_iommu_driver: reserve 8 qwords, this is only instantiated once,
this implements the callbacks between the IOMMU code and the kernel module.

kvm_hyp_iommu: reserve 4 qwords, instantiated once per-iommu.

kvm_hyp_iommu_domain: reserve 2 qwords, this is the most instantiated
struct, so we don’t add a lot of padding.

iommu_iotlb_gather: reserve 2 qwords, in case we need to add hypervisor
specific logic in the future.

io_pgtable_ops: reserve 4 qwords, instantiated once per iommu domain.

Bug: 357781595
Bug: 384432312
Change-Id: I1c5c9e0dd4fe1b422c8a20e23df6b9e10f646071
Signed-off-by: Mostafa Saleh <smostafa@google.com>
This commit is contained in:
Mostafa Saleh
2024-05-09 13:59:07 +00:00
parent d0b6d7deda
commit d4772b152b
5 changed files with 31 additions and 0 deletions
+9
View File
@@ -11,6 +11,7 @@
#ifndef __ARM64_KVM_HOST_H__
#define __ARM64_KVM_HOST_H__
#include <linux/android_kabi.h>
#include <linux/arm-smccc.h>
#include <linux/bitmap.h>
#include <linux/types.h>
@@ -1667,6 +1668,14 @@ struct kvm_iommu_driver {
int (*init_driver)(void);
void (*remove_driver)(void);
pkvm_handle_t (*get_iommu_id)(struct device *dev);
ANDROID_KABI_RESERVE(1);
ANDROID_KABI_RESERVE(2);
ANDROID_KABI_RESERVE(3);
ANDROID_KABI_RESERVE(4);
ANDROID_KABI_RESERVE(5);
ANDROID_KABI_RESERVE(6);
ANDROID_KABI_RESERVE(7);
ANDROID_KABI_RESERVE(8);
};
struct kvm_iommu_ops;
+8
View File
@@ -64,6 +64,14 @@ struct kvm_iommu_ops {
phys_addr_t start, phys_addr_t end, int prot);
int (*suspend)(struct kvm_hyp_iommu *iommu);
int (*resume)(struct kvm_hyp_iommu *iommu);
ANDROID_KABI_RESERVE(1);
ANDROID_KABI_RESERVE(2);
ANDROID_KABI_RESERVE(3);
ANDROID_KABI_RESERVE(4);
ANDROID_KABI_RESERVE(5);
ANDROID_KABI_RESERVE(6);
ANDROID_KABI_RESERVE(7);
ANDROID_KABI_RESERVE(8);
};
int kvm_iommu_init(struct kvm_iommu_ops *ops,
+6
View File
@@ -24,6 +24,8 @@ struct kvm_hyp_iommu_domain {
atomic_t refs;
pkvm_handle_t domain_id;
void *priv;
ANDROID_KABI_RESERVE(1);
ANDROID_KABI_RESERVE(2);
};
extern void **kvm_nvhe_sym(kvm_hyp_iommu_domains);
@@ -63,6 +65,10 @@ struct kvm_hyp_iommu {
#endif
struct kvm_power_domain power_domain;
bool power_is_off;
ANDROID_KABI_RESERVE(1);
ANDROID_KABI_RESERVE(2);
ANDROID_KABI_RESERVE(3);
ANDROID_KABI_RESERVE(4);
};
#endif /* __KVM_IOMMU_H */
+5
View File
@@ -2,6 +2,7 @@
#ifndef __IO_PGTABLE_H
#define __IO_PGTABLE_H
#include <linux/android_kabi.h>
#include <linux/bitops.h>
#include <linux/iommu.h>
@@ -237,6 +238,10 @@ struct io_pgtable_ops {
unsigned long iova, size_t size,
unsigned long flags,
struct iommu_dirty_bitmap *dirty);
ANDROID_KABI_RESERVE(1);
ANDROID_KABI_RESERVE(2);
ANDROID_KABI_RESERVE(3);
ANDROID_KABI_RESERVE(4);
};
/**
+3
View File
@@ -7,6 +7,7 @@
#ifndef __LINUX_IOMMU_H
#define __LINUX_IOMMU_H
#include <linux/android_kabi.h>
#include <linux/scatterlist.h>
#include <linux/device.h>
#include <linux/types.h>
@@ -348,6 +349,8 @@ struct iommu_iotlb_gather {
size_t pgsize;
struct list_head freelist;
bool queued;
ANDROID_KABI_RESERVE(1);
ANDROID_KABI_RESERVE(2);
};
/**