Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions drivers/crypto/intel/qat/qat_common/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ intel_qat-objs := adf_cfg.o \
adf_sysfs_rl.o \
qat_uclo.o \
qat_hal.o \
qat_bl.o
qat_bl.o \
qat_mig_dev.o

intel_qat-$(CONFIG_DEBUG_FS) += adf_transport_debug.o \
adf_fw_counters.o \
Expand All @@ -56,6 +57,6 @@ intel_qat-$(CONFIG_DEBUG_FS) += adf_transport_debug.o \
intel_qat-$(CONFIG_PCI_IOV) += adf_sriov.o adf_vf_isr.o adf_pfvf_utils.o \
adf_pfvf_pf_msg.o adf_pfvf_pf_proto.o \
adf_pfvf_vf_msg.o adf_pfvf_vf_proto.o \
adf_gen2_pfvf.o adf_gen4_pfvf.o qat_mig_dev.o
adf_gen2_pfvf.o adf_gen4_pfvf.o

intel_qat-$(CONFIG_CRYPTO_DEV_QAT_ERROR_INJECTION) += adf_heartbeat_inject.o
2 changes: 1 addition & 1 deletion drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@
#define ADF_WQM_CSR_RPRESETSTS(bank) (ADF_WQM_CSR_RPRESETCTL(bank) + 4)

/* Ring interrupt */
#define ADF_RP_INT_SRC_SEL_F_RISE_MASK BIT(2)
#define ADF_RP_INT_SRC_SEL_F_RISE_MASK GENMASK(1, 0)
#define ADF_RP_INT_SRC_SEL_F_FALL_MASK GENMASK(2, 0)
#define ADF_RP_INT_SRC_SEL_RANGE_WIDTH 4
#define ADF_COALESCED_POLL_TIMEOUT_US (1 * USEC_PER_SEC)
Expand Down
1 change: 1 addition & 0 deletions drivers/iommu/iommufd/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ config IOMMUFD_TEST
depends on DEBUG_KERNEL
depends on FAULT_INJECTION
depends on RUNTIME_TESTING_MENU
select IOMMUFD_DRIVER
default n
help
This is dangerous, do not enable unless running
Expand Down
43 changes: 43 additions & 0 deletions drivers/iommu/iommufd/iova_bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@ struct iova_bitmap {

/* length of the IOVA range for the whole bitmap */
size_t length;

/* length of the IOVA range set ahead the pinned pages */
unsigned long set_ahead_length;
};

/*
Expand Down Expand Up @@ -342,6 +345,32 @@ static bool iova_bitmap_done(struct iova_bitmap *bitmap)
return bitmap->mapped_base_index >= bitmap->mapped_total_index;
}

static int iova_bitmap_set_ahead(struct iova_bitmap *bitmap,
size_t set_ahead_length)
{
int ret = 0;

while (set_ahead_length > 0 && !iova_bitmap_done(bitmap)) {
unsigned long length = iova_bitmap_mapped_length(bitmap);
unsigned long iova = iova_bitmap_mapped_iova(bitmap);

ret = iova_bitmap_get(bitmap);
if (ret)
break;

length = min(length, set_ahead_length);
iova_bitmap_set(bitmap, iova, length);

set_ahead_length -= length;
bitmap->mapped_base_index +=
iova_bitmap_offset_to_index(bitmap, length - 1) + 1;
iova_bitmap_put(bitmap);
}

bitmap->set_ahead_length = 0;
return ret;
}

/*
* Advances to the next range, releases the current pinned
* pages and pins the next set of bitmap pages.
Expand All @@ -358,6 +387,15 @@ static int iova_bitmap_advance(struct iova_bitmap *bitmap)
if (iova_bitmap_done(bitmap))
return 0;

/* Iterate, set and skip any bits requested for next iteration */
if (bitmap->set_ahead_length) {
int ret;

ret = iova_bitmap_set_ahead(bitmap, bitmap->set_ahead_length);
if (ret)
return ret;
}

/* When advancing the index we pin the next set of bitmap pages */
return iova_bitmap_get(bitmap);
}
Expand Down Expand Up @@ -427,5 +465,10 @@ void iova_bitmap_set(struct iova_bitmap *bitmap,
kunmap_local(kaddr);
cur_bit += nbits;
} while (cur_bit <= last_bit);

if (unlikely(cur_bit <= last_bit)) {
bitmap->set_ahead_length =
((last_bit - cur_bit + 1) << bitmap->mapped.pgshift);
}
}
EXPORT_SYMBOL_NS_GPL(iova_bitmap_set, IOMMUFD);
4 changes: 2 additions & 2 deletions drivers/iommu/iommufd/selftest.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ static int mock_domain_read_and_clear_dirty(struct iommu_domain *domain,
return 0;
}

const struct iommu_dirty_ops dirty_ops = {
static const struct iommu_dirty_ops dirty_ops = {
.set_dirty_tracking = mock_domain_set_dirty_tracking,
.read_and_clear_dirty = mock_domain_read_and_clear_dirty,
};
Expand Down Expand Up @@ -1134,7 +1134,7 @@ static int iommufd_test_dirty(struct iommufd_ucmd *ucmd, unsigned int mockpt_id,
}

max = length / page_size;
bitmap_size = max / BITS_PER_BYTE;
bitmap_size = DIV_ROUND_UP(max, BITS_PER_BYTE);

tmp = kvzalloc(bitmap_size, GFP_KERNEL_ACCOUNT);
if (!tmp) {
Expand Down
2 changes: 1 addition & 1 deletion drivers/vfio/pci/qat/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ static ssize_t qat_vf_resume_write(struct file *filp, const char __user *buf,
offs = &filp->f_pos;

if (*offs < 0 ||
check_add_overflow((loff_t)len, *offs, &end))
check_add_overflow(len, *offs, &end))
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Removed cast to loff_t may cause incorrect overflow checks

Casting len to loff_t is important for correct signed overflow detection. Using size_t may result in missed or incorrect overflow checks. Please ensure both operands are cast to a consistent type.

return -EOVERFLOW;

if (end > mig_dev->state_size)
Expand Down
2 changes: 2 additions & 0 deletions tools/testing/selftests/iommu/config
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
CONFIG_IOMMUFD=y
CONFIG_FAULT_INJECTION_DEBUG_FS=y
CONFIG_FAULT_INJECTION=y
CONFIG_IOMMUFD_TEST=y
CONFIG_FAILSLAB=y
34 changes: 17 additions & 17 deletions tools/testing/selftests/iommu/iommufd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1453,6 +1453,7 @@ FIXTURE_VARIANT(iommufd_dirty_tracking)

FIXTURE_SETUP(iommufd_dirty_tracking)
{
unsigned long size;
void *vrc;
int rc;

Expand All @@ -1471,12 +1472,11 @@ FIXTURE_SETUP(iommufd_dirty_tracking)
assert(vrc == self->buffer);

self->page_size = MOCK_PAGE_SIZE;
self->bitmap_size =
variant->buffer_size / self->page_size / BITS_PER_BYTE;
self->bitmap_size = variant->buffer_size / self->page_size;

/* Provision with an extra (MOCK_PAGE_SIZE) for the unaligned case */
rc = posix_memalign(&self->bitmap, PAGE_SIZE,
self->bitmap_size + MOCK_PAGE_SIZE);
size = DIV_ROUND_UP(self->bitmap_size, BITS_PER_BYTE);
rc = posix_memalign(&self->bitmap, PAGE_SIZE, size + PAGE_SIZE);
assert(!rc);
assert(self->bitmap);
assert((uintptr_t)self->bitmap % PAGE_SIZE == 0);
Expand All @@ -1489,38 +1489,38 @@ FIXTURE_SETUP(iommufd_dirty_tracking)
FIXTURE_TEARDOWN(iommufd_dirty_tracking)
{
munmap(self->buffer, variant->buffer_size);
munmap(self->bitmap, self->bitmap_size);
munmap(self->bitmap, DIV_ROUND_UP(self->bitmap_size, BITS_PER_BYTE));
teardown_iommufd(self->fd, _metadata);
}

FIXTURE_VARIANT_ADD(iommufd_dirty_tracking, domain_dirty128k)
FIXTURE_VARIANT_ADD(iommufd_dirty_tracking, domain_dirty64k)
{
/* one u32 index bitmap */
.buffer_size = 128UL * 1024UL,
.buffer_size = 64UL * 1024UL,
};

FIXTURE_VARIANT_ADD(iommufd_dirty_tracking, domain_dirty256k)
FIXTURE_VARIANT_ADD(iommufd_dirty_tracking, domain_dirty128k)
{
/* one u64 index bitmap */
.buffer_size = 256UL * 1024UL,
.buffer_size = 128UL * 1024UL,
};

FIXTURE_VARIANT_ADD(iommufd_dirty_tracking, domain_dirty640k)
FIXTURE_VARIANT_ADD(iommufd_dirty_tracking, domain_dirty320k)
{
/* two u64 index and trailing end bitmap */
.buffer_size = 640UL * 1024UL,
.buffer_size = 320UL * 1024UL,
};

FIXTURE_VARIANT_ADD(iommufd_dirty_tracking, domain_dirty128M)
FIXTURE_VARIANT_ADD(iommufd_dirty_tracking, domain_dirty64M)
{
/* 4K bitmap (128M IOVA range) */
.buffer_size = 128UL * 1024UL * 1024UL,
/* 4K bitmap (64M IOVA range) */
.buffer_size = 64UL * 1024UL * 1024UL,
};

FIXTURE_VARIANT_ADD(iommufd_dirty_tracking, domain_dirty256M)
FIXTURE_VARIANT_ADD(iommufd_dirty_tracking, domain_dirty128M)
{
/* 8K bitmap (256M IOVA range) */
.buffer_size = 256UL * 1024UL * 1024UL,
/* 8K bitmap (128M IOVA range) */
.buffer_size = 128UL * 1024UL * 1024UL
};

TEST_F(iommufd_dirty_tracking, enforce_dirty)
Expand Down
6 changes: 4 additions & 2 deletions tools/testing/selftests/iommu/iommufd_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#define BIT_MASK(nr) (1UL << ((nr) % __BITS_PER_LONG))
#define BIT_WORD(nr) ((nr) / __BITS_PER_LONG)

#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))

static inline void set_bit(unsigned int nr, unsigned long *addr)
{
unsigned long mask = BIT_MASK(nr);
Expand Down Expand Up @@ -274,11 +276,11 @@ static int _test_cmd_mock_domain_set_dirty(int fd, __u32 hwpt_id, size_t length,

static int _test_mock_dirty_bitmaps(int fd, __u32 hwpt_id, size_t length,
__u64 iova, size_t page_size, __u64 *bitmap,
__u64 bitmap_size, __u32 flags,
__u64 nbits, __u32 flags,
struct __test_metadata *_metadata)
{
unsigned long i, nbits = bitmap_size * BITS_PER_BYTE;
unsigned long nr = nbits / 2;
unsigned long bitmap_size = DIV_ROUND_UP(nbits, BITS_PER_BYTE);
__u64 out_dirty = 0;

/* Mark all even bits as dirty in the mock domain */
Expand Down
Loading