Hi Shaoqin
On 11/29/23 08:27, Shaoqin Huang wrote:
Add the invalid filter test to double check if the KVM_ARM_VCPU_PMU_V3_FILTER will return the expected error.
... in which situations? filter beyond the 16b event space or incorrect action.
Signed-off-by: Shaoqin Huang shahuang@redhat.com
.../kvm/aarch64/pmu_event_filter_test.c | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+)
diff --git a/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c b/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c index 0e652fbdb37a..4c375417b194 100644 --- a/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c +++ b/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c @@ -7,6 +7,7 @@
- This test checks if the guest only see the limited pmu event that userspace
- sets, if the guest can use those events which user allow, and if the guest
- can't use those events which user deny.
*/
- It also checks that setting invalid filter ranges return the expected error.
- This test runs only when KVM_CAP_ARM_PMU_V3, KVM_ARM_VCPU_PMU_V3_FILTER
- is supported on the host.
@@ -197,6 +198,39 @@ static void for_each_test(void) run_test(t); } +static void set_invalid_filter(struct vpmu_vm *vm, void *arg) +{
- struct kvm_pmu_event_filter invalid;
- struct kvm_device_attr attr = {
.group = KVM_ARM_VCPU_PMU_V3_CTRL,
.attr = KVM_ARM_VCPU_PMU_V3_FILTER,
.addr = (uint64_t)&invalid,
- };
- int ret = 0;
- /* The max event number is (1 << 16), set a range large than it. */
larger
- invalid = __DEFINE_FILTER(BIT(15), BIT(15)+1, 0);
doc says must fit within the event space defined by the PMU architecture (10 bits on ARMv8.0, 16 bits from ARMv8.1 onwards).
- ret = __vcpu_ioctl(vm->vcpu, KVM_SET_DEVICE_ATTR, &attr);
- TEST_ASSERT(ret && errno == EINVAL, "Set Invalid filter range "
"ret = %d, errno = %d (expected ret = -1, errno = EINVAL)",
ret, errno);
- ret = 0;
- /* Set the Invalid action. */
- invalid = __DEFINE_FILTER(0, 1, 3);
- ret = __vcpu_ioctl(vm->vcpu, KVM_SET_DEVICE_ATTR, &attr);
- TEST_ASSERT(ret && errno == EINVAL, "Set Invalid filter action "
"ret = %d, errno = %d (expected ret = -1, errno = EINVAL)",
ret, errno);
+}
+static void test_invalid_filter(void) +{
- vpmu_vm = __create_vpmu_vm(guest_code, set_invalid_filter, NULL);
- destroy_vpmu_vm(vpmu_vm);
+}
static bool kvm_supports_pmu_event_filter(void) { int r; @@ -228,4 +262,6 @@ int main(void) TEST_REQUIRE(host_pmu_supports_events()); for_each_test();
- test_invalid_filter();
}
Eric