* [Intel-gfx] [PATCH i-g-t 1/3] lib/intel_memory_region: verify item.length @ 2021-07-08 12:25 Matthew Auld 2021-07-08 12:25 ` [Intel-gfx] [PATCH i-g-t 2/3] tests/i915_query: extract query_garbage_items Matthew Auld ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Matthew Auld @ 2021-07-08 12:25 UTC (permalink / raw) To: igt-dev; +Cc: intel-gfx If the regions query fails then the error will be encoded in the item.length, while the ioctl will still return success. Reported-by: Ville Syrjala <ville.syrjala@linux.intel.com> Signed-off-by: Matthew Auld <matthew.auld@intel.com> --- lib/i915/intel_memory_region.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/i915/intel_memory_region.c b/lib/i915/intel_memory_region.c index 144ae12c..e1e210f2 100644 --- a/lib/i915/intel_memory_region.c +++ b/lib/i915/intel_memory_region.c @@ -119,6 +119,13 @@ struct drm_i915_query_memory_regions *gem_get_query_memory_regions(int fd) memset(&item, 0, sizeof(item)); item.query_id = DRM_I915_QUERY_MEMORY_REGIONS; i915_query_items(fd, &item, 1); + /* + * Any DRM_I915_QUERY_MEMORY_REGIONS specific errors are encoded in the + * item.length, even though the ioctl might still return success. + */ + igt_assert_f(item.length > 0, + "DRM_I915_QUERY_MEMORY_REGIONS failed with %d\n", + item.length); query_info = calloc(1, item.length); -- 2.26.3 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Intel-gfx] [PATCH i-g-t 2/3] tests/i915_query: extract query_garbage_items 2021-07-08 12:25 [Intel-gfx] [PATCH i-g-t 1/3] lib/intel_memory_region: verify item.length Matthew Auld @ 2021-07-08 12:25 ` Matthew Auld 2021-07-26 10:13 ` [Intel-gfx] [igt-dev] " Ramalingam C 2021-07-08 12:25 ` [Intel-gfx] [PATCH i-g-t 3/3] tests/i915_query: add some sanity checking around regions query Matthew Auld 2021-07-26 9:32 ` [Intel-gfx] [PATCH i-g-t 1/3] lib/intel_memory_region: verify item.length Ramalingam C 2 siblings, 1 reply; 6+ messages in thread From: Matthew Auld @ 2021-07-08 12:25 UTC (permalink / raw) To: igt-dev; +Cc: intel-gfx We should be able to re-use this for other queries. Signed-off-by: Matthew Auld <matthew.auld@intel.com> Cc: Ville Syrjala <ville.syrjala@linux.intel.com> --- tests/i915/i915_query.c | 46 ++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/tests/i915/i915_query.c b/tests/i915/i915_query.c index 29b938e9..34965841 100644 --- a/tests/i915/i915_query.c +++ b/tests/i915/i915_query.c @@ -92,7 +92,8 @@ static void test_query_garbage(int fd) i915_query_items_err(fd, &item, 1, EINVAL); } -static void test_query_garbage_items(int fd) +static void test_query_garbage_items(int fd, int query_id, int min_item_size, + int sizeof_query_item) { struct drm_i915_query_item items[2]; struct drm_i915_query_item *items_ptr; @@ -103,7 +104,7 @@ static void test_query_garbage_items(int fd) * Subject to change in the future. */ memset(items, 0, sizeof(items)); - items[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; + items[0].query_id = query_id; items[0].flags = 42; i915_query_items(fd, items, 1); igt_assert_eq(items[0].length, -EINVAL); @@ -113,10 +114,10 @@ static void test_query_garbage_items(int fd) * one is properly processed. */ memset(items, 0, sizeof(items)); - items[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; + items[0].query_id = query_id; items[1].query_id = ULONG_MAX; i915_query_items(fd, items, 2); - igt_assert_lte(MIN_TOPOLOGY_ITEM_SIZE, items[0].length); + igt_assert_lte(min_item_size, items[0].length); igt_assert_eq(items[1].length, -EINVAL); /* @@ -126,16 +127,16 @@ static void test_query_garbage_items(int fd) */ memset(items, 0, sizeof(items)); items[0].query_id = ULONG_MAX; - items[1].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; + items[1].query_id = query_id; i915_query_items(fd, items, 2); igt_assert_eq(items[0].length, -EINVAL); - igt_assert_lte(MIN_TOPOLOGY_ITEM_SIZE, items[1].length); + igt_assert_lte(min_item_size, items[1].length); /* Test a couple of invalid data pointer in query item. */ memset(items, 0, sizeof(items)); - items[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; + items[0].query_id = query_id; i915_query_items(fd, items, 1); - igt_assert_lte(MIN_TOPOLOGY_ITEM_SIZE, items[0].length); + igt_assert_lte(min_item_size, items[0].length); items[0].data_ptr = 0; i915_query_items(fd, items, 1); @@ -145,14 +146,13 @@ static void test_query_garbage_items(int fd) i915_query_items(fd, items, 1); igt_assert_eq(items[0].length, -EFAULT); - /* Test an invalid query item length. */ memset(items, 0, sizeof(items)); - items[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; - items[1].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; - items[1].length = sizeof(struct drm_i915_query_topology_info) - 1; + items[0].query_id = query_id; + items[1].query_id = query_id; + items[1].length = sizeof_query_item - 1; i915_query_items(fd, items, 2); - igt_assert_lte(MIN_TOPOLOGY_ITEM_SIZE, items[0].length); + igt_assert_lte(min_item_size, items[0].length); igt_assert_eq(items[1].length, -EINVAL); /* @@ -162,9 +162,9 @@ static void test_query_garbage_items(int fd) * has been removed from our address space. */ items_ptr = mmap(0, 4096, PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); - items_ptr[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; + items_ptr[0].query_id = query_id; i915_query_items(fd, items_ptr, 1); - igt_assert_lte(MIN_TOPOLOGY_ITEM_SIZE, items_ptr[0].length); + igt_assert_lte(min_item_size, items_ptr[0].length); munmap(items_ptr, 4096); i915_query_items_err(fd, items_ptr, 1, EFAULT); @@ -173,7 +173,7 @@ static void test_query_garbage_items(int fd) * the kernel errors out with EFAULT. */ items_ptr = mmap(0, 4096, PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); - items_ptr[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; + items_ptr[0].query_id = query_id; igt_assert_eq(0, mprotect(items_ptr, 4096, PROT_READ)); i915_query_items_err(fd, items_ptr, 1, EFAULT); munmap(items_ptr, 4096); @@ -186,12 +186,20 @@ static void test_query_garbage_items(int fd) memset(items_ptr, 0, 8192); n_items = 8192 / sizeof(struct drm_i915_query_item); for (i = 0; i < n_items; i++) - items_ptr[i].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; + items_ptr[i].query_id = query_id; mprotect(((uint8_t *)items_ptr) + 4096, 4096, PROT_READ); i915_query_items_err(fd, items_ptr, n_items, EFAULT); munmap(items_ptr, 8192); } +static void test_query_topology_garbage_items(int fd) +{ + test_query_garbage_items(fd, + DRM_I915_QUERY_TOPOLOGY_INFO, + MIN_TOPOLOGY_ITEM_SIZE, + sizeof(struct drm_i915_query_topology_info)); +} + /* * Allocate more on both sides of where the kernel is going to write and verify * that it writes only where it's supposed to. @@ -738,9 +746,9 @@ igt_main igt_subtest("query-garbage") test_query_garbage(fd); - igt_subtest("query-garbage-items") { + igt_subtest("query-topology-garbage-items") { igt_require(query_topology_supported(fd)); - test_query_garbage_items(fd); + test_query_topology_garbage_items(fd); } igt_subtest("query-topology-kernel-writes") { -- 2.26.3 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Intel-gfx] [igt-dev] [PATCH i-g-t 2/3] tests/i915_query: extract query_garbage_items 2021-07-08 12:25 ` [Intel-gfx] [PATCH i-g-t 2/3] tests/i915_query: extract query_garbage_items Matthew Auld @ 2021-07-26 10:13 ` Ramalingam C 0 siblings, 0 replies; 6+ messages in thread From: Ramalingam C @ 2021-07-26 10:13 UTC (permalink / raw) To: Matthew Auld; +Cc: igt-dev, intel-gfx On 2021-07-08 at 13:25:53 +0100, Matthew Auld wrote: > We should be able to re-use this for other queries. LGTM Reviewed-by: Ramalingam C <ramalingam.c@intel.com> > > Signed-off-by: Matthew Auld <matthew.auld@intel.com> > Cc: Ville Syrjala <ville.syrjala@linux.intel.com> > --- > tests/i915/i915_query.c | 46 ++++++++++++++++++++++++----------------- > 1 file changed, 27 insertions(+), 19 deletions(-) > > diff --git a/tests/i915/i915_query.c b/tests/i915/i915_query.c > index 29b938e9..34965841 100644 > --- a/tests/i915/i915_query.c > +++ b/tests/i915/i915_query.c > @@ -92,7 +92,8 @@ static void test_query_garbage(int fd) > i915_query_items_err(fd, &item, 1, EINVAL); > } > > -static void test_query_garbage_items(int fd) > +static void test_query_garbage_items(int fd, int query_id, int min_item_size, > + int sizeof_query_item) > { > struct drm_i915_query_item items[2]; > struct drm_i915_query_item *items_ptr; > @@ -103,7 +104,7 @@ static void test_query_garbage_items(int fd) > * Subject to change in the future. > */ > memset(items, 0, sizeof(items)); > - items[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; > + items[0].query_id = query_id; > items[0].flags = 42; > i915_query_items(fd, items, 1); > igt_assert_eq(items[0].length, -EINVAL); > @@ -113,10 +114,10 @@ static void test_query_garbage_items(int fd) > * one is properly processed. > */ > memset(items, 0, sizeof(items)); > - items[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; > + items[0].query_id = query_id; > items[1].query_id = ULONG_MAX; > i915_query_items(fd, items, 2); > - igt_assert_lte(MIN_TOPOLOGY_ITEM_SIZE, items[0].length); > + igt_assert_lte(min_item_size, items[0].length); > igt_assert_eq(items[1].length, -EINVAL); > > /* > @@ -126,16 +127,16 @@ static void test_query_garbage_items(int fd) > */ > memset(items, 0, sizeof(items)); > items[0].query_id = ULONG_MAX; > - items[1].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; > + items[1].query_id = query_id; > i915_query_items(fd, items, 2); > igt_assert_eq(items[0].length, -EINVAL); > - igt_assert_lte(MIN_TOPOLOGY_ITEM_SIZE, items[1].length); > + igt_assert_lte(min_item_size, items[1].length); > > /* Test a couple of invalid data pointer in query item. */ > memset(items, 0, sizeof(items)); > - items[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; > + items[0].query_id = query_id; > i915_query_items(fd, items, 1); > - igt_assert_lte(MIN_TOPOLOGY_ITEM_SIZE, items[0].length); > + igt_assert_lte(min_item_size, items[0].length); > > items[0].data_ptr = 0; > i915_query_items(fd, items, 1); > @@ -145,14 +146,13 @@ static void test_query_garbage_items(int fd) > i915_query_items(fd, items, 1); > igt_assert_eq(items[0].length, -EFAULT); > > - > /* Test an invalid query item length. */ > memset(items, 0, sizeof(items)); > - items[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; > - items[1].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; > - items[1].length = sizeof(struct drm_i915_query_topology_info) - 1; > + items[0].query_id = query_id; > + items[1].query_id = query_id; > + items[1].length = sizeof_query_item - 1; > i915_query_items(fd, items, 2); > - igt_assert_lte(MIN_TOPOLOGY_ITEM_SIZE, items[0].length); > + igt_assert_lte(min_item_size, items[0].length); > igt_assert_eq(items[1].length, -EINVAL); > > /* > @@ -162,9 +162,9 @@ static void test_query_garbage_items(int fd) > * has been removed from our address space. > */ > items_ptr = mmap(0, 4096, PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); > - items_ptr[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; > + items_ptr[0].query_id = query_id; > i915_query_items(fd, items_ptr, 1); > - igt_assert_lte(MIN_TOPOLOGY_ITEM_SIZE, items_ptr[0].length); > + igt_assert_lte(min_item_size, items_ptr[0].length); > munmap(items_ptr, 4096); > i915_query_items_err(fd, items_ptr, 1, EFAULT); > > @@ -173,7 +173,7 @@ static void test_query_garbage_items(int fd) > * the kernel errors out with EFAULT. > */ > items_ptr = mmap(0, 4096, PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); > - items_ptr[0].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; > + items_ptr[0].query_id = query_id; > igt_assert_eq(0, mprotect(items_ptr, 4096, PROT_READ)); > i915_query_items_err(fd, items_ptr, 1, EFAULT); > munmap(items_ptr, 4096); > @@ -186,12 +186,20 @@ static void test_query_garbage_items(int fd) > memset(items_ptr, 0, 8192); > n_items = 8192 / sizeof(struct drm_i915_query_item); > for (i = 0; i < n_items; i++) > - items_ptr[i].query_id = DRM_I915_QUERY_TOPOLOGY_INFO; > + items_ptr[i].query_id = query_id; > mprotect(((uint8_t *)items_ptr) + 4096, 4096, PROT_READ); > i915_query_items_err(fd, items_ptr, n_items, EFAULT); > munmap(items_ptr, 8192); > } > > +static void test_query_topology_garbage_items(int fd) > +{ > + test_query_garbage_items(fd, > + DRM_I915_QUERY_TOPOLOGY_INFO, > + MIN_TOPOLOGY_ITEM_SIZE, > + sizeof(struct drm_i915_query_topology_info)); > +} > + > /* > * Allocate more on both sides of where the kernel is going to write and verify > * that it writes only where it's supposed to. > @@ -738,9 +746,9 @@ igt_main > igt_subtest("query-garbage") > test_query_garbage(fd); > > - igt_subtest("query-garbage-items") { > + igt_subtest("query-topology-garbage-items") { > igt_require(query_topology_supported(fd)); > - test_query_garbage_items(fd); > + test_query_topology_garbage_items(fd); > } > > igt_subtest("query-topology-kernel-writes") { > -- > 2.26.3 > > _______________________________________________ > igt-dev mailing list > igt-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/igt-dev _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Intel-gfx] [PATCH i-g-t 3/3] tests/i915_query: add some sanity checking around regions query 2021-07-08 12:25 [Intel-gfx] [PATCH i-g-t 1/3] lib/intel_memory_region: verify item.length Matthew Auld 2021-07-08 12:25 ` [Intel-gfx] [PATCH i-g-t 2/3] tests/i915_query: extract query_garbage_items Matthew Auld @ 2021-07-08 12:25 ` Matthew Auld 2021-07-26 11:48 ` [Intel-gfx] [igt-dev] " Ramalingam C 2021-07-26 9:32 ` [Intel-gfx] [PATCH i-g-t 1/3] lib/intel_memory_region: verify item.length Ramalingam C 2 siblings, 1 reply; 6+ messages in thread From: Matthew Auld @ 2021-07-08 12:25 UTC (permalink / raw) To: igt-dev; +Cc: intel-gfx Ensure if we feed garbage into DRM_I915_QUERY_MEMORY_REGIONS it does indeed fail as expected. Also add some asserts for the invariants with the probed regions, for example we should always have at least system memory. Signed-off-by: Matthew Auld <matthew.auld@intel.com> Cc: Ville Syrjala <ville.syrjala@linux.intel.com> --- tests/i915/i915_query.c | 127 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/tests/i915/i915_query.c b/tests/i915/i915_query.c index 34965841..78bd4a2b 100644 --- a/tests/i915/i915_query.c +++ b/tests/i915/i915_query.c @@ -33,6 +33,10 @@ IGT_TEST_DESCRIPTION("Testing the i915 query uAPI."); */ #define MIN_TOPOLOGY_ITEM_SIZE (sizeof(struct drm_i915_query_topology_info) + 3) +/* All devices should have at least one region. */ +#define MIN_REGIONS_ITEM_SIZE (sizeof(struct drm_i915_query_memory_regions) + \ + sizeof(struct drm_i915_memory_region_info)) + static int __i915_query(int fd, struct drm_i915_query *q) { @@ -491,6 +495,119 @@ test_query_topology_known_pci_ids(int fd, int devid) free(topo_info); } +static bool query_regions_supported(int fd) +{ + struct drm_i915_query_item item = { + .query_id = DRM_I915_QUERY_MEMORY_REGIONS, + }; + + return __i915_query_items(fd, &item, 1) == 0 && item.length > 0; +} + +static void test_query_regions_garbage_items(int fd) +{ + struct drm_i915_query_memory_regions *regions; + struct drm_i915_query_item item; + int i; + + test_query_garbage_items(fd, + DRM_I915_QUERY_MEMORY_REGIONS, + MIN_REGIONS_ITEM_SIZE, + sizeof(struct drm_i915_query_memory_regions)); + + memset(&item, 0, sizeof(item)); + item.query_id = DRM_I915_QUERY_MEMORY_REGIONS; + i915_query_items(fd, &item, 1); + igt_assert(item.length > 0); + + regions = calloc(1, item.length); + item.data_ptr = to_user_pointer(regions); + + /* Bogus; in-MBZ */ + for (i = 0; i < ARRAY_SIZE(regions->rsvd); i++) { + regions->rsvd[i] = 0xdeadbeaf; + i915_query_items(fd, &item, 1); + igt_assert_eq(item.length, -EINVAL); + regions->rsvd[i] = 0; + } + + i915_query_items(fd, &item, 1); + igt_assert(regions->num_regions); + igt_assert(item.length > 0); + + /* Bogus; out-MBZ */ + for (i = 0; i < regions->num_regions; i++) { + struct drm_i915_memory_region_info info = regions->regions[i]; + int j; + + igt_assert_eq_u32(info.rsvd0, 0); + + for (j = 0; j < ARRAY_SIZE(info.rsvd1); j++) + igt_assert_eq_u32(info.rsvd1[j], 0); + } + + /* Bogus; kernel is meant to set this */ + regions->num_regions = 1; + i915_query_items(fd, &item, 1); + igt_assert_eq(item.length, -EINVAL); + regions->num_regions = 0; + + free(regions); +} + +static void test_query_regions_sanity_check(int fd) +{ + struct drm_i915_query_memory_regions *regions; + struct drm_i915_query_item item; + bool found_system; + int i; + + memset(&item, 0, sizeof(item)); + item.query_id = DRM_I915_QUERY_MEMORY_REGIONS; + i915_query_items(fd, &item, 1); + igt_assert(item.length > 0); + + regions = calloc(1, item.length); + + item.data_ptr = to_user_pointer(regions); + i915_query_items(fd, &item, 1); + + /* We should always have at least one region */ + igt_assert(regions->num_regions); + + found_system = false; + for (i = 0; i < regions->num_regions; i++) { + struct drm_i915_gem_memory_class_instance r1 = + regions->regions[i].region; + int j; + + if (r1.memory_class == I915_MEMORY_CLASS_SYSTEM) { + igt_assert_eq(r1.memory_instance, 0); + found_system = true; + } + + igt_assert(r1.memory_class == I915_MEMORY_CLASS_SYSTEM || + r1.memory_class == I915_MEMORY_CLASS_DEVICE); + + for (j = 0; j < regions->num_regions; j++) { + struct drm_i915_gem_memory_class_instance r2 = + regions->regions[j].region; + + if (i == j) + continue; + + /* All probed class:instance pairs must be unique */ + igt_assert(!(r1.memory_class == r2.memory_class && + r1.memory_instance == r2.memory_instance)); + } + } + + /* All devices should at least have system memory */ + igt_assert(found_system); + + free(regions); +} + static bool query_engine_info_supported(int fd) { struct drm_i915_query_item item = { @@ -779,6 +896,16 @@ igt_main test_query_topology_known_pci_ids(fd, devid); } + igt_subtest("query-regions-garbage-items") { + igt_require(query_regions_supported(fd)); + test_query_regions_garbage_items(fd); + } + + igt_subtest("query-regions-sanity-check") { + igt_require(query_regions_supported(fd)); + test_query_regions_sanity_check(fd); + } + igt_subtest_group { igt_fixture { igt_require(query_engine_info_supported(fd)); -- 2.26.3 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Intel-gfx] [igt-dev] [PATCH i-g-t 3/3] tests/i915_query: add some sanity checking around regions query 2021-07-08 12:25 ` [Intel-gfx] [PATCH i-g-t 3/3] tests/i915_query: add some sanity checking around regions query Matthew Auld @ 2021-07-26 11:48 ` Ramalingam C 0 siblings, 0 replies; 6+ messages in thread From: Ramalingam C @ 2021-07-26 11:48 UTC (permalink / raw) To: Matthew Auld; +Cc: igt-dev, intel-gfx On 2021-07-08 at 13:25:54 +0100, Matthew Auld wrote: > Ensure if we feed garbage into DRM_I915_QUERY_MEMORY_REGIONS it does > indeed fail as expected. Also add some asserts for the invariants with > the probed regions, for example we should always have at least system > memory. LGTM. Reviewed-by: Ramalingam C <ramalingam.c@intel.com> > > Signed-off-by: Matthew Auld <matthew.auld@intel.com> > Cc: Ville Syrjala <ville.syrjala@linux.intel.com> > --- > tests/i915/i915_query.c | 127 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 127 insertions(+) > > diff --git a/tests/i915/i915_query.c b/tests/i915/i915_query.c > index 34965841..78bd4a2b 100644 > --- a/tests/i915/i915_query.c > +++ b/tests/i915/i915_query.c > @@ -33,6 +33,10 @@ IGT_TEST_DESCRIPTION("Testing the i915 query uAPI."); > */ > #define MIN_TOPOLOGY_ITEM_SIZE (sizeof(struct drm_i915_query_topology_info) + 3) > > +/* All devices should have at least one region. */ > +#define MIN_REGIONS_ITEM_SIZE (sizeof(struct drm_i915_query_memory_regions) + \ > + sizeof(struct drm_i915_memory_region_info)) > + > static int > __i915_query(int fd, struct drm_i915_query *q) > { > @@ -491,6 +495,119 @@ test_query_topology_known_pci_ids(int fd, int devid) > free(topo_info); > } > > +static bool query_regions_supported(int fd) > +{ > + struct drm_i915_query_item item = { > + .query_id = DRM_I915_QUERY_MEMORY_REGIONS, > + }; > + > + return __i915_query_items(fd, &item, 1) == 0 && item.length > 0; > +} > + > +static void test_query_regions_garbage_items(int fd) > +{ > + struct drm_i915_query_memory_regions *regions; > + struct drm_i915_query_item item; > + int i; > + > + test_query_garbage_items(fd, > + DRM_I915_QUERY_MEMORY_REGIONS, > + MIN_REGIONS_ITEM_SIZE, > + sizeof(struct drm_i915_query_memory_regions)); > + > + memset(&item, 0, sizeof(item)); > + item.query_id = DRM_I915_QUERY_MEMORY_REGIONS; > + i915_query_items(fd, &item, 1); > + igt_assert(item.length > 0); > + > + regions = calloc(1, item.length); > + item.data_ptr = to_user_pointer(regions); > + > + /* Bogus; in-MBZ */ > + for (i = 0; i < ARRAY_SIZE(regions->rsvd); i++) { > + regions->rsvd[i] = 0xdeadbeaf; > + i915_query_items(fd, &item, 1); > + igt_assert_eq(item.length, -EINVAL); > + regions->rsvd[i] = 0; > + } > + > + i915_query_items(fd, &item, 1); > + igt_assert(regions->num_regions); > + igt_assert(item.length > 0); > + > + /* Bogus; out-MBZ */ > + for (i = 0; i < regions->num_regions; i++) { > + struct drm_i915_memory_region_info info = regions->regions[i]; > + int j; > + > + igt_assert_eq_u32(info.rsvd0, 0); > + > + for (j = 0; j < ARRAY_SIZE(info.rsvd1); j++) > + igt_assert_eq_u32(info.rsvd1[j], 0); > + } > + > + /* Bogus; kernel is meant to set this */ > + regions->num_regions = 1; > + i915_query_items(fd, &item, 1); > + igt_assert_eq(item.length, -EINVAL); > + regions->num_regions = 0; > + > + free(regions); > +} > + > +static void test_query_regions_sanity_check(int fd) > +{ > + struct drm_i915_query_memory_regions *regions; > + struct drm_i915_query_item item; > + bool found_system; > + int i; > + > + memset(&item, 0, sizeof(item)); > + item.query_id = DRM_I915_QUERY_MEMORY_REGIONS; > + i915_query_items(fd, &item, 1); > + igt_assert(item.length > 0); > + > + regions = calloc(1, item.length); > + > + item.data_ptr = to_user_pointer(regions); > + i915_query_items(fd, &item, 1); > + > + /* We should always have at least one region */ > + igt_assert(regions->num_regions); > + > + found_system = false; > + for (i = 0; i < regions->num_regions; i++) { > + struct drm_i915_gem_memory_class_instance r1 = > + regions->regions[i].region; > + int j; > + > + if (r1.memory_class == I915_MEMORY_CLASS_SYSTEM) { > + igt_assert_eq(r1.memory_instance, 0); > + found_system = true; > + } > + > + igt_assert(r1.memory_class == I915_MEMORY_CLASS_SYSTEM || > + r1.memory_class == I915_MEMORY_CLASS_DEVICE); > + > + for (j = 0; j < regions->num_regions; j++) { > + struct drm_i915_gem_memory_class_instance r2 = > + regions->regions[j].region; > + > + if (i == j) > + continue; > + > + /* All probed class:instance pairs must be unique */ > + igt_assert(!(r1.memory_class == r2.memory_class && > + r1.memory_instance == r2.memory_instance)); > + } > + } > + > + /* All devices should at least have system memory */ > + igt_assert(found_system); > + > + free(regions); > +} > + > static bool query_engine_info_supported(int fd) > { > struct drm_i915_query_item item = { > @@ -779,6 +896,16 @@ igt_main > test_query_topology_known_pci_ids(fd, devid); > } > > + igt_subtest("query-regions-garbage-items") { > + igt_require(query_regions_supported(fd)); > + test_query_regions_garbage_items(fd); > + } > + > + igt_subtest("query-regions-sanity-check") { > + igt_require(query_regions_supported(fd)); > + test_query_regions_sanity_check(fd); > + } > + > igt_subtest_group { > igt_fixture { > igt_require(query_engine_info_supported(fd)); > -- > 2.26.3 > > _______________________________________________ > igt-dev mailing list > igt-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/igt-dev _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Intel-gfx] [PATCH i-g-t 1/3] lib/intel_memory_region: verify item.length 2021-07-08 12:25 [Intel-gfx] [PATCH i-g-t 1/3] lib/intel_memory_region: verify item.length Matthew Auld 2021-07-08 12:25 ` [Intel-gfx] [PATCH i-g-t 2/3] tests/i915_query: extract query_garbage_items Matthew Auld 2021-07-08 12:25 ` [Intel-gfx] [PATCH i-g-t 3/3] tests/i915_query: add some sanity checking around regions query Matthew Auld @ 2021-07-26 9:32 ` Ramalingam C 2 siblings, 0 replies; 6+ messages in thread From: Ramalingam C @ 2021-07-26 9:32 UTC (permalink / raw) To: Matthew Auld; +Cc: igt-dev, intel-gfx On 2021-07-08 at 13:25:52 +0100, Matthew Auld wrote: > If the regions query fails then the error will be encoded in the > item.length, while the ioctl will still return success. > > Reported-by: Ville Syrjala <ville.syrjala@linux.intel.com> > Signed-off-by: Matthew Auld <matthew.auld@intel.com> > --- > lib/i915/intel_memory_region.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/lib/i915/intel_memory_region.c b/lib/i915/intel_memory_region.c > index 144ae12c..e1e210f2 100644 > --- a/lib/i915/intel_memory_region.c > +++ b/lib/i915/intel_memory_region.c > @@ -119,6 +119,13 @@ struct drm_i915_query_memory_regions *gem_get_query_memory_regions(int fd) > memset(&item, 0, sizeof(item)); > item.query_id = DRM_I915_QUERY_MEMORY_REGIONS; > i915_query_items(fd, &item, 1); > + /* > + * Any DRM_I915_QUERY_MEMORY_REGIONS specific errors are encoded in the > + * item.length, even though the ioctl might still return success. > + */ > + igt_assert_f(item.length > 0, > + "DRM_I915_QUERY_MEMORY_REGIONS failed with %d\n", > + item.length); LGTM. Reviewed-by: Ramalingam C <ramalingam.c@intel.com> > > query_info = calloc(1, item.length); > > -- > 2.26.3 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-07-26 11:46 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-07-08 12:25 [Intel-gfx] [PATCH i-g-t 1/3] lib/intel_memory_region: verify item.length Matthew Auld 2021-07-08 12:25 ` [Intel-gfx] [PATCH i-g-t 2/3] tests/i915_query: extract query_garbage_items Matthew Auld 2021-07-26 10:13 ` [Intel-gfx] [igt-dev] " Ramalingam C 2021-07-08 12:25 ` [Intel-gfx] [PATCH i-g-t 3/3] tests/i915_query: add some sanity checking around regions query Matthew Auld 2021-07-26 11:48 ` [Intel-gfx] [igt-dev] " Ramalingam C 2021-07-26 9:32 ` [Intel-gfx] [PATCH i-g-t 1/3] lib/intel_memory_region: verify item.length Ramalingam C
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).