Skip to content

Commit da55da5

Browse files
jgunthorpejoergroedel
authored andcommitted
iommu/arm-smmu-v3: Make the kunit into a module
It turns out kconfig has problems ensuring the SMMU module and the KUNIT module are consistently y/m to allow linking. It will permit KUNIT to be a module while SMMU is built in. Also, Fedora apparently enables kunit on production kernels. So, put the entire kunit in its own module using the VISIBLE_IF_KUNIT/EXPORT_SYMBOL_IF_KUNIT machinery. This keeps it out of vmlinus on Fedora and makes the kconfig work in the normal way. There is no cost if kunit is disabled. Fixes: 56e1a4c ("iommu/arm-smmu-v3: Add unit tests for arm_smmu_write_entry") Reported-by: Thorsten Leemhuis <linux@leemhuis.info> Link: https://lore.kernel.org/all/aeea8546-5bce-4c51-b506-5d2008e52fef@leemhuis.info Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Tested-by: Thorsten Leemhuis <linux@leemhuis.info> Acked-by: Will Deacon <will@kernel.org> Link: https://lore.kernel.org/r/0-v1-24cba6c0f404+2ae-smmu_kunit_module_jgg@nvidia.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
1 parent 278bd82 commit da55da5

File tree

5 files changed

+15
-2
lines changed

5 files changed

+15
-2
lines changed

drivers/iommu/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ config ARM_SMMU_V3_SVA
415415
and PRI.
416416

417417
config ARM_SMMU_V3_KUNIT_TEST
418-
bool "KUnit tests for arm-smmu-v3 driver" if !KUNIT_ALL_TESTS
418+
tristate "KUnit tests for arm-smmu-v3 driver" if !KUNIT_ALL_TESTS
419419
depends on KUNIT
420420
depends on ARM_SMMU_V3_SVA
421421
default KUNIT_ALL_TESTS

drivers/iommu/arm/arm-smmu-v3/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
obj-$(CONFIG_ARM_SMMU_V3) += arm_smmu_v3.o
33
arm_smmu_v3-objs-y += arm-smmu-v3.o
44
arm_smmu_v3-objs-$(CONFIG_ARM_SMMU_V3_SVA) += arm-smmu-v3-sva.o
5-
arm_smmu_v3-objs-$(CONFIG_ARM_SMMU_V3_KUNIT_TEST) += arm-smmu-v3-test.o
65
arm_smmu_v3-objs := $(arm_smmu_v3-objs-y)
6+
7+
obj-$(CONFIG_ARM_SMMU_V3_KUNIT_TEST) += arm-smmu-v3-test.o

drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ void arm_smmu_make_sva_cd(struct arm_smmu_cd *target,
185185
*/
186186
target->data[3] = cpu_to_le64(read_sysreg(mair_el1));
187187
}
188+
EXPORT_SYMBOL_IF_KUNIT(arm_smmu_make_sva_cd);
188189

189190
static struct arm_smmu_ctx_desc *arm_smmu_alloc_shared_cd(struct mm_struct *mm)
190191
{

drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-test.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,3 +463,6 @@ static struct kunit_suite arm_smmu_v3_test_module = {
463463
.test_cases = arm_smmu_v3_test_cases,
464464
};
465465
kunit_test_suites(&arm_smmu_v3_test_module);
466+
467+
MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING);
468+
MODULE_LICENSE("GPL v2");

drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,6 +1007,7 @@ void arm_smmu_get_ste_used(const __le64 *ent, __le64 *used_bits)
10071007
if (cfg == STRTAB_STE_0_CFG_BYPASS)
10081008
used_bits[1] |= cpu_to_le64(STRTAB_STE_1_SHCFG);
10091009
}
1010+
EXPORT_SYMBOL_IF_KUNIT(arm_smmu_get_ste_used);
10101011

10111012
/*
10121013
* Figure out if we can do a hitless update of entry to become target. Returns a
@@ -1141,6 +1142,7 @@ void arm_smmu_write_entry(struct arm_smmu_entry_writer *writer, __le64 *entry,
11411142
entry_set(writer, entry, target, 0, NUM_ENTRY_QWORDS));
11421143
}
11431144
}
1145+
EXPORT_SYMBOL_IF_KUNIT(arm_smmu_write_entry);
11441146

11451147
static void arm_smmu_sync_cd(struct arm_smmu_master *master,
11461148
int ssid, bool leaf)
@@ -1268,6 +1270,7 @@ void arm_smmu_get_cd_used(const __le64 *ent, __le64 *used_bits)
12681270
used_bits[1] &= ~cpu_to_le64(CTXDESC_CD_1_TTB0_MASK);
12691271
}
12701272
}
1273+
EXPORT_SYMBOL_IF_KUNIT(arm_smmu_get_cd_used);
12711274

12721275
static void arm_smmu_cd_writer_sync_entry(struct arm_smmu_entry_writer *writer)
12731276
{
@@ -1332,6 +1335,7 @@ void arm_smmu_make_s1_cd(struct arm_smmu_cd *target,
13321335
CTXDESC_CD_1_TTB0_MASK);
13331336
target->data[3] = cpu_to_le64(pgtbl_cfg->arm_lpae_s1_cfg.mair);
13341337
}
1338+
EXPORT_SYMBOL_IF_KUNIT(arm_smmu_make_s1_cd);
13351339

13361340
void arm_smmu_clear_cd(struct arm_smmu_master *master, ioasid_t ssid)
13371341
{
@@ -1515,6 +1519,7 @@ void arm_smmu_make_abort_ste(struct arm_smmu_ste *target)
15151519
STRTAB_STE_0_V |
15161520
FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_ABORT));
15171521
}
1522+
EXPORT_SYMBOL_IF_KUNIT(arm_smmu_make_abort_ste);
15181523

15191524
VISIBLE_IF_KUNIT
15201525
void arm_smmu_make_bypass_ste(struct arm_smmu_device *smmu,
@@ -1529,6 +1534,7 @@ void arm_smmu_make_bypass_ste(struct arm_smmu_device *smmu,
15291534
target->data[1] = cpu_to_le64(FIELD_PREP(STRTAB_STE_1_SHCFG,
15301535
STRTAB_STE_1_SHCFG_INCOMING));
15311536
}
1537+
EXPORT_SYMBOL_IF_KUNIT(arm_smmu_make_bypass_ste);
15321538

15331539
VISIBLE_IF_KUNIT
15341540
void arm_smmu_make_cdtable_ste(struct arm_smmu_ste *target,
@@ -1580,6 +1586,7 @@ void arm_smmu_make_cdtable_ste(struct arm_smmu_ste *target,
15801586
cpu_to_le64(FIELD_PREP(STRTAB_STE_2_S2VMID, 0));
15811587
}
15821588
}
1589+
EXPORT_SYMBOL_IF_KUNIT(arm_smmu_make_cdtable_ste);
15831590

15841591
VISIBLE_IF_KUNIT
15851592
void arm_smmu_make_s2_domain_ste(struct arm_smmu_ste *target,
@@ -1627,6 +1634,7 @@ void arm_smmu_make_s2_domain_ste(struct arm_smmu_ste *target,
16271634
target->data[3] = cpu_to_le64(pgtbl_cfg->arm_lpae_s2_cfg.vttbr &
16281635
STRTAB_STE_3_S2TTB_MASK);
16291636
}
1637+
EXPORT_SYMBOL_IF_KUNIT(arm_smmu_make_s2_domain_ste);
16301638

16311639
/*
16321640
* This can safely directly manipulate the STE memory without a sync sequence

0 commit comments

Comments
 (0)