Skip to content

Commit 0795b30

Browse files
jpemartinsjgunthorpe
authored andcommitted
iommufd/selftest: Test IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR flag
Change test_mock_dirty_bitmaps() to pass a flag where it specifies the flag under test. The test does the same thing as the GET_DIRTY_BITMAP regular test. Except that it tests whether the dirtied bits are fetched all the same a second time, as opposed to observing them cleared. Link: https://lore.kernel.org/r/20231024135109.73787-19-joao.m.martins@oracle.com Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
1 parent ae36fe7 commit 0795b30

File tree

3 files changed

+61
-18
lines changed

3 files changed

+61
-18
lines changed

drivers/iommu/iommufd/selftest.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,16 @@ static int mock_domain_read_and_clear_dirty(struct iommu_domain *domain,
193193

194194
ent = xa_load(&mock->pfns, cur / MOCK_IO_PAGE_SIZE);
195195
if (ent && (xa_to_value(ent) & MOCK_PFN_DIRTY_IOVA)) {
196-
unsigned long val;
197-
198196
/* Clear dirty */
199-
val = xa_to_value(ent) & ~MOCK_PFN_DIRTY_IOVA;
200-
old = xa_store(&mock->pfns, cur / MOCK_IO_PAGE_SIZE,
201-
xa_mk_value(val), GFP_KERNEL);
202-
WARN_ON_ONCE(ent != old);
197+
if (!(flags & IOMMU_DIRTY_NO_CLEAR)) {
198+
unsigned long val;
199+
200+
val = xa_to_value(ent) & ~MOCK_PFN_DIRTY_IOVA;
201+
old = xa_store(&mock->pfns,
202+
cur / MOCK_IO_PAGE_SIZE,
203+
xa_mk_value(val), GFP_KERNEL);
204+
WARN_ON_ONCE(ent != old);
205+
}
203206
iommu_dirty_bitmap_record(dirty, cur,
204207
MOCK_IO_PAGE_SIZE);
205208
}

tools/testing/selftests/iommu/iommufd.c

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,13 +1598,47 @@ TEST_F(iommufd_dirty_tracking, get_dirty_bitmap)
15981598

15991599
test_mock_dirty_bitmaps(hwpt_id, variant->buffer_size,
16001600
MOCK_APERTURE_START, self->page_size,
1601-
self->bitmap, self->bitmap_size, _metadata);
1601+
self->bitmap, self->bitmap_size, 0, _metadata);
16021602

16031603
/* PAGE_SIZE unaligned bitmap */
16041604
test_mock_dirty_bitmaps(hwpt_id, variant->buffer_size,
16051605
MOCK_APERTURE_START, self->page_size,
16061606
self->bitmap + MOCK_PAGE_SIZE,
1607-
self->bitmap_size, _metadata);
1607+
self->bitmap_size, 0, _metadata);
1608+
1609+
test_ioctl_destroy(stddev_id);
1610+
test_ioctl_destroy(hwpt_id);
1611+
}
1612+
1613+
TEST_F(iommufd_dirty_tracking, get_dirty_bitmap_no_clear)
1614+
{
1615+
uint32_t stddev_id;
1616+
uint32_t hwpt_id;
1617+
uint32_t ioas_id;
1618+
1619+
test_ioctl_ioas_alloc(&ioas_id);
1620+
test_ioctl_ioas_map_fixed_id(ioas_id, self->buffer,
1621+
variant->buffer_size, MOCK_APERTURE_START);
1622+
1623+
test_cmd_hwpt_alloc(self->idev_id, ioas_id,
1624+
IOMMU_HWPT_ALLOC_DIRTY_TRACKING, &hwpt_id);
1625+
test_cmd_mock_domain(hwpt_id, &stddev_id, NULL, NULL);
1626+
1627+
test_cmd_set_dirty_tracking(hwpt_id, true);
1628+
1629+
test_mock_dirty_bitmaps(hwpt_id, variant->buffer_size,
1630+
MOCK_APERTURE_START, self->page_size,
1631+
self->bitmap, self->bitmap_size,
1632+
IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR,
1633+
_metadata);
1634+
1635+
/* Unaligned bitmap */
1636+
test_mock_dirty_bitmaps(hwpt_id, variant->buffer_size,
1637+
MOCK_APERTURE_START, self->page_size,
1638+
self->bitmap + MOCK_PAGE_SIZE,
1639+
self->bitmap_size,
1640+
IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR,
1641+
_metadata);
16081642

16091643
test_ioctl_destroy(stddev_id);
16101644
test_ioctl_destroy(hwpt_id);

tools/testing/selftests/iommu/iommufd_utils.h

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -217,11 +217,12 @@ static int _test_cmd_set_dirty_tracking(int fd, __u32 hwpt_id, bool enabled)
217217

218218
static int _test_cmd_get_dirty_bitmap(int fd, __u32 hwpt_id, size_t length,
219219
__u64 iova, size_t page_size,
220-
__u64 *bitmap)
220+
__u64 *bitmap, __u32 flags)
221221
{
222222
struct iommu_hwpt_get_dirty_bitmap cmd = {
223223
.size = sizeof(cmd),
224224
.hwpt_id = hwpt_id,
225+
.flags = flags,
225226
.iova = iova,
226227
.length = length,
227228
.page_size = page_size,
@@ -236,9 +237,9 @@ static int _test_cmd_get_dirty_bitmap(int fd, __u32 hwpt_id, size_t length,
236237
}
237238

238239
#define test_cmd_get_dirty_bitmap(fd, hwpt_id, length, iova, page_size, \
239-
bitmap) \
240+
bitmap, flags) \
240241
ASSERT_EQ(0, _test_cmd_get_dirty_bitmap(fd, hwpt_id, length, iova, \
241-
page_size, bitmap))
242+
page_size, bitmap, flags))
242243

243244
static int _test_cmd_mock_domain_set_dirty(int fd, __u32 hwpt_id, size_t length,
244245
__u64 iova, size_t page_size,
@@ -273,7 +274,7 @@ static int _test_cmd_mock_domain_set_dirty(int fd, __u32 hwpt_id, size_t length,
273274

274275
static int _test_mock_dirty_bitmaps(int fd, __u32 hwpt_id, size_t length,
275276
__u64 iova, size_t page_size, __u64 *bitmap,
276-
__u64 bitmap_size,
277+
__u64 bitmap_size, __u32 flags,
277278
struct __test_metadata *_metadata)
278279
{
279280
unsigned long i, count, nbits = bitmap_size * BITS_PER_BYTE;
@@ -292,25 +293,30 @@ static int _test_mock_dirty_bitmaps(int fd, __u32 hwpt_id, size_t length,
292293

293294
/* Expect all even bits as dirty in the user bitmap */
294295
memset(bitmap, 0, bitmap_size);
295-
test_cmd_get_dirty_bitmap(fd, hwpt_id, length, iova, page_size, bitmap);
296+
test_cmd_get_dirty_bitmap(fd, hwpt_id, length, iova, page_size, bitmap,
297+
flags);
296298
for (count = 0, i = 0; i < nbits; count += !(i % 2), i++)
297299
ASSERT_EQ(!(i % 2), test_bit(i, (unsigned long *)bitmap));
298300
ASSERT_EQ(count, out_dirty);
299301

300302
memset(bitmap, 0, bitmap_size);
301-
test_cmd_get_dirty_bitmap(fd, hwpt_id, length, iova, page_size, bitmap);
303+
test_cmd_get_dirty_bitmap(fd, hwpt_id, length, iova, page_size, bitmap,
304+
flags);
302305

303306
/* It as read already -- expect all zeroes */
304-
for (i = 0; i < nbits; i++)
305-
ASSERT_EQ(0, test_bit(i, (unsigned long *)bitmap));
307+
for (i = 0; i < nbits; i++) {
308+
ASSERT_EQ(!(i % 2) && (flags &
309+
IOMMU_HWPT_GET_DIRTY_BITMAP_NO_CLEAR),
310+
test_bit(i, (unsigned long *)bitmap));
311+
}
306312

307313
return 0;
308314
}
309315
#define test_mock_dirty_bitmaps(hwpt_id, length, iova, page_size, bitmap, \
310-
bitmap_size, _metadata) \
316+
bitmap_size, flags, _metadata) \
311317
ASSERT_EQ(0, _test_mock_dirty_bitmaps(self->fd, hwpt_id, length, iova, \
312318
page_size, bitmap, bitmap_size, \
313-
_metadata))
319+
flags, _metadata))
314320

315321
static int _test_cmd_create_access(int fd, unsigned int ioas_id,
316322
__u32 *access_id, unsigned int flags)

0 commit comments

Comments
 (0)