Skip to content

Commit 3c894cb

Browse files
committed
Merge tag 'for-linus-iommufd' of git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd
Pull iommufd fixes from Jason Gunthorpe: "Some changes to the userspace selftest framework cause the iommufd tests to start failing. This turned out to be bugs in the iommufd side that were just getting uncovered. - Deal with MAP_HUGETLB mmaping more than requested even when in MAP_FIXED mode - Fixup missing error flow cleanup in the test - Check that the memory allocations suceeded - Suppress some bogus gcc 'may be used uninitialized' warnings" * tag 'for-linus-iommufd' of git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd: iommufd/selftest: Fix build warnings due to uninitialized mfd iommufd/selftest: Add asserts testing global mfd iommufd/selftest: Add missing close(mfd) in memfd_mmap() iommufd/selftest: Fix iommufd_dirty_tracking with large hugepage sizes
2 parents 7e4a6b5 + 9a96876 commit 3c894cb

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-13
lines changed

tools/testing/selftests/iommu/iommufd.c

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ static __attribute__((constructor)) void setup_sizes(void)
5454

5555
mfd_buffer = memfd_mmap(BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
5656
&mfd);
57+
assert(mfd_buffer != MAP_FAILED);
58+
assert(mfd > 0);
5759
}
5860

5961
FIXTURE(iommufd)
@@ -1746,13 +1748,15 @@ TEST_F(iommufd_mock_domain, all_aligns)
17461748
unsigned int end;
17471749
uint8_t *buf;
17481750
int prot = PROT_READ | PROT_WRITE;
1749-
int mfd;
1751+
int mfd = -1;
17501752

17511753
if (variant->file)
17521754
buf = memfd_mmap(buf_size, prot, MAP_SHARED, &mfd);
17531755
else
17541756
buf = mmap(0, buf_size, prot, self->mmap_flags, -1, 0);
17551757
ASSERT_NE(MAP_FAILED, buf);
1758+
if (variant->file)
1759+
ASSERT_GT(mfd, 0);
17561760
check_refs(buf, buf_size, 0);
17571761

17581762
/*
@@ -1798,13 +1802,15 @@ TEST_F(iommufd_mock_domain, all_aligns_copy)
17981802
unsigned int end;
17991803
uint8_t *buf;
18001804
int prot = PROT_READ | PROT_WRITE;
1801-
int mfd;
1805+
int mfd = -1;
18021806

18031807
if (variant->file)
18041808
buf = memfd_mmap(buf_size, prot, MAP_SHARED, &mfd);
18051809
else
18061810
buf = mmap(0, buf_size, prot, self->mmap_flags, -1, 0);
18071811
ASSERT_NE(MAP_FAILED, buf);
1812+
if (variant->file)
1813+
ASSERT_GT(mfd, 0);
18081814
check_refs(buf, buf_size, 0);
18091815

18101816
/*
@@ -2008,6 +2014,7 @@ FIXTURE_VARIANT(iommufd_dirty_tracking)
20082014

20092015
FIXTURE_SETUP(iommufd_dirty_tracking)
20102016
{
2017+
size_t mmap_buffer_size;
20112018
unsigned long size;
20122019
int mmap_flags;
20132020
void *vrc;
@@ -2022,22 +2029,33 @@ FIXTURE_SETUP(iommufd_dirty_tracking)
20222029
self->fd = open("/dev/iommu", O_RDWR);
20232030
ASSERT_NE(-1, self->fd);
20242031

2025-
rc = posix_memalign(&self->buffer, HUGEPAGE_SIZE, variant->buffer_size);
2026-
if (rc || !self->buffer) {
2027-
SKIP(return, "Skipping buffer_size=%lu due to errno=%d",
2028-
variant->buffer_size, rc);
2029-
}
2030-
20312032
mmap_flags = MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED;
2033+
mmap_buffer_size = variant->buffer_size;
20322034
if (variant->hugepages) {
20332035
/*
20342036
* MAP_POPULATE will cause the kernel to fail mmap if THPs are
20352037
* not available.
20362038
*/
20372039
mmap_flags |= MAP_HUGETLB | MAP_POPULATE;
2040+
2041+
/*
2042+
* Allocation must be aligned to the HUGEPAGE_SIZE, because the
2043+
* following mmap() will automatically align the length to be a
2044+
* multiple of the underlying huge page size. Failing to do the
2045+
* same at this allocation will result in a memory overwrite by
2046+
* the mmap().
2047+
*/
2048+
if (mmap_buffer_size < HUGEPAGE_SIZE)
2049+
mmap_buffer_size = HUGEPAGE_SIZE;
2050+
}
2051+
2052+
rc = posix_memalign(&self->buffer, HUGEPAGE_SIZE, mmap_buffer_size);
2053+
if (rc || !self->buffer) {
2054+
SKIP(return, "Skipping buffer_size=%lu due to errno=%d",
2055+
mmap_buffer_size, rc);
20382056
}
20392057
assert((uintptr_t)self->buffer % HUGEPAGE_SIZE == 0);
2040-
vrc = mmap(self->buffer, variant->buffer_size, PROT_READ | PROT_WRITE,
2058+
vrc = mmap(self->buffer, mmap_buffer_size, PROT_READ | PROT_WRITE,
20412059
mmap_flags, -1, 0);
20422060
assert(vrc == self->buffer);
20432061

@@ -2066,8 +2084,8 @@ FIXTURE_SETUP(iommufd_dirty_tracking)
20662084

20672085
FIXTURE_TEARDOWN(iommufd_dirty_tracking)
20682086
{
2069-
munmap(self->buffer, variant->buffer_size);
2070-
munmap(self->bitmap, DIV_ROUND_UP(self->bitmap_size, BITS_PER_BYTE));
2087+
free(self->buffer);
2088+
free(self->bitmap);
20712089
teardown_iommufd(self->fd, _metadata);
20722090
}
20732091

tools/testing/selftests/iommu/iommufd_utils.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,18 @@ static inline void *memfd_mmap(size_t length, int prot, int flags, int *mfd_p)
6060
{
6161
int mfd_flags = (flags & MAP_HUGETLB) ? MFD_HUGETLB : 0;
6262
int mfd = memfd_create("buffer", mfd_flags);
63+
void *buf = MAP_FAILED;
6364

6465
if (mfd <= 0)
6566
return MAP_FAILED;
6667
if (ftruncate(mfd, length))
67-
return MAP_FAILED;
68+
goto out;
6869
*mfd_p = mfd;
69-
return mmap(0, length, prot, flags, mfd, 0);
70+
buf = mmap(0, length, prot, flags, mfd, 0);
71+
out:
72+
if (buf == MAP_FAILED)
73+
close(mfd);
74+
return buf;
7075
}
7176

7277
/*

0 commit comments

Comments
 (0)