intel-gfx.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH] iosys-map: Add word-sized reads
@ 2022-06-09 23:20 Lucas De Marchi
  2022-06-09 23:36 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
                   ` (7 more replies)
  0 siblings, 8 replies; 11+ messages in thread
From: Lucas De Marchi @ 2022-06-09 23:20 UTC (permalink / raw)
  To: intel-gfx, dri-devel
  Cc: daniel.vetter, Lucas De Marchi, christian.koenig, tzimmermann,
	Chris Wilson

Instead of always falling back to memcpy_fromio() for any size, prefer
using read{b,w,l}(). When reading struct members it's common to read
individual integer variables individually. Going through memcpy_fromio()
for each of them poses a high penalty.

Employ a similar trick as __seqprop() by using _Generic() to generate
only the specific call based on a type-compatible variable.

For a pariticular i915 workload producing GPU context switches,
__get_engine_usage_record() is particularly hot since the engine usage
is read from device local memory with dgfx, possibly multiple times
since it's racy. Test execution time for this test shows a ~12.5%
improvement with DG2:

Before:
	nrepeats = 1000; min = 7.63243e+06; max = 1.01817e+07;
	median = 9.52548e+06; var = 526149;
After:
	nrepeats = 1000; min = 7.03402e+06; max = 8.8832e+06;
	median = 8.33955e+06; var = 333113;

Other things attempted that didn't prove very useful:
1) Change the _Generic() on x86 to just dereference the memory address
2) Change __get_engine_usage_record() to do just 1 read per loop,
   comparing with the previous value read
3) Change __get_engine_usage_record() to access the fields directly as it
   was before the conversion to iosys-map

(3) did gave a small improvement (~3%), but doesn't seem to scale well
to other similar cases in the driver.

Additional test by Chris Wilson using gem_create from igt with some
changes to track object creation time. This happens to accidentaly
stress this code path:

	Pre iosys_map conversion of engine busyness:
	lmem0: Creating    262144 4KiB objects took 59274.2ms

	Unpatched:
	lmem0: Creating    262144 4KiB objects took 108830.2ms

	With readl (this patch):
	lmem0: Creating    262144 4KiB objects took 61348.6ms

	s/readl/READ_ONCE/
	lmem0: Creating    262144 4KiB objects took 61333.2ms

So we do take a little bit more time than before the conversion, but
that is due to other factors: bringing the READ_ONCE back would be as
good as just doing this conversion.

Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
---

If this is acceptable we should probably add the write counterpart, too.
Sending here only the read for now since this fixes the issue we are
seeing and to gather feedback.

 include/linux/iosys-map.h | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/include/linux/iosys-map.h b/include/linux/iosys-map.h
index e69a002d5aa4..4ae3e459419e 100644
--- a/include/linux/iosys-map.h
+++ b/include/linux/iosys-map.h
@@ -333,6 +333,20 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
 		memset(dst->vaddr + offset, value, len);
 }
 
+#ifdef CONFIG_64BIT
+#define __iosys_map_rd_io_u64_case(val_, vaddr_iomem_)			\
+	u64: val_ = readq(vaddr_iomem_),
+#else
+#define __iosys_map_u64_case(val_, vaddr_iomem_)
+#endif
+
+#define __iosys_map_rd_io(val__, vaddr_iomem__, type__) _Generic(val__,	\
+	u8: val__ = readb(vaddr_iomem__),				\
+	u16: val__ = readw(vaddr_iomem__),				\
+	u32: val__ = readl(vaddr_iomem__),				\
+	__iosys_map_rd_io_u64_case(val__, vaddr_iomem__)		\
+	default: memcpy_fromio(&(val__), vaddr_iomem__, sizeof(val__)))
+
 /**
  * iosys_map_rd - Read a C-type value from the iosys_map
  *
@@ -346,10 +360,14 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
  * Returns:
  * The value read from the mapping.
  */
-#define iosys_map_rd(map__, offset__, type__) ({			\
-	type__ val;							\
-	iosys_map_memcpy_from(&val, map__, offset__, sizeof(val));	\
-	val;								\
+#define iosys_map_rd(map__, offset__, type__) ({				\
+	type__ val;								\
+	if ((map__)->is_iomem) {						\
+		__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
+	} else {								\
+		memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
+	}									\
+	val;									\
 })
 
 /**
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for iosys-map: Add word-sized reads
  2022-06-09 23:20 [Intel-gfx] [PATCH] iosys-map: Add word-sized reads Lucas De Marchi
@ 2022-06-09 23:36 ` Patchwork
  2022-06-09 23:36 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2022-06-09 23:36 UTC (permalink / raw)
  To: Lucas De Marchi; +Cc: intel-gfx

== Series Details ==

Series: iosys-map: Add word-sized reads
URL   : https://patchwork.freedesktop.org/series/104947/
State : warning

== Summary ==

Error: dim checkpatch failed
9f93e9ff5930 iosys-map: Add word-sized reads
-:38: WARNING:TYPO_SPELLING: 'accidentaly' may be misspelled - perhaps 'accidentally'?
#38: 
changes to track object creation time. This happens to accidentaly
                                                       ^^^^^^^^^^^

-:69: ERROR:SPACING: spaces required around that ':' (ctx:VxW)
#69: FILE: include/linux/iosys-map.h:338:
+	u64: val_ = readq(vaddr_iomem_),
 	   ^

-:69: WARNING:INDENTED_LABEL: labels should not be indented
#69: FILE: include/linux/iosys-map.h:338:
+	u64: val_ = readq(vaddr_iomem_),

-:74: CHECK:CAMELCASE: Avoid CamelCase: <_Generic>
#74: FILE: include/linux/iosys-map.h:343:
+#define __iosys_map_rd_io(val__, vaddr_iomem__, type__) _Generic(val__,	\

-:74: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'val__' - possible side-effects?
#74: FILE: include/linux/iosys-map.h:343:
+#define __iosys_map_rd_io(val__, vaddr_iomem__, type__) _Generic(val__,	\
+	u8: val__ = readb(vaddr_iomem__),				\
+	u16: val__ = readw(vaddr_iomem__),				\
+	u32: val__ = readl(vaddr_iomem__),				\
+	__iosys_map_rd_io_u64_case(val__, vaddr_iomem__)		\
+	default: memcpy_fromio(&(val__), vaddr_iomem__, sizeof(val__)))

-:74: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'vaddr_iomem__' - possible side-effects?
#74: FILE: include/linux/iosys-map.h:343:
+#define __iosys_map_rd_io(val__, vaddr_iomem__, type__) _Generic(val__,	\
+	u8: val__ = readb(vaddr_iomem__),				\
+	u16: val__ = readw(vaddr_iomem__),				\
+	u32: val__ = readl(vaddr_iomem__),				\
+	__iosys_map_rd_io_u64_case(val__, vaddr_iomem__)		\
+	default: memcpy_fromio(&(val__), vaddr_iomem__, sizeof(val__)))

-:75: ERROR:SPACING: spaces required around that ':' (ctx:VxW)
#75: FILE: include/linux/iosys-map.h:344:
+	u8: val__ = readb(vaddr_iomem__),				\
 	  ^

-:75: WARNING:INDENTED_LABEL: labels should not be indented
#75: FILE: include/linux/iosys-map.h:344:
+	u8: val__ = readb(vaddr_iomem__),				\

-:76: ERROR:SPACING: spaces required around that ':' (ctx:VxW)
#76: FILE: include/linux/iosys-map.h:345:
+	u16: val__ = readw(vaddr_iomem__),				\
 	   ^

-:76: WARNING:INDENTED_LABEL: labels should not be indented
#76: FILE: include/linux/iosys-map.h:345:
+	u16: val__ = readw(vaddr_iomem__),				\

-:77: ERROR:SPACING: spaces required around that ':' (ctx:VxW)
#77: FILE: include/linux/iosys-map.h:346:
+	u32: val__ = readl(vaddr_iomem__),				\
 	   ^

-:77: WARNING:INDENTED_LABEL: labels should not be indented
#77: FILE: include/linux/iosys-map.h:346:
+	u32: val__ = readl(vaddr_iomem__),				\

-:79: ERROR:SPACING: spaces required around that ':' (ctx:VxW)
#79: FILE: include/linux/iosys-map.h:348:
+	default: memcpy_fromio(&(val__), vaddr_iomem__, sizeof(val__)))
 	       ^

-:79: ERROR:TRAILING_STATEMENTS: trailing statements should be on next line
#79: FILE: include/linux/iosys-map.h:348:
+	default: memcpy_fromio(&(val__), vaddr_iomem__, sizeof(val__)))

-:92: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'map__' - possible side-effects?
#92: FILE: include/linux/iosys-map.h:363:
+#define iosys_map_rd(map__, offset__, type__) ({				\
+	type__ val;								\
+	if ((map__)->is_iomem) {						\
+		__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
+	} else {								\
+		memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
+	}									\
+	val;									\
 })

-:92: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'offset__' - possible side-effects?
#92: FILE: include/linux/iosys-map.h:363:
+#define iosys_map_rd(map__, offset__, type__) ({				\
+	type__ val;								\
+	if ((map__)->is_iomem) {						\
+		__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
+	} else {								\
+		memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
+	}									\
+	val;									\
 })

-:92: CHECK:MACRO_ARG_PRECEDENCE: Macro argument 'offset__' may be better as '(offset__)' to avoid precedence issues
#92: FILE: include/linux/iosys-map.h:363:
+#define iosys_map_rd(map__, offset__, type__) ({				\
+	type__ val;								\
+	if ((map__)->is_iomem) {						\
+		__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
+	} else {								\
+		memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
+	}									\
+	val;									\
 })

-:92: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'type__' - possible side-effects?
#92: FILE: include/linux/iosys-map.h:363:
+#define iosys_map_rd(map__, offset__, type__) ({				\
+	type__ val;								\
+	if ((map__)->is_iomem) {						\
+		__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
+	} else {								\
+		memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
+	}									\
+	val;									\
 })

total: 6 errors, 5 warnings, 7 checks, 38 lines checked



^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Intel-gfx] ✗ Fi.CI.SPARSE: warning for iosys-map: Add word-sized reads
  2022-06-09 23:20 [Intel-gfx] [PATCH] iosys-map: Add word-sized reads Lucas De Marchi
  2022-06-09 23:36 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
@ 2022-06-09 23:36 ` Patchwork
  2022-06-10  2:55 ` [Intel-gfx] [PATCH] " kernel test robot
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2022-06-09 23:36 UTC (permalink / raw)
  To: Lucas De Marchi; +Cc: intel-gfx

== Series Details ==

Series: iosys-map: Add word-sized reads
URL   : https://patchwork.freedesktop.org/series/104947/
State : warning

== Summary ==

Error: dim sparse failed
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Intel-gfx] [PATCH] iosys-map: Add word-sized reads
  2022-06-09 23:20 [Intel-gfx] [PATCH] iosys-map: Add word-sized reads Lucas De Marchi
  2022-06-09 23:36 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
  2022-06-09 23:36 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
@ 2022-06-10  2:55 ` kernel test robot
  2022-06-10  7:05 ` [Intel-gfx] ✓ Fi.CI.BAT: success for " Patchwork
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: kernel test robot @ 2022-06-10  2:55 UTC (permalink / raw)
  To: Lucas De Marchi, intel-gfx, dri-devel
  Cc: kbuild-all, daniel.vetter, llvm, Lucas De Marchi, Chris Wilson,
	tzimmermann, christian.koenig

Hi Lucas,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on drm-tip/drm-tip]
[also build test ERROR on linus/master v5.19-rc1 next-20220609]
[cannot apply to tegra-drm/drm/tegra/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Lucas-De-Marchi/iosys-map-Add-word-sized-reads/20220610-072113
base:   git://anongit.freedesktop.org/drm/drm-tip drm-tip
config: i386-randconfig-a013 (https://download.01.org/0day-ci/archive/20220610/202206101010.IAvFUbqo-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 70d35fe1257e429266b83025997b400e9f79110e)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/7b9b2d6b8d738fe2857fa1a96f7f3c9d8c11e9cd
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Lucas-De-Marchi/iosys-map-Add-word-sized-reads/20220610-072113
        git checkout 7b9b2d6b8d738fe2857fa1a96f7f3c9d8c11e9cd
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1154:14: error: unknown type name '__iosys_map_rd_io_u64_case'
                   *last_in = record_read(&rec_map, last_switch_in_stamp);
                              ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1134:2: note: expanded from macro 'record_read'
           iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:2: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
           ^
>> drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1154:14: error: type-id cannot have a name
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1134:2: note: expanded from macro 'record_read'
           iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:21: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                                     ^
>> drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1154:14: error: expected ')'
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1134:2: note: expanded from macro 'record_read'
           iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:34: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
                                           ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1154:14: note: to match this '('
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1134:2: note: expanded from macro 'record_read'
           iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:28: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
                                     ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1155:9: error: unknown type name '__iosys_map_rd_io_u64_case'
                   *id = record_read(&rec_map, current_context_index);
                         ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1134:2: note: expanded from macro 'record_read'
           iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:2: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
           ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1155:9: error: type-id cannot have a name
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1134:2: note: expanded from macro 'record_read'
           iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:21: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                                     ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1155:9: error: expected ')'
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1134:2: note: expanded from macro 'record_read'
           iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:34: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
                                           ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1155:9: note: to match this '('
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1134:2: note: expanded from macro 'record_read'
           iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:28: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
                                     ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1156:12: error: unknown type name '__iosys_map_rd_io_u64_case'
                   *total = record_read(&rec_map, total_runtime);
                            ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1134:2: note: expanded from macro 'record_read'
           iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:2: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
           ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1156:12: error: type-id cannot have a name
   drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:1134:2: note: expanded from macro 'record_read'
           iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:21: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
--
>> drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:165:6: error: unknown type name '__iosys_map_rd_io_u64_case'
                      ads_blob_read(guc, policies.dpc_promote_time));
                      ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:2: note: expanded from macro 'ads_blob_read'
           iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:2: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
           ^
>> drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:165:6: error: type-id cannot have a name
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:2: note: expanded from macro 'ads_blob_read'
           iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:21: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                                     ^
>> drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:165:6: error: expected ')'
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:2: note: expanded from macro 'ads_blob_read'
           iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:34: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
                                           ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:165:6: note: to match this '('
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:2: note: expanded from macro 'ads_blob_read'
           iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:28: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
                                     ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:167:6: error: unknown type name '__iosys_map_rd_io_u64_case'
                      ads_blob_read(guc, policies.max_num_work_items));
                      ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:2: note: expanded from macro 'ads_blob_read'
           iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:2: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
           ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:167:6: error: type-id cannot have a name
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:2: note: expanded from macro 'ads_blob_read'
           iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:21: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                                     ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:167:6: error: expected ')'
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:2: note: expanded from macro 'ads_blob_read'
           iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:34: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
                                           ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:167:6: note: to match this '('
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:2: note: expanded from macro 'ads_blob_read'
           iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:28: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
                                     ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:169:6: error: unknown type name '__iosys_map_rd_io_u64_case'
                      ads_blob_read(guc, policies.global_flags));
                      ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:2: note: expanded from macro 'ads_blob_read'
           iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:3: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
                   ^
   include/linux/iosys-map.h:347:2: note: expanded from macro '__iosys_map_rd_io'
           __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
           ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:169:6: error: type-id cannot have a name
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:2: note: expanded from macro 'ads_blob_read'
           iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
           ^
   include/linux/iosys-map.h:452:2: note: expanded from macro 'iosys_map_rd_field'
           iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
           ^
   include/linux/iosys-map.h:366:21: note: expanded from macro 'iosys_map_rd'
                   __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\


vim +/__iosys_map_rd_io_u64_case +1154 drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c

77cdd054dd2ced Umesh Nerlige Ramappa 2021-10-26  1132  
4801b99588a2e0 Lucas De Marchi       2022-02-16  1133  #define record_read(map_, field_) \
4801b99588a2e0 Lucas De Marchi       2022-02-16  1134  	iosys_map_rd_field(map_, 0, struct guc_engine_usage_record, field_)
4801b99588a2e0 Lucas De Marchi       2022-02-16  1135  
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1136  /*
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1137   * GuC updates shared memory and KMD reads it. Since this is not synchronized,
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1138   * we run into a race where the value read is inconsistent. Sometimes the
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1139   * inconsistency is in reading the upper MSB bytes of the last_in value when
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1140   * this race occurs. 2 types of cases are seen - upper 8 bits are zero and upper
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1141   * 24 bits are zero. Since these are non-zero values, it is non-trivial to
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1142   * determine validity of these values. Instead we read the values multiple times
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1143   * until they are consistent. In test runs, 3 attempts results in consistent
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1144   * values. The upper bound is set to 6 attempts and may need to be tuned as per
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1145   * any new occurences.
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1146   */
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1147  static void __get_engine_usage_record(struct intel_engine_cs *engine,
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1148  				      u32 *last_in, u32 *id, u32 *total)
77cdd054dd2ced Umesh Nerlige Ramappa 2021-10-26  1149  {
4801b99588a2e0 Lucas De Marchi       2022-02-16  1150  	struct iosys_map rec_map = intel_guc_engine_usage_record_map(engine);
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1151  	int i = 0;
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1152  
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1153  	do {
4801b99588a2e0 Lucas De Marchi       2022-02-16 @1154  		*last_in = record_read(&rec_map, last_switch_in_stamp);
4801b99588a2e0 Lucas De Marchi       2022-02-16  1155  		*id = record_read(&rec_map, current_context_index);
4801b99588a2e0 Lucas De Marchi       2022-02-16  1156  		*total = record_read(&rec_map, total_runtime);
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1157  
4801b99588a2e0 Lucas De Marchi       2022-02-16  1158  		if (record_read(&rec_map, last_switch_in_stamp) == *last_in &&
4801b99588a2e0 Lucas De Marchi       2022-02-16  1159  		    record_read(&rec_map, current_context_index) == *id &&
4801b99588a2e0 Lucas De Marchi       2022-02-16  1160  		    record_read(&rec_map, total_runtime) == *total)
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1161  			break;
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1162  	} while (++i < 6);
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1163  }
512712a824de9b Umesh Nerlige Ramappa 2022-01-24  1164  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Intel-gfx] ✓ Fi.CI.BAT: success for iosys-map: Add word-sized reads
  2022-06-09 23:20 [Intel-gfx] [PATCH] iosys-map: Add word-sized reads Lucas De Marchi
                   ` (2 preceding siblings ...)
  2022-06-10  2:55 ` [Intel-gfx] [PATCH] " kernel test robot
@ 2022-06-10  7:05 ` Patchwork
  2022-06-10  7:20 ` [Intel-gfx] [PATCH] " Christian König
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2022-06-10  7:05 UTC (permalink / raw)
  To: Lucas De Marchi; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 9721 bytes --]

== Series Details ==

Series: iosys-map: Add word-sized reads
URL   : https://patchwork.freedesktop.org/series/104947/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11750 -> Patchwork_104947v1
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/index.html

Participating hosts (40 -> 42)
------------------------------

  Additional (4): bat-dg2-8 bat-adlm-1 bat-dg2-9 fi-ilk-650 
  Missing    (2): fi-rkl-11600 fi-bdw-samus 

Known issues
------------

  Here are the changes found in Patchwork_104947v1 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@i915_pm_rpm@basic-pci-d3-state:
    - fi-ilk-650:         NOTRUN -> [SKIP][1] ([fdo#109271]) +22 similar issues
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-ilk-650/igt@i915_pm_rpm@basic-pci-d3-state.html

  * igt@i915_selftest@live@requests:
    - fi-pnv-d510:        [PASS][2] -> [DMESG-FAIL][3] ([i915#4528])
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/fi-pnv-d510/igt@i915_selftest@live@requests.html
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-pnv-d510/igt@i915_selftest@live@requests.html

  * igt@kms_busy@basic@modeset:
    - bat-adlp-4:         [PASS][4] -> [DMESG-WARN][5] ([i915#3576])
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/bat-adlp-4/igt@kms_busy@basic@modeset.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/bat-adlp-4/igt@kms_busy@basic@modeset.html

  * igt@kms_chamelium@common-hpd-after-suspend:
    - fi-hsw-g3258:       NOTRUN -> [SKIP][6] ([fdo#109271] / [fdo#111827])
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-hsw-g3258/igt@kms_chamelium@common-hpd-after-suspend.html
    - fi-snb-2600:        NOTRUN -> [SKIP][7] ([fdo#109271] / [fdo#111827])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-snb-2600/igt@kms_chamelium@common-hpd-after-suspend.html

  * igt@kms_chamelium@hdmi-edid-read:
    - fi-ilk-650:         NOTRUN -> [SKIP][8] ([fdo#109271] / [fdo#111827]) +8 similar issues
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-ilk-650/igt@kms_chamelium@hdmi-edid-read.html

  * igt@runner@aborted:
    - fi-pnv-d510:        NOTRUN -> [FAIL][9] ([fdo#109271] / [i915#2403] / [i915#4312])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-pnv-d510/igt@runner@aborted.html

  
#### Possible fixes ####

  * igt@i915_pm_rpm@module-reload:
    - fi-cfl-8109u:       [DMESG-FAIL][10] ([i915#62]) -> [PASS][11]
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/fi-cfl-8109u/igt@i915_pm_rpm@module-reload.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-cfl-8109u/igt@i915_pm_rpm@module-reload.html

  * igt@i915_selftest@live@gem_contexts:
    - {fi-tgl-dsi}:       [INCOMPLETE][12] -> [PASS][13]
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/fi-tgl-dsi/igt@i915_selftest@live@gem_contexts.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-tgl-dsi/igt@i915_selftest@live@gem_contexts.html

  * igt@i915_selftest@live@hangcheck:
    - fi-hsw-g3258:       [INCOMPLETE][14] ([i915#4785]) -> [PASS][15]
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/fi-hsw-g3258/igt@i915_selftest@live@hangcheck.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-hsw-g3258/igt@i915_selftest@live@hangcheck.html
    - fi-snb-2600:        [INCOMPLETE][16] ([i915#3921]) -> [PASS][17]
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/fi-snb-2600/igt@i915_selftest@live@hangcheck.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-snb-2600/igt@i915_selftest@live@hangcheck.html

  * igt@i915_selftest@live@ring_submission:
    - fi-cfl-8109u:       [DMESG-WARN][18] ([i915#5904]) -> [PASS][19] +11 similar issues
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/fi-cfl-8109u/igt@i915_selftest@live@ring_submission.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-cfl-8109u/igt@i915_selftest@live@ring_submission.html

  * igt@i915_suspend@basic-s2idle-without-i915:
    - fi-cfl-8109u:       [DMESG-WARN][20] ([i915#5904] / [i915#62]) -> [PASS][21]
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/fi-cfl-8109u/igt@i915_suspend@basic-s2idle-without-i915.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-cfl-8109u/igt@i915_suspend@basic-s2idle-without-i915.html

  * igt@kms_busy@basic@flip:
    - bat-adlp-4:         [DMESG-WARN][22] ([i915#1982] / [i915#3576]) -> [PASS][23]
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/bat-adlp-4/igt@kms_busy@basic@flip.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/bat-adlp-4/igt@kms_busy@basic@flip.html

  * igt@kms_flip@basic-flip-vs-modeset@a-edp1:
    - bat-adlp-4:         [DMESG-WARN][24] ([i915#3576]) -> [PASS][25]
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/bat-adlp-4/igt@kms_flip@basic-flip-vs-modeset@a-edp1.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/bat-adlp-4/igt@kms_flip@basic-flip-vs-modeset@a-edp1.html

  * igt@kms_flip@basic-flip-vs-wf_vblank@a-edp1:
    - {bat-adlp-6}:       [DMESG-WARN][26] ([i915#3576]) -> [PASS][27] +2 similar issues
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/bat-adlp-6/igt@kms_flip@basic-flip-vs-wf_vblank@a-edp1.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/bat-adlp-6/igt@kms_flip@basic-flip-vs-wf_vblank@a-edp1.html

  * igt@kms_pipe_crc_basic@nonblocking-crc-pipe-a-frame-sequence:
    - fi-cfl-8109u:       [DMESG-WARN][28] ([i915#62]) -> [PASS][29] +14 similar issues
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/fi-cfl-8109u/igt@kms_pipe_crc_basic@nonblocking-crc-pipe-a-frame-sequence.html
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/fi-cfl-8109u/igt@kms_pipe_crc_basic@nonblocking-crc-pipe-a-frame-sequence.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109284]: https://bugs.freedesktop.org/show_bug.cgi?id=109284
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#1155]: https://gitlab.freedesktop.org/drm/intel/issues/1155
  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2403]: https://gitlab.freedesktop.org/drm/intel/issues/2403
  [i915#2582]: https://gitlab.freedesktop.org/drm/intel/issues/2582
  [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
  [i915#3291]: https://gitlab.freedesktop.org/drm/intel/issues/3291
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3576]: https://gitlab.freedesktop.org/drm/intel/issues/3576
  [i915#3595]: https://gitlab.freedesktop.org/drm/intel/issues/3595
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#3921]: https://gitlab.freedesktop.org/drm/intel/issues/3921
  [i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
  [i915#4079]: https://gitlab.freedesktop.org/drm/intel/issues/4079
  [i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
  [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
  [i915#4212]: https://gitlab.freedesktop.org/drm/intel/issues/4212
  [i915#4213]: https://gitlab.freedesktop.org/drm/intel/issues/4213
  [i915#4215]: https://gitlab.freedesktop.org/drm/intel/issues/4215
  [i915#4312]: https://gitlab.freedesktop.org/drm/intel/issues/4312
  [i915#4528]: https://gitlab.freedesktop.org/drm/intel/issues/4528
  [i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579
  [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
  [i915#4785]: https://gitlab.freedesktop.org/drm/intel/issues/4785
  [i915#4873]: https://gitlab.freedesktop.org/drm/intel/issues/4873
  [i915#5122]: https://gitlab.freedesktop.org/drm/intel/issues/5122
  [i915#5174]: https://gitlab.freedesktop.org/drm/intel/issues/5174
  [i915#5190]: https://gitlab.freedesktop.org/drm/intel/issues/5190
  [i915#5274]: https://gitlab.freedesktop.org/drm/intel/issues/5274
  [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
  [i915#5356]: https://gitlab.freedesktop.org/drm/intel/issues/5356
  [i915#5763]: https://gitlab.freedesktop.org/drm/intel/issues/5763
  [i915#5885]: https://gitlab.freedesktop.org/drm/intel/issues/5885
  [i915#5903]: https://gitlab.freedesktop.org/drm/intel/issues/5903
  [i915#5904]: https://gitlab.freedesktop.org/drm/intel/issues/5904
  [i915#6132]: https://gitlab.freedesktop.org/drm/intel/issues/6132
  [i915#62]: https://gitlab.freedesktop.org/drm/intel/issues/62


Build changes
-------------

  * Linux: CI_DRM_11750 -> Patchwork_104947v1

  CI-20190529: 20190529
  CI_DRM_11750: d9c6b670bba2e213d4303234654dc52c4dbc9662 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_6518: 0189ca288f7188e60f5eda356b190040bf8ec704 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_104947v1: d9c6b670bba2e213d4303234654dc52c4dbc9662 @ git://anongit.freedesktop.org/gfx-ci/linux


### Linux commits

d9ea7d21d1a0 iosys-map: Add word-sized reads

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/index.html

[-- Attachment #2: Type: text/html, Size: 9502 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Intel-gfx] [PATCH] iosys-map: Add word-sized reads
  2022-06-09 23:20 [Intel-gfx] [PATCH] iosys-map: Add word-sized reads Lucas De Marchi
                   ` (3 preceding siblings ...)
  2022-06-10  7:05 ` [Intel-gfx] ✓ Fi.CI.BAT: success for " Patchwork
@ 2022-06-10  7:20 ` Christian König
  2022-06-10 17:35   ` Lucas De Marchi
  2022-06-10 14:17 ` kernel test robot
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 11+ messages in thread
From: Christian König @ 2022-06-10  7:20 UTC (permalink / raw)
  To: Lucas De Marchi, intel-gfx, dri-devel
  Cc: daniel.vetter, tzimmermann, Chris Wilson

Am 10.06.22 um 01:20 schrieb Lucas De Marchi:
> Instead of always falling back to memcpy_fromio() for any size, prefer
> using read{b,w,l}(). When reading struct members it's common to read
> individual integer variables individually. Going through memcpy_fromio()
> for each of them poses a high penalty.
>
> Employ a similar trick as __seqprop() by using _Generic() to generate
> only the specific call based on a type-compatible variable.
>
> For a pariticular i915 workload producing GPU context switches,
> __get_engine_usage_record() is particularly hot since the engine usage
> is read from device local memory with dgfx, possibly multiple times
> since it's racy. Test execution time for this test shows a ~12.5%
> improvement with DG2:
>
> Before:
> 	nrepeats = 1000; min = 7.63243e+06; max = 1.01817e+07;
> 	median = 9.52548e+06; var = 526149;
> After:
> 	nrepeats = 1000; min = 7.03402e+06; max = 8.8832e+06;
> 	median = 8.33955e+06; var = 333113;
>
> Other things attempted that didn't prove very useful:
> 1) Change the _Generic() on x86 to just dereference the memory address
> 2) Change __get_engine_usage_record() to do just 1 read per loop,
>     comparing with the previous value read
> 3) Change __get_engine_usage_record() to access the fields directly as it
>     was before the conversion to iosys-map
>
> (3) did gave a small improvement (~3%), but doesn't seem to scale well
> to other similar cases in the driver.
>
> Additional test by Chris Wilson using gem_create from igt with some
> changes to track object creation time. This happens to accidentaly
> stress this code path:
>
> 	Pre iosys_map conversion of engine busyness:
> 	lmem0: Creating    262144 4KiB objects took 59274.2ms
>
> 	Unpatched:
> 	lmem0: Creating    262144 4KiB objects took 108830.2ms
>
> 	With readl (this patch):
> 	lmem0: Creating    262144 4KiB objects took 61348.6ms
>
> 	s/readl/READ_ONCE/
> 	lmem0: Creating    262144 4KiB objects took 61333.2ms
>
> So we do take a little bit more time than before the conversion, but
> that is due to other factors: bringing the READ_ONCE back would be as
> good as just doing this conversion.
>
> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> ---
>
> If this is acceptable we should probably add the write counterpart, too.
> Sending here only the read for now since this fixes the issue we are
> seeing and to gather feedback.

As far as I can see looks sane to me, but the kernel test robot tears 
the patch apart.

Probably just a typo somewhere in the 32bit handling.

Apart from that looks good to me.

Regards,
Christian.

>
>   include/linux/iosys-map.h | 26 ++++++++++++++++++++++----
>   1 file changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/include/linux/iosys-map.h b/include/linux/iosys-map.h
> index e69a002d5aa4..4ae3e459419e 100644
> --- a/include/linux/iosys-map.h
> +++ b/include/linux/iosys-map.h
> @@ -333,6 +333,20 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
>   		memset(dst->vaddr + offset, value, len);
>   }
>   
> +#ifdef CONFIG_64BIT
> +#define __iosys_map_rd_io_u64_case(val_, vaddr_iomem_)			\
> +	u64: val_ = readq(vaddr_iomem_),
> +#else
> +#define __iosys_map_u64_case(val_, vaddr_iomem_)
> +#endif
> +
> +#define __iosys_map_rd_io(val__, vaddr_iomem__, type__) _Generic(val__,	\
> +	u8: val__ = readb(vaddr_iomem__),				\
> +	u16: val__ = readw(vaddr_iomem__),				\
> +	u32: val__ = readl(vaddr_iomem__),				\
> +	__iosys_map_rd_io_u64_case(val__, vaddr_iomem__)		\
> +	default: memcpy_fromio(&(val__), vaddr_iomem__, sizeof(val__)))
> +
>   /**
>    * iosys_map_rd - Read a C-type value from the iosys_map
>    *
> @@ -346,10 +360,14 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
>    * Returns:
>    * The value read from the mapping.
>    */
> -#define iosys_map_rd(map__, offset__, type__) ({			\
> -	type__ val;							\
> -	iosys_map_memcpy_from(&val, map__, offset__, sizeof(val));	\
> -	val;								\
> +#define iosys_map_rd(map__, offset__, type__) ({				\
> +	type__ val;								\
> +	if ((map__)->is_iomem) {						\
> +		__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
> +	} else {								\
> +		memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
> +	}									\
> +	val;									\
>   })
>   
>   /**


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Intel-gfx] [PATCH] iosys-map: Add word-sized reads
  2022-06-09 23:20 [Intel-gfx] [PATCH] iosys-map: Add word-sized reads Lucas De Marchi
                   ` (4 preceding siblings ...)
  2022-06-10  7:20 ` [Intel-gfx] [PATCH] " Christian König
@ 2022-06-10 14:17 ` kernel test robot
  2022-06-11  7:02 ` [Intel-gfx] ✓ Fi.CI.IGT: success for " Patchwork
  2022-06-13 10:58 ` [Intel-gfx] [PATCH] " Thomas Zimmermann
  7 siblings, 0 replies; 11+ messages in thread
From: kernel test robot @ 2022-06-10 14:17 UTC (permalink / raw)
  To: Lucas De Marchi, intel-gfx, dri-devel
  Cc: kbuild-all, daniel.vetter, Lucas De Marchi, Chris Wilson,
	tzimmermann, christian.koenig

Hi Lucas,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on drm-tip/drm-tip]
[also build test ERROR on linus/master v5.19-rc1 next-20220610]
[cannot apply to tegra-drm/drm/tegra/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Lucas-De-Marchi/iosys-map-Add-word-sized-reads/20220610-072113
base:   git://anongit.freedesktop.org/drm/drm-tip drm-tip
config: i386-defconfig (https://download.01.org/0day-ci/archive/20220610/202206102230.Ji70o9lR-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.3.0-3) 11.3.0
reproduce (this is a W=1 build):
        # https://github.com/intel-lab-lkp/linux/commit/7b9b2d6b8d738fe2857fa1a96f7f3c9d8c11e9cd
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Lucas-De-Marchi/iosys-map-Add-word-sized-reads/20220610-072113
        git checkout 7b9b2d6b8d738fe2857fa1a96f7f3c9d8c11e9cd
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from drivers/gpu/drm/i915/gt/uc/intel_guc.h:10,
                    from drivers/gpu/drm/i915/gt/uc/intel_uc.h:9,
                    from drivers/gpu/drm/i915/gt/intel_gt_types.h:18,
                    from drivers/gpu/drm/i915/gt/intel_gt.h:10,
                    from drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:9:
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c: In function 'intel_guc_ads_print_policy_info':
>> include/linux/iosys-map.h:347:9: error: unknown type name '__iosys_map_rd_io_u64_case'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:165:20: note: in expansion of macro 'ads_blob_read'
     165 |                    ads_blob_read(guc, policies.dpc_promote_time));
         |                    ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:366:35: error: expected ')' before 'val'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                                   ^~~
   include/linux/iosys-map.h:347:36: note: in definition of macro '__iosys_map_rd_io'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |                                    ^~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:165:20: note: in expansion of macro 'ads_blob_read'
     165 |                    ads_blob_read(guc, policies.dpc_promote_time));
         |                    ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:347:9: error: unknown type name '__iosys_map_rd_io_u64_case'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:167:20: note: in expansion of macro 'ads_blob_read'
     167 |                    ads_blob_read(guc, policies.max_num_work_items));
         |                    ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:366:35: error: expected ')' before 'val'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                                   ^~~
   include/linux/iosys-map.h:347:36: note: in definition of macro '__iosys_map_rd_io'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |                                    ^~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:167:20: note: in expansion of macro 'ads_blob_read'
     167 |                    ads_blob_read(guc, policies.max_num_work_items));
         |                    ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:347:9: error: unknown type name '__iosys_map_rd_io_u64_case'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:169:20: note: in expansion of macro 'ads_blob_read'
     169 |                    ads_blob_read(guc, policies.global_flags));
         |                    ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:366:35: error: expected ')' before 'val'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                                   ^~~
   include/linux/iosys-map.h:347:36: note: in definition of macro '__iosys_map_rd_io'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |                                    ^~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:169:20: note: in expansion of macro 'ads_blob_read'
     169 |                    ads_blob_read(guc, policies.global_flags));
         |                    ^~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c: In function 'intel_guc_global_policies_update':
>> include/linux/iosys-map.h:347:9: error: unknown type name '__iosys_map_rd_io_u64_case'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:192:30: note: in expansion of macro 'ads_blob_read'
     192 |         scheduler_policies = ads_blob_read(guc, ads.scheduler_policies);
         |                              ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:366:35: error: expected ')' before 'val'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                                   ^~~
   include/linux/iosys-map.h:347:36: note: in definition of macro '__iosys_map_rd_io'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |                                    ^~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:192:30: note: in expansion of macro 'ads_blob_read'
     192 |         scheduler_policies = ads_blob_read(guc, ads.scheduler_policies);
         |                              ^~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c: In function 'guc_prep_golden_context':
>> include/linux/iosys-map.h:347:9: error: unknown type name '__iosys_map_rd_io_u64_case'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:75:9: note: in expansion of macro 'iosys_map_rd_field'
      75 |         iosys_map_rd_field(map_, 0, struct guc_gt_system_info, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:505:22: note: in expansion of macro 'info_map_read'
     505 |                 if (!info_map_read(&info_map, engine_enabled_masks[guc_class]))
         |                      ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:366:35: error: expected ')' before 'val'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                                   ^~~
   include/linux/iosys-map.h:347:36: note: in definition of macro '__iosys_map_rd_io'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |                                    ^~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:75:9: note: in expansion of macro 'iosys_map_rd_field'
      75 |         iosys_map_rd_field(map_, 0, struct guc_gt_system_info, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:505:22: note: in expansion of macro 'info_map_read'
     505 |                 if (!info_map_read(&info_map, engine_enabled_masks[guc_class]))
         |                      ^~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c: In function 'guc_init_golden_context':
>> include/linux/iosys-map.h:347:9: error: unknown type name '__iosys_map_rd_io_u64_case'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:584:22: note: in expansion of macro 'ads_blob_read'
     584 |                 if (!ads_blob_read(guc, system_info.engine_enabled_masks[guc_class]))
         |                      ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:366:35: error: expected ')' before 'val'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                                   ^~~
   include/linux/iosys-map.h:347:36: note: in definition of macro '__iosys_map_rd_io'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |                                    ^~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:584:22: note: in expansion of macro 'ads_blob_read'
     584 |                 if (!ads_blob_read(guc, system_info.engine_enabled_masks[guc_class]))
         |                      ^~~~~~~~~~~~~
   In file included from include/linux/bitfield.h:10,
                    from drivers/gpu/drm/i915/i915_reg_defs.h:9,
                    from drivers/gpu/drm/i915/gt/intel_engine_regs.h:9,
                    from drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:8:
>> include/linux/iosys-map.h:347:9: error: unknown type name '__iosys_map_rd_io_u64_case'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:30:63: note: in definition of macro 'BUILD_BUG_ON_INVALID'
      30 | #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e))))
         |                                                               ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:600:17: note: in expansion of macro 'GEM_BUG_ON'
     600 |                 GEM_BUG_ON(ads_blob_read(guc, ads.eng_state_size[guc_class]) !=
         |                 ^~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:600:28: note: in expansion of macro 'ads_blob_read'
     600 |                 GEM_BUG_ON(ads_blob_read(guc, ads.eng_state_size[guc_class]) !=
         |                            ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:366:35: error: expected ')' before 'val'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                                   ^~~
   include/linux/build_bug.h:30:63: note: in definition of macro 'BUILD_BUG_ON_INVALID'
      30 | #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e))))
         |                                                               ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:600:17: note: in expansion of macro 'GEM_BUG_ON'
     600 |                 GEM_BUG_ON(ads_blob_read(guc, ads.eng_state_size[guc_class]) !=
         |                 ^~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:600:28: note: in expansion of macro 'ads_blob_read'
     600 |                 GEM_BUG_ON(ads_blob_read(guc, ads.eng_state_size[guc_class]) !=
         |                            ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:347:9: error: unknown type name '__iosys_map_rd_io_u64_case'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:30:63: note: in definition of macro 'BUILD_BUG_ON_INVALID'
      30 | #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e))))
         |                                                               ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:602:17: note: in expansion of macro 'GEM_BUG_ON'
     602 |                 GEM_BUG_ON(ads_blob_read(guc, ads.golden_context_lrca[guc_class]) != addr_ggtt);
         |                 ^~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:602:28: note: in expansion of macro 'ads_blob_read'
     602 |                 GEM_BUG_ON(ads_blob_read(guc, ads.golden_context_lrca[guc_class]) != addr_ggtt);
         |                            ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:366:35: error: expected ')' before 'val'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                                   ^~~
   include/linux/build_bug.h:30:63: note: in definition of macro 'BUILD_BUG_ON_INVALID'
      30 | #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e))))
         |                                                               ^
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:602:17: note: in expansion of macro 'GEM_BUG_ON'
     602 |                 GEM_BUG_ON(ads_blob_read(guc, ads.golden_context_lrca[guc_class]) != addr_ggtt);
         |                 ^~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:65:9: note: in expansion of macro 'iosys_map_rd_field'
      65 |         iosys_map_rd_field(&(guc_)->ads_map, 0, struct __guc_ads_blob, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:602:28: note: in expansion of macro 'ads_blob_read'
     602 |                 GEM_BUG_ON(ads_blob_read(guc, ads.golden_context_lrca[guc_class]) != addr_ggtt);
         |                            ^~~~~~~~~~~~~
   In file included from drivers/gpu/drm/i915/gt/uc/intel_guc.h:10,
                    from drivers/gpu/drm/i915/gt/uc/intel_uc.h:9,
                    from drivers/gpu/drm/i915/gt/intel_gt_types.h:18,
                    from drivers/gpu/drm/i915/gt/intel_gt.h:10,
                    from drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:9:
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c: In function 'guc_capture_prep_lists':
>> include/linux/iosys-map.h:347:9: error: unknown type name '__iosys_map_rd_io_u64_case'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:366:17: note: in expansion of macro '__iosys_map_rd_io'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                 ^~~~~~~~~~~~~~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:75:9: note: in expansion of macro 'iosys_map_rd_field'
      75 |         iosys_map_rd_field(map_, 0, struct guc_gt_system_info, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:652:30: note: in expansion of macro 'info_map_read'
     652 |                         if (!info_map_read(&info_map, engine_enabled_masks[j])) {
         |                              ^~~~~~~~~~~~~
>> include/linux/iosys-map.h:366:35: error: expected ')' before 'val'
     366 |                 __iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
         |                                   ^~~
   include/linux/iosys-map.h:347:36: note: in definition of macro '__iosys_map_rd_io'
     347 |         __iosys_map_rd_io_u64_case(val__, vaddr_iomem__)                \
         |                                    ^~~~~
   include/linux/iosys-map.h:452:9: note: in expansion of macro 'iosys_map_rd'
     452 |         iosys_map_rd(map__, struct_offset__ + offsetof(struct_type__, field__), \
         |         ^~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:75:9: note: in expansion of macro 'iosys_map_rd_field'
      75 |         iosys_map_rd_field(map_, 0, struct guc_gt_system_info, field_)
         |         ^~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:652:30: note: in expansion of macro 'info_map_read'
     652 |                         if (!info_map_read(&info_map, engine_enabled_masks[j])) {
         |                              ^~~~~~~~~~~~~
..


vim +/__iosys_map_rd_io_u64_case +347 include/linux/iosys-map.h

   342	
   343	#define __iosys_map_rd_io(val__, vaddr_iomem__, type__) _Generic(val__,	\
   344		u8: val__ = readb(vaddr_iomem__),				\
   345		u16: val__ = readw(vaddr_iomem__),				\
   346		u32: val__ = readl(vaddr_iomem__),				\
 > 347		__iosys_map_rd_io_u64_case(val__, vaddr_iomem__)		\
   348		default: memcpy_fromio(&(val__), vaddr_iomem__, sizeof(val__)))
   349	
   350	/**
   351	 * iosys_map_rd - Read a C-type value from the iosys_map
   352	 *
   353	 * @map__:	The iosys_map structure
   354	 * @offset__:	The offset from which to read
   355	 * @type__:	Type of the value being read
   356	 *
   357	 * Read a C type value from iosys_map, handling possible un-aligned accesses to
   358	 * the mapping.
   359	 *
   360	 * Returns:
   361	 * The value read from the mapping.
   362	 */
   363	#define iosys_map_rd(map__, offset__, type__) ({				\
   364		type__ val;								\
   365		if ((map__)->is_iomem) {						\
 > 366			__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
   367		} else {								\
   368			memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
   369		}									\
   370		val;									\
   371	})
   372	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Intel-gfx] [PATCH] iosys-map: Add word-sized reads
  2022-06-10  7:20 ` [Intel-gfx] [PATCH] " Christian König
@ 2022-06-10 17:35   ` Lucas De Marchi
  0 siblings, 0 replies; 11+ messages in thread
From: Lucas De Marchi @ 2022-06-10 17:35 UTC (permalink / raw)
  To: Christian König
  Cc: daniel.vetter, intel-gfx, tzimmermann, dri-devel, Chris Wilson

On Fri, Jun 10, 2022 at 09:20:18AM +0200, Christian König wrote:
>Am 10.06.22 um 01:20 schrieb Lucas De Marchi:
>>Instead of always falling back to memcpy_fromio() for any size, prefer
>>using read{b,w,l}(). When reading struct members it's common to read
>>individual integer variables individually. Going through memcpy_fromio()
>>for each of them poses a high penalty.
>>
>>Employ a similar trick as __seqprop() by using _Generic() to generate
>>only the specific call based on a type-compatible variable.
>>
>>For a pariticular i915 workload producing GPU context switches,
>>__get_engine_usage_record() is particularly hot since the engine usage
>>is read from device local memory with dgfx, possibly multiple times
>>since it's racy. Test execution time for this test shows a ~12.5%
>>improvement with DG2:
>>
>>Before:
>>	nrepeats = 1000; min = 7.63243e+06; max = 1.01817e+07;
>>	median = 9.52548e+06; var = 526149;
>>After:
>>	nrepeats = 1000; min = 7.03402e+06; max = 8.8832e+06;
>>	median = 8.33955e+06; var = 333113;
>>
>>Other things attempted that didn't prove very useful:
>>1) Change the _Generic() on x86 to just dereference the memory address
>>2) Change __get_engine_usage_record() to do just 1 read per loop,
>>    comparing with the previous value read
>>3) Change __get_engine_usage_record() to access the fields directly as it
>>    was before the conversion to iosys-map
>>
>>(3) did gave a small improvement (~3%), but doesn't seem to scale well
>>to other similar cases in the driver.
>>
>>Additional test by Chris Wilson using gem_create from igt with some
>>changes to track object creation time. This happens to accidentaly
>>stress this code path:
>>
>>	Pre iosys_map conversion of engine busyness:
>>	lmem0: Creating    262144 4KiB objects took 59274.2ms
>>
>>	Unpatched:
>>	lmem0: Creating    262144 4KiB objects took 108830.2ms
>>
>>	With readl (this patch):
>>	lmem0: Creating    262144 4KiB objects took 61348.6ms
>>
>>	s/readl/READ_ONCE/
>>	lmem0: Creating    262144 4KiB objects took 61333.2ms
>>
>>So we do take a little bit more time than before the conversion, but
>>that is due to other factors: bringing the READ_ONCE back would be as
>>good as just doing this conversion.
>>
>>Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
>>---
>>
>>If this is acceptable we should probably add the write counterpart, too.
>>Sending here only the read for now since this fixes the issue we are
>>seeing and to gather feedback.
>
>As far as I can see looks sane to me, but the kernel test robot tears 
>the patch apart.
>
>Probably just a typo somewhere in the 32bit handling.

oh, yeah... after cleaning it up I renamed s/__iosys_map_u64_case/__iosys_map_rd_io_u64_case/
to prepare for adding the write case and forgot the other side of the
ifdef.


>
>Apart from that looks good to me.

thanks
Lucas De Marchi

>
>Regards,
>Christian.
>
>>
>>  include/linux/iosys-map.h | 26 ++++++++++++++++++++++----
>>  1 file changed, 22 insertions(+), 4 deletions(-)
>>
>>diff --git a/include/linux/iosys-map.h b/include/linux/iosys-map.h
>>index e69a002d5aa4..4ae3e459419e 100644
>>--- a/include/linux/iosys-map.h
>>+++ b/include/linux/iosys-map.h
>>@@ -333,6 +333,20 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
>>  		memset(dst->vaddr + offset, value, len);
>>  }
>>+#ifdef CONFIG_64BIT
>>+#define __iosys_map_rd_io_u64_case(val_, vaddr_iomem_)			\
>>+	u64: val_ = readq(vaddr_iomem_),
>>+#else
>>+#define __iosys_map_u64_case(val_, vaddr_iomem_)
>>+#endif
>>+
>>+#define __iosys_map_rd_io(val__, vaddr_iomem__, type__) _Generic(val__,	\
>>+	u8: val__ = readb(vaddr_iomem__),				\
>>+	u16: val__ = readw(vaddr_iomem__),				\
>>+	u32: val__ = readl(vaddr_iomem__),				\
>>+	__iosys_map_rd_io_u64_case(val__, vaddr_iomem__)		\
>>+	default: memcpy_fromio(&(val__), vaddr_iomem__, sizeof(val__)))
>>+
>>  /**
>>   * iosys_map_rd - Read a C-type value from the iosys_map
>>   *
>>@@ -346,10 +360,14 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
>>   * Returns:
>>   * The value read from the mapping.
>>   */
>>-#define iosys_map_rd(map__, offset__, type__) ({			\
>>-	type__ val;							\
>>-	iosys_map_memcpy_from(&val, map__, offset__, sizeof(val));	\
>>-	val;								\
>>+#define iosys_map_rd(map__, offset__, type__) ({				\
>>+	type__ val;								\
>>+	if ((map__)->is_iomem) {						\
>>+		__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
>>+	} else {								\
>>+		memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
>>+	}									\
>>+	val;									\
>>  })
>>  /**
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Intel-gfx] ✓ Fi.CI.IGT: success for iosys-map: Add word-sized reads
  2022-06-09 23:20 [Intel-gfx] [PATCH] iosys-map: Add word-sized reads Lucas De Marchi
                   ` (5 preceding siblings ...)
  2022-06-10 14:17 ` kernel test robot
@ 2022-06-11  7:02 ` Patchwork
  2022-06-13 10:58 ` [Intel-gfx] [PATCH] " Thomas Zimmermann
  7 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2022-06-11  7:02 UTC (permalink / raw)
  To: Lucas De Marchi; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 43600 bytes --]

== Series Details ==

Series: iosys-map: Add word-sized reads
URL   : https://patchwork.freedesktop.org/series/104947/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_11750_full -> Patchwork_104947v1_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (13 -> 13)
------------------------------

  No changes in participating hosts

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in Patchwork_104947v1_full:

### IGT changes ###

#### Suppressed ####

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * igt@kms_ccs@pipe-d-bad-pixel-format-4_tiled_dg2_rc_ccs:
    - {shard-dg1}:        [SKIP][1] ([i915#3689]) -> [SKIP][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-dg1-19/igt@kms_ccs@pipe-d-bad-pixel-format-4_tiled_dg2_rc_ccs.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-dg1-18/igt@kms_ccs@pipe-d-bad-pixel-format-4_tiled_dg2_rc_ccs.html

  * igt@kms_cursor_legacy@cursor-vs-flip-atomic-transitions-varying-size:
    - {shard-dg1}:        [PASS][3] -> [FAIL][4]
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-dg1-19/igt@kms_cursor_legacy@cursor-vs-flip-atomic-transitions-varying-size.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-dg1-18/igt@kms_cursor_legacy@cursor-vs-flip-atomic-transitions-varying-size.html

  * igt@kms_flip@busy-flip@a-hdmi-a3:
    - {shard-dg1}:        NOTRUN -> [FAIL][5] +3 similar issues
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-dg1-18/igt@kms_flip@busy-flip@a-hdmi-a3.html

  * igt@kms_invalid_mode@zero-clock:
    - {shard-dg1}:        [PASS][6] -> [WARN][7]
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-dg1-19/igt@kms_invalid_mode@zero-clock.html
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-dg1-18/igt@kms_invalid_mode@zero-clock.html

  
Known issues
------------

  Here are the changes found in Patchwork_104947v1_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_eio@kms:
    - shard-tglb:         [PASS][8] -> [FAIL][9] ([i915#5784])
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-tglb7/igt@gem_eio@kms.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-tglb5/igt@gem_eio@kms.html

  * igt@gem_exec_balancer@parallel-keep-submit-fence:
    - shard-iclb:         [PASS][10] -> [SKIP][11] ([i915#4525]) +2 similar issues
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb2/igt@gem_exec_balancer@parallel-keep-submit-fence.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb8/igt@gem_exec_balancer@parallel-keep-submit-fence.html

  * igt@gem_exec_fair@basic-none-rrul@rcs0:
    - shard-iclb:         [PASS][12] -> [FAIL][13] ([i915#2842])
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb7/igt@gem_exec_fair@basic-none-rrul@rcs0.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb6/igt@gem_exec_fair@basic-none-rrul@rcs0.html

  * igt@gem_exec_fair@basic-none-vip@rcs0:
    - shard-glk:          [PASS][14] -> [FAIL][15] ([i915#2842])
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-glk5/igt@gem_exec_fair@basic-none-vip@rcs0.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-glk6/igt@gem_exec_fair@basic-none-vip@rcs0.html

  * igt@gem_exec_fair@basic-none@vcs1:
    - shard-kbl:          [PASS][16] -> [FAIL][17] ([i915#2842])
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-kbl4/igt@gem_exec_fair@basic-none@vcs1.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-kbl6/igt@gem_exec_fair@basic-none@vcs1.html

  * igt@gem_exec_fair@basic-pace-share@rcs0:
    - shard-tglb:         [PASS][18] -> [FAIL][19] ([i915#2842])
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-tglb6/igt@gem_exec_fair@basic-pace-share@rcs0.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-tglb1/igt@gem_exec_fair@basic-pace-share@rcs0.html

  * igt@gem_exec_fair@basic-throttle@rcs0:
    - shard-iclb:         [PASS][20] -> [FAIL][21] ([i915#2849])
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb6/igt@gem_exec_fair@basic-throttle@rcs0.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb5/igt@gem_exec_fair@basic-throttle@rcs0.html

  * igt@gem_lmem_swapping@heavy-verify-random:
    - shard-skl:          NOTRUN -> [SKIP][22] ([fdo#109271] / [i915#4613])
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@gem_lmem_swapping@heavy-verify-random.html

  * igt@gem_lmem_swapping@random:
    - shard-apl:          NOTRUN -> [SKIP][23] ([fdo#109271] / [i915#4613])
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl4/igt@gem_lmem_swapping@random.html

  * igt@gem_mmap_gtt@fault-concurrent-y:
    - shard-snb:          [PASS][24] -> [INCOMPLETE][25] ([i915#5161])
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-snb6/igt@gem_mmap_gtt@fault-concurrent-y.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-snb7/igt@gem_mmap_gtt@fault-concurrent-y.html

  * igt@gem_pwrite@basic-exhaustion:
    - shard-apl:          NOTRUN -> [WARN][26] ([i915#2658])
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl3/igt@gem_pwrite@basic-exhaustion.html

  * igt@gem_userptr_blits@dmabuf-sync:
    - shard-skl:          NOTRUN -> [SKIP][27] ([fdo#109271] / [i915#3323])
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@gem_userptr_blits@dmabuf-sync.html

  * igt@gem_userptr_blits@huge-split:
    - shard-skl:          NOTRUN -> [FAIL][28] ([i915#3376])
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@gem_userptr_blits@huge-split.html

  * igt@i915_pm_dc@dc6-psr:
    - shard-skl:          NOTRUN -> [FAIL][29] ([i915#454])
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@i915_pm_dc@dc6-psr.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-async-flip:
    - shard-skl:          NOTRUN -> [FAIL][30] ([i915#3743])
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-async-flip.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-async-flip:
    - shard-skl:          NOTRUN -> [FAIL][31] ([i915#3763])
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-async-flip.html

  * igt@kms_ccs@pipe-a-random-ccs-data-y_tiled_gen12_mc_ccs:
    - shard-skl:          NOTRUN -> [SKIP][32] ([fdo#109271] / [i915#3886]) +2 similar issues
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_ccs@pipe-a-random-ccs-data-y_tiled_gen12_mc_ccs.html

  * igt@kms_ccs@pipe-c-missing-ccs-buffer-y_tiled_gen12_mc_ccs:
    - shard-apl:          NOTRUN -> [SKIP][33] ([fdo#109271] / [i915#3886]) +1 similar issue
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl4/igt@kms_ccs@pipe-c-missing-ccs-buffer-y_tiled_gen12_mc_ccs.html

  * igt@kms_chamelium@vga-hpd-fast:
    - shard-snb:          NOTRUN -> [SKIP][34] ([fdo#109271] / [fdo#111827]) +1 similar issue
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-snb5/igt@kms_chamelium@vga-hpd-fast.html

  * igt@kms_color_chamelium@pipe-d-ctm-green-to-red:
    - shard-skl:          NOTRUN -> [SKIP][35] ([fdo#109271] / [fdo#111827]) +10 similar issues
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_color_chamelium@pipe-d-ctm-green-to-red.html

  * igt@kms_color_chamelium@pipe-d-ctm-red-to-blue:
    - shard-apl:          NOTRUN -> [SKIP][36] ([fdo#109271] / [fdo#111827]) +2 similar issues
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl4/igt@kms_color_chamelium@pipe-d-ctm-red-to-blue.html

  * igt@kms_content_protection@srm:
    - shard-apl:          NOTRUN -> [TIMEOUT][37] ([i915#1319])
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl3/igt@kms_content_protection@srm.html

  * igt@kms_cursor_crc@pipe-b-cursor-suspend:
    - shard-apl:          NOTRUN -> [DMESG-WARN][38] ([i915#180])
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl4/igt@kms_cursor_crc@pipe-b-cursor-suspend.html

  * igt@kms_cursor_crc@pipe-d-cursor-128x42-offscreen:
    - shard-skl:          NOTRUN -> [SKIP][39] ([fdo#109271] / [i915#1888])
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_cursor_crc@pipe-d-cursor-128x42-offscreen.html

  * igt@kms_cursor_crc@pipe-d-cursor-max-size-onscreen:
    - shard-snb:          NOTRUN -> [SKIP][40] ([fdo#109271]) +68 similar issues
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-snb5/igt@kms_cursor_crc@pipe-d-cursor-max-size-onscreen.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size:
    - shard-apl:          NOTRUN -> [SKIP][41] ([fdo#109271]) +37 similar issues
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl3/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions:
    - shard-glk:          [PASS][42] -> [FAIL][43] ([i915#2346])
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-glk6/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-glk8/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
    - shard-skl:          NOTRUN -> [FAIL][44] ([i915#2346])
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size:
    - shard-skl:          NOTRUN -> [FAIL][45] ([i915#2346] / [i915#533])
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html
    - shard-glk:          [PASS][46] -> [FAIL][47] ([i915#2346] / [i915#533])
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-glk7/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-glk3/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html

  * igt@kms_flip@2x-flip-vs-expired-vblank:
    - shard-skl:          NOTRUN -> [SKIP][48] ([fdo#109271]) +133 similar issues
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_flip@2x-flip-vs-expired-vblank.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1:
    - shard-skl:          [PASS][49] -> [FAIL][50] ([i915#2122]) +2 similar issues
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-skl6/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl5/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html

  * igt@kms_flip@flip-vs-expired-vblank@c-dp1:
    - shard-kbl:          [PASS][51] -> [FAIL][52] ([i915#79])
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-kbl7/igt@kms_flip@flip-vs-expired-vblank@c-dp1.html
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-kbl4/igt@kms_flip@flip-vs-expired-vblank@c-dp1.html

  * igt@kms_flip@plain-flip-fb-recreate@c-edp1:
    - shard-skl:          NOTRUN -> [FAIL][53] ([i915#2122])
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_flip@plain-flip-fb-recreate@c-edp1.html

  * igt@kms_pipe_crc_basic@read-crc-pipe-d-frame-sequence:
    - shard-skl:          NOTRUN -> [SKIP][54] ([fdo#109271] / [i915#533]) +1 similar issue
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_pipe_crc_basic@read-crc-pipe-d-frame-sequence.html

  * igt@kms_plane_alpha_blend@pipe-a-alpha-basic:
    - shard-apl:          NOTRUN -> [FAIL][55] ([fdo#108145] / [i915#265])
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl4/igt@kms_plane_alpha_blend@pipe-a-alpha-basic.html

  * igt@kms_plane_alpha_blend@pipe-b-alpha-transparent-fb:
    - shard-skl:          NOTRUN -> [FAIL][56] ([i915#265])
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_plane_alpha_blend@pipe-b-alpha-transparent-fb.html

  * igt@kms_psr2_su@page_flip-p010:
    - shard-skl:          NOTRUN -> [SKIP][57] ([fdo#109271] / [i915#658])
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl7/igt@kms_psr2_su@page_flip-p010.html

  * igt@kms_psr@psr2_suspend:
    - shard-iclb:         [PASS][58] -> [SKIP][59] ([fdo#109441]) +2 similar issues
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb2/igt@kms_psr@psr2_suspend.html
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb7/igt@kms_psr@psr2_suspend.html

  * igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
    - shard-tglb:         [PASS][60] -> [SKIP][61] ([i915#5519])
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-tglb3/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-tglb3/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html

  * igt@kms_sysfs_edid_timing:
    - shard-skl:          NOTRUN -> [FAIL][62] ([IGT#2])
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@kms_sysfs_edid_timing.html

  * igt@kms_vblank@pipe-b-ts-continuation-suspend:
    - shard-apl:          [PASS][63] -> [DMESG-WARN][64] ([i915#180]) +3 similar issues
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-apl3/igt@kms_vblank@pipe-b-ts-continuation-suspend.html
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl7/igt@kms_vblank@pipe-b-ts-continuation-suspend.html

  * igt@kms_writeback@writeback-fb-id:
    - shard-apl:          NOTRUN -> [SKIP][65] ([fdo#109271] / [i915#2437])
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl4/igt@kms_writeback@writeback-fb-id.html

  * igt@perf@polling-parameterized:
    - shard-skl:          [PASS][66] -> [FAIL][67] ([i915#5639])
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-skl4/igt@perf@polling-parameterized.html
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl2/igt@perf@polling-parameterized.html

  * igt@perf@polling-small-buf:
    - shard-skl:          [PASS][68] -> [FAIL][69] ([i915#1722])
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-skl9/igt@perf@polling-small-buf.html
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl1/igt@perf@polling-small-buf.html

  * igt@sysfs_clients@create:
    - shard-skl:          NOTRUN -> [SKIP][70] ([fdo#109271] / [i915#2994])
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl7/igt@sysfs_clients@create.html

  
#### Possible fixes ####

  * igt@fbdev@unaligned-write:
    - {shard-rkl}:        [SKIP][71] ([i915#2582]) -> [PASS][72]
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-2/igt@fbdev@unaligned-write.html
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@fbdev@unaligned-write.html

  * igt@gem_ctx_persistence@many-contexts:
    - shard-tglb:         [FAIL][73] ([i915#2410]) -> [PASS][74]
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-tglb1/igt@gem_ctx_persistence@many-contexts.html
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-tglb7/igt@gem_ctx_persistence@many-contexts.html
    - {shard-rkl}:        [FAIL][75] ([i915#2410]) -> [PASS][76]
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-6/igt@gem_ctx_persistence@many-contexts.html
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-2/igt@gem_ctx_persistence@many-contexts.html

  * igt@gem_eio@kms:
    - {shard-tglu}:       [INCOMPLETE][77] ([i915#5182]) -> [PASS][78]
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-tglu-3/igt@gem_eio@kms.html
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-tglu-1/igt@gem_eio@kms.html

  * igt@gem_eio@unwedge-stress:
    - {shard-tglu}:       [TIMEOUT][79] ([i915#3063]) -> [PASS][80]
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-tglu-4/igt@gem_eio@unwedge-stress.html
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-tglu-2/igt@gem_eio@unwedge-stress.html

  * igt@gem_exec_balancer@parallel-keep-in-fence:
    - shard-iclb:         [SKIP][81] ([i915#4525]) -> [PASS][82] +1 similar issue
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb6/igt@gem_exec_balancer@parallel-keep-in-fence.html
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb2/igt@gem_exec_balancer@parallel-keep-in-fence.html

  * igt@gem_exec_fair@basic-flow@rcs0:
    - shard-tglb:         [FAIL][83] ([i915#2842]) -> [PASS][84]
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-tglb2/igt@gem_exec_fair@basic-flow@rcs0.html
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-tglb5/igt@gem_exec_fair@basic-flow@rcs0.html

  * igt@gem_exec_fair@basic-pace-share@rcs0:
    - shard-glk:          [FAIL][85] ([i915#2842]) -> [PASS][86]
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-glk5/igt@gem_exec_fair@basic-pace-share@rcs0.html
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-glk6/igt@gem_exec_fair@basic-pace-share@rcs0.html
    - {shard-tglu}:       [FAIL][87] ([i915#2842]) -> [PASS][88]
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-tglu-4/igt@gem_exec_fair@basic-pace-share@rcs0.html
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-tglu-5/igt@gem_exec_fair@basic-pace-share@rcs0.html
    - shard-apl:          [FAIL][89] ([i915#2842]) -> [PASS][90]
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-apl8/igt@gem_exec_fair@basic-pace-share@rcs0.html
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl4/igt@gem_exec_fair@basic-pace-share@rcs0.html

  * igt@gem_exec_fair@basic-pace@vcs0:
    - shard-kbl:          [SKIP][91] ([fdo#109271]) -> [PASS][92]
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-kbl3/igt@gem_exec_fair@basic-pace@vcs0.html
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-kbl3/igt@gem_exec_fair@basic-pace@vcs0.html

  * igt@gem_exec_fair@basic-pace@vcs1:
    - shard-kbl:          [FAIL][93] ([i915#2842]) -> [PASS][94]
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-kbl3/igt@gem_exec_fair@basic-pace@vcs1.html
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-kbl3/igt@gem_exec_fair@basic-pace@vcs1.html

  * igt@i915_pm_dc@dc6-psr:
    - shard-iclb:         [FAIL][95] ([i915#454]) -> [PASS][96]
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb3/igt@i915_pm_dc@dc6-psr.html
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb2/igt@i915_pm_dc@dc6-psr.html

  * igt@i915_pm_rpm@dpms-lpsp:
    - {shard-dg1}:        [SKIP][97] ([i915#1397]) -> [PASS][98]
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-dg1-18/igt@i915_pm_rpm@dpms-lpsp.html
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-dg1-15/igt@i915_pm_rpm@dpms-lpsp.html

  * igt@i915_pm_rpm@drm-resources-equal:
    - {shard-rkl}:        [SKIP][99] ([fdo#109308]) -> [PASS][100]
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-2/igt@i915_pm_rpm@drm-resources-equal.html
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@i915_pm_rpm@drm-resources-equal.html

  * igt@i915_pm_rpm@system-suspend-modeset:
    - shard-skl:          [INCOMPLETE][101] ([i915#5420]) -> [PASS][102]
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-skl1/igt@i915_pm_rpm@system-suspend-modeset.html
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl9/igt@i915_pm_rpm@system-suspend-modeset.html

  * igt@i915_selftest@live@hangcheck:
    - shard-snb:          [INCOMPLETE][103] ([i915#3921]) -> [PASS][104]
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-snb5/igt@i915_selftest@live@hangcheck.html
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-snb5/igt@i915_selftest@live@hangcheck.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip:
    - {shard-rkl}:        [SKIP][105] ([i915#1845] / [i915#4098]) -> [PASS][106] +29 similar issues
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-1/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html
   [106]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html

  * igt@kms_color@pipe-a-ctm-green-to-red:
    - {shard-rkl}:        [SKIP][107] ([i915#1149] / [i915#1849] / [i915#4070] / [i915#4098]) -> [PASS][108]
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-1/igt@kms_color@pipe-a-ctm-green-to-red.html
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_color@pipe-a-ctm-green-to-red.html

  * igt@kms_cursor_crc@pipe-b-cursor-256x85-sliding:
    - {shard-rkl}:        [SKIP][109] ([fdo#112022] / [i915#4070]) -> [PASS][110] +11 similar issues
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-2/igt@kms_cursor_crc@pipe-b-cursor-256x85-sliding.html
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_cursor_crc@pipe-b-cursor-256x85-sliding.html

  * igt@kms_cursor_edge_walk@pipe-a-64x64-top-edge:
    - {shard-rkl}:        [SKIP][111] ([i915#1849] / [i915#4070] / [i915#4098]) -> [PASS][112] +4 similar issues
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-2/igt@kms_cursor_edge_walk@pipe-a-64x64-top-edge.html
   [112]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_cursor_edge_walk@pipe-a-64x64-top-edge.html

  * igt@kms_cursor_legacy@cursor-vs-flip-toggle:
    - {shard-rkl}:        [SKIP][113] ([fdo#111825] / [i915#4070]) -> [PASS][114] +8 similar issues
   [113]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-1/igt@kms_cursor_legacy@cursor-vs-flip-toggle.html
   [114]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_cursor_legacy@cursor-vs-flip-toggle.html

  * igt@kms_cursor_legacy@flip-vs-cursor-legacy:
    - shard-skl:          [FAIL][115] ([i915#2346]) -> [PASS][116]
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-skl2/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl6/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html

  * igt@kms_draw_crc@draw-method-xrgb2101010-pwrite-ytiled:
    - {shard-rkl}:        [SKIP][117] ([fdo#111314] / [i915#4098] / [i915#4369]) -> [PASS][118] +9 similar issues
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-2/igt@kms_draw_crc@draw-method-xrgb2101010-pwrite-ytiled.html
   [118]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_draw_crc@draw-method-xrgb2101010-pwrite-ytiled.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2:
    - shard-glk:          [FAIL][119] ([i915#79]) -> [PASS][120]
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-glk6/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2.html
   [120]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-glk8/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-dp1:
    - shard-kbl:          [FAIL][121] ([i915#79]) -> [PASS][122]
   [121]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-kbl4/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-dp1.html
   [122]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-kbl1/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-dp1.html

  * igt@kms_flip@wf_vblank-ts-check-interruptible@c-edp1:
    - shard-skl:          [FAIL][123] ([i915#2122]) -> [PASS][124]
   [123]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-skl3/igt@kms_flip@wf_vblank-ts-check-interruptible@c-edp1.html
   [124]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl10/igt@kms_flip@wf_vblank-ts-check-interruptible@c-edp1.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling:
    - shard-iclb:         [SKIP][125] ([i915#3701]) -> [PASS][126]
   [125]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb2/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling.html
   [126]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb8/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-rte:
    - {shard-rkl}:        [SKIP][127] ([i915#1849] / [i915#4098]) -> [PASS][128] +25 similar issues
   [127]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-1/igt@kms_frontbuffer_tracking@fbcpsr-1p-rte.html
   [128]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_frontbuffer_tracking@fbcpsr-1p-rte.html

  * igt@kms_hdr@bpc-switch@pipe-a-dp-1:
    - shard-kbl:          [FAIL][129] ([i915#1188]) -> [PASS][130]
   [129]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-kbl6/igt@kms_hdr@bpc-switch@pipe-a-dp-1.html
   [130]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-kbl4/igt@kms_hdr@bpc-switch@pipe-a-dp-1.html

  * igt@kms_invalid_mode@bad-htotal:
    - {shard-rkl}:        [SKIP][131] ([i915#4278]) -> [PASS][132]
   [131]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-2/igt@kms_invalid_mode@bad-htotal.html
   [132]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_invalid_mode@bad-htotal.html

  * igt@kms_pipe_crc_basic@suspend-read-crc-pipe-b:
    - shard-apl:          [DMESG-WARN][133] ([i915#180]) -> [PASS][134] +1 similar issue
   [133]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-apl2/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-b.html
   [134]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl4/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-b.html

  * igt@kms_plane@pixel-format-source-clamping@pipe-b-planes:
    - {shard-rkl}:        [SKIP][135] ([i915#3558]) -> [PASS][136] +1 similar issue
   [135]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-1/igt@kms_plane@pixel-format-source-clamping@pipe-b-planes.html
   [136]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_plane@pixel-format-source-clamping@pipe-b-planes.html

  * igt@kms_prime@basic-crc@second-to-first:
    - {shard-rkl}:        [SKIP][137] ([i915#1849]) -> [PASS][138]
   [137]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-2/igt@kms_prime@basic-crc@second-to-first.html
   [138]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_prime@basic-crc@second-to-first.html

  * igt@kms_psr@no_drrs:
    - {shard-rkl}:        [SKIP][139] ([i915#1072]) -> [PASS][140] +1 similar issue
   [139]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-1/igt@kms_psr@no_drrs.html
   [140]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_psr@no_drrs.html

  * igt@kms_psr@psr2_cursor_plane_move:
    - shard-iclb:         [SKIP][141] ([fdo#109441]) -> [PASS][142] +2 similar issues
   [141]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb3/igt@kms_psr@psr2_cursor_plane_move.html
   [142]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb2/igt@kms_psr@psr2_cursor_plane_move.html

  * igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
    - shard-iclb:         [SKIP][143] ([i915#5519]) -> [PASS][144] +1 similar issue
   [143]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb3/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
   [144]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb2/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html

  * igt@kms_universal_plane@disable-primary-vs-flip-pipe-b:
    - {shard-rkl}:        [SKIP][145] ([i915#1845] / [i915#4070] / [i915#4098]) -> [PASS][146]
   [145]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-rkl-1/igt@kms_universal_plane@disable-primary-vs-flip-pipe-b.html
   [146]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-rkl-6/igt@kms_universal_plane@disable-primary-vs-flip-pipe-b.html

  * igt@perf_pmu@idle@rcs0:
    - {shard-dg1}:        [FAIL][147] ([i915#4349]) -> [PASS][148]
   [147]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-dg1-15/igt@perf_pmu@idle@rcs0.html
   [148]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-dg1-12/igt@perf_pmu@idle@rcs0.html

  
#### Warnings ####

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1:
    - shard-skl:          [FAIL][149] ([i915#79]) -> [FAIL][150] ([i915#2122])
   [149]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-skl6/igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1.html
   [150]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl5/igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1.html

  * igt@kms_psr2_sf@cursor-plane-update-sf:
    - shard-iclb:         [SKIP][151] ([fdo#111068] / [i915#658]) -> [SKIP][152] ([i915#2920])
   [151]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb6/igt@kms_psr2_sf@cursor-plane-update-sf.html
   [152]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb2/igt@kms_psr2_sf@cursor-plane-update-sf.html

  * igt@kms_psr2_su@page_flip-nv12:
    - shard-iclb:         [FAIL][153] ([i915#5939]) -> [SKIP][154] ([fdo#109642] / [fdo#111068] / [i915#658])
   [153]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-iclb2/igt@kms_psr2_su@page_flip-nv12.html
   [154]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-iclb8/igt@kms_psr2_su@page_flip-nv12.html

  * igt@runner@aborted:
    - shard-skl:          [FAIL][155] ([i915#3002] / [i915#4312] / [i915#5257]) -> ([FAIL][156], [FAIL][157]) ([i915#2029] / [i915#3002] / [i915#4312] / [i915#5257])
   [155]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-skl1/igt@runner@aborted.html
   [156]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl7/igt@runner@aborted.html
   [157]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-skl3/igt@runner@aborted.html
    - shard-apl:          ([FAIL][158], [FAIL][159], [FAIL][160]) ([fdo#109271] / [i915#3002] / [i915#4312] / [i915#5257]) -> ([FAIL][161], [FAIL][162], [FAIL][163], [FAIL][164], [FAIL][165], [FAIL][166]) ([fdo#109271] / [i915#180] / [i915#3002] / [i915#4312] / [i915#5257])
   [158]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-apl2/igt@runner@aborted.html
   [159]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-apl4/igt@runner@aborted.html
   [160]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11750/shard-apl8/igt@runner@aborted.html
   [161]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl8/igt@runner@aborted.html
   [162]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl4/igt@runner@aborted.html
   [163]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl6/igt@runner@aborted.html
   [164]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl7/igt@runner@aborted.html
   [165]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl6/igt@runner@aborted.html
   [166]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/shard-apl8/igt@runner@aborted.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [IGT#2]: https://gitlab.freedesktop.org/drm/igt-gpu-tools/issues/2
  [fdo#108145]: https://bugs.freedesktop.org/show_bug.cgi?id=108145
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109279]: https://bugs.freedesktop.org/show_bug.cgi?id=109279
  [fdo#109283]: https://bugs.freedesktop.org/show_bug.cgi?id=109283
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
  [fdo#109291]: https://bugs.freedesktop.org/show_bug.cgi?id=109291
  [fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295
  [fdo#109300]: https://bugs.freedesktop.org/show_bug.cgi?id=109300
  [fdo#109303]: https://bugs.freedesktop.org/show_bug.cgi?id=109303
  [fdo#109308]: https://bugs.freedesktop.org/show_bug.cgi?id=109308
  [fdo#109313]: https://bugs.freedesktop.org/show_bug.cgi?id=109313
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [fdo#109506]: https://bugs.freedesktop.org/show_bug.cgi?id=109506
  [fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
  [fdo#110723]: https://bugs.freedesktop.org/show_bug.cgi?id=110723
  [fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
  [fdo#111314]: https://bugs.freedesktop.org/show_bug.cgi?id=111314
  [fdo#111614]: https://bugs.freedesktop.org/show_bug.cgi?id=111614
  [fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [fdo#112022]: https://bugs.freedesktop.org/show_bug.cgi?id=112022
  [i915#1063]: https://gitlab.freedesktop.org/drm/intel/issues/1063
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#1149]: https://gitlab.freedesktop.org/drm/intel/issues/1149
  [i915#1155]: https://gitlab.freedesktop.org/drm/intel/issues/1155
  [i915#1188]: https://gitlab.freedesktop.org/drm/intel/issues/1188
  [i915#1257]: https://gitlab.freedesktop.org/drm/intel/issues/1257
  [i915#1319]: https://gitlab.freedesktop.org/drm/intel/issues/1319
  [i915#132]: https://gitlab.freedesktop.org/drm/intel/issues/132
  [i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397
  [i915#1722]: https://gitlab.freedesktop.org/drm/intel/issues/1722
  [i915#1769]: https://gitlab.freedesktop.org/drm/intel/issues/1769
  [i915#180]: https://gitlab.freedesktop.org/drm/intel/issues/180
  [i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
  [i915#1836]: https://gitlab.freedesktop.org/drm/intel/issues/1836
  [i915#1839]: https://gitlab.freedesktop.org/drm/intel/issues/1839
  [i915#1845]: https://gitlab.freedesktop.org/drm/intel/issues/1845
  [i915#1849]: https://gitlab.freedesktop.org/drm/intel/issues/1849
  [i915#1888]: https://gitlab.freedesktop.org/drm/intel/issues/1888
  [i915#1911]: https://gitlab.freedesktop.org/drm/intel/issues/1911
  [i915#2029]: https://gitlab.freedesktop.org/drm/intel/issues/2029
  [i915#2122]: https://gitlab.freedesktop.org/drm/intel/issues/2122
  [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190
  [i915#2232]: https://gitlab.freedesktop.org/drm/intel/issues/2232
  [i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346
  [i915#2410]: https://gitlab.freedesktop.org/drm/intel/issues/2410
  [i915#2437]: https://gitlab.freedesktop.org/drm/intel/issues/2437
  [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
  [i915#2530]: https://gitlab.freedesktop.org/drm/intel/issues/2530
  [i915#2582]: https://gitlab.freedesktop.org/drm/intel/issues/2582
  [i915#265]: https://gitlab.freedesktop.org/drm/intel/issues/265
  [i915#2658]: https://gitlab.freedesktop.org/drm/intel/issues/2658
  [i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672
  [i915#2705]: https://gitlab.freedesktop.org/drm/intel/issues/2705
  [i915#280]: https://gitlab.freedesktop.org/drm/intel/issues/280
  [i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
  [i915#2849]: https://gitlab.freedesktop.org/drm/intel/issues/2849
  [i915#2920]: https://gitlab.freedesktop.org/drm/intel/issues/2920
  [i915#2994]: https://gitlab.freedesktop.org/drm/intel/issues/2994
  [i915#3002]: https://gitlab.freedesktop.org/drm/intel/issues/3002
  [i915#3012]: https://gitlab.freedesktop.org/drm/intel/issues/3012
  [i915#3063]: https://gitlab.freedesktop.org/drm/intel/issues/3063
  [i915#3116]: https://gitlab.freedesktop.org/drm/intel/issues/3116
  [i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
  [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
  [i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
  [i915#3299]: https://gitlab.freedesktop.org/drm/intel/issues/3299
  [i915#3318]: https://gitlab.freedesktop.org/drm/intel/issues/3318
  [i915#3319]: https://gitlab.freedesktop.org/drm/intel/issues/3319
  [i915#3323]: https://gitlab.freedesktop.org/drm/intel/issues/3323
  [i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
  [i915#3376]: https://gitlab.freedesktop.org/drm/intel/issues/3376
  [i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
  [i915#3536]: https://gitlab.freedesktop.org/drm/intel/issues/3536
  [i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3558]: https://gitlab.freedesktop.org/drm/intel/issues/3558
  [i915#3637]: https://gitlab.freedesktop.org/drm/intel/issues/3637
  [i915#3638]: https://gitlab.freedesktop.org/drm/intel/issues/3638
  [i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689
  [i915#3701]: https://gitlab.freedesktop.org/drm/intel/issues/3701
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#3734]: https://gitlab.freedesktop.org/drm/intel/issues/3734
  [i915#3743]: https://gitlab.freedesktop.org/drm/intel/issues/3743
  [i915#3763]: https://gitlab.freedesktop.org/drm/intel/issues/3763
  [i915#3810]: https://gitlab.freedesktop.org/drm/intel/issues/3810
  [i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886
  [i915#3921]: https://gitlab.freedesktop.org/drm/intel/issues/3921
  [i915#3963]: https://gitlab.freedesktop.org/drm/intel/issues/3963
  [i915#4032]: https://gitlab.freedesktop.org/drm/intel/issues/4032
  [i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
  [i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
  [i915#4078]: https://gitlab.freedesktop.org/drm/intel/issues/4078
  [i915#4079]: https://gitlab.freedesktop.org/drm/intel/issues/4079
  [i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
  [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098
  [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
  [i915#4212]: https://gitlab.freedesktop.org/drm/intel/issues/4212
  [i915#4241]: https://gitlab.freedesktop.org/drm/intel/issues/4241
  [i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
  [i915#4278]: https://gitlab.freedesktop.org/drm/intel/issues/4278
  [i915#4312]: https://gitlab.freedesktop.org/drm/intel/issues/4312
  [i915#4349]: https://gitlab.freedesktop.org/drm/intel/issues/4349
  [i915#4369]: https://gitlab.freedesktop.org/drm/intel/issues/4369
  [i915#4387]: https://gitlab.freedesktop.org/drm/intel/issues/4387
  [i915#4525]: https://gitlab.freedesktop.org/drm/intel/issues/4525
  [i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
  [i915#454]: https://gitlab.freedesktop.org/drm/intel/issues/454
  [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
  [i915#4812]: https://gitlab.freedesktop.org/drm/intel/issues/4812
  [i915#4833]: https://gitlab.freedesktop.org/drm/intel/issues/4833
  [i915#4842]: https://gitlab.freedesktop.org/drm/intel/issues/4842
  [i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852
  [i915#4853]: https://gitlab.freedesktop.org/drm/intel/issues/4853
  [i915#4854]: https://gitlab.freedesktop.org/drm/intel/issues/4854
  [i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860
  [i915#4873]: https://gitlab.freedesktop.org/drm/intel/issues/4873
  [i915#4893]: https://gitlab.freedesktop.org/drm/intel/issues/4893
  [i915#5161]: https://gitlab.freedesktop.org/drm/intel/issues/5161
  [i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176
  [i915#5182]: https://gitlab.freedesktop.org/drm/intel/issues/5182
  [i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235
  [i915#5257]: https://gitlab.freedesktop.org/drm/intel/issues/5257
  [i915#5286]: https://gitlab.freedesktop.org/drm/intel/issues/5286
  [i915#5287]: https://gitlab.freedesktop.org/drm/intel/issues/5287
  [i915#5288]: https://gitlab.freedesktop.org/drm/intel/issues/5288
  [i915#5289]: https://gitlab.freedesktop.org/drm/intel/issues/5289
  [i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
  [i915#5357]: https://gitlab.freedesktop.org/drm/intel/issues/5357
  [i915#5420]: https://gitlab.freedesktop.org/drm/intel/issues/5420
  [i915#5519]: https://gitlab.freedesktop.org/drm/intel/issues/5519
  [i915#5563]: https://gitlab.freedesktop.org/drm/intel/issues/5563
  [i915#5639]: https://gitlab.freedesktop.org/drm/intel/issues/5639
  [i915#5721]: https://gitlab.freedesktop.org/drm/intel/issues/5721
  [i915#5723]: https://gitlab.freedesktop.org/drm/intel/issues/5723
  [i915#5784]: https://gitlab.freedesktop.org/drm/intel/issues/5784
  [i915#5843]: https://gitlab.freedesktop.org/drm/intel/issues/5843
  [i915#5939]: https://gitlab.freedesktop.org/drm/intel/issues/5939
  [i915#6011]: https://gitlab.freedesktop.org/drm/intel/issues/6011
  [i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
  [i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
  [i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79


Build changes
-------------

  * Linux: CI_DRM_11750 -> Patchwork_104947v1

  CI-20190529: 20190529
  CI_DRM_11750: d9c6b670bba2e213d4303234654dc52c4dbc9662 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_6518: 0189ca288f7188e60f5eda356b190040bf8ec704 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_104947v1: d9c6b670bba2e213d4303234654dc52c4dbc9662 @ git://anongit.freedesktop.org/gfx-ci/linux
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_104947v1/index.html

[-- Attachment #2: Type: text/html, Size: 46583 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Intel-gfx] [PATCH] iosys-map: Add word-sized reads
  2022-06-09 23:20 [Intel-gfx] [PATCH] iosys-map: Add word-sized reads Lucas De Marchi
                   ` (6 preceding siblings ...)
  2022-06-11  7:02 ` [Intel-gfx] ✓ Fi.CI.IGT: success for " Patchwork
@ 2022-06-13 10:58 ` Thomas Zimmermann
  2022-06-13 18:37   ` Lucas De Marchi
  7 siblings, 1 reply; 11+ messages in thread
From: Thomas Zimmermann @ 2022-06-13 10:58 UTC (permalink / raw)
  To: Lucas De Marchi, intel-gfx, dri-devel
  Cc: daniel.vetter, christian.koenig, Chris Wilson


[-- Attachment #1.1: Type: text/plain, Size: 6495 bytes --]

Hi Lucas

Am 10.06.22 um 01:20 schrieb Lucas De Marchi:
> Instead of always falling back to memcpy_fromio() for any size, prefer
> using read{b,w,l}(). When reading struct members it's common to read
> individual integer variables individually. Going through memcpy_fromio()
> for each of them poses a high penalty.
> 
> Employ a similar trick as __seqprop() by using _Generic() to generate
> only the specific call based on a type-compatible variable.
> 
> For a pariticular i915 workload producing GPU context switches,
> __get_engine_usage_record() is particularly hot since the engine usage
> is read from device local memory with dgfx, possibly multiple times
> since it's racy. Test execution time for this test shows a ~12.5%
> improvement with DG2:
> 
> Before:
> 	nrepeats = 1000; min = 7.63243e+06; max = 1.01817e+07;
> 	median = 9.52548e+06; var = 526149;
> After:
> 	nrepeats = 1000; min = 7.03402e+06; max = 8.8832e+06;
> 	median = 8.33955e+06; var = 333113;
> 
> Other things attempted that didn't prove very useful:
> 1) Change the _Generic() on x86 to just dereference the memory address
> 2) Change __get_engine_usage_record() to do just 1 read per loop,
>     comparing with the previous value read
> 3) Change __get_engine_usage_record() to access the fields directly as it
>     was before the conversion to iosys-map
> 
> (3) did gave a small improvement (~3%), but doesn't seem to scale well
> to other similar cases in the driver.
> 
> Additional test by Chris Wilson using gem_create from igt with some
> changes to track object creation time. This happens to accidentaly
> stress this code path:
> 
> 	Pre iosys_map conversion of engine busyness:
> 	lmem0: Creating    262144 4KiB objects took 59274.2ms
> 
> 	Unpatched:
> 	lmem0: Creating    262144 4KiB objects took 108830.2ms
> 
> 	With readl (this patch):
> 	lmem0: Creating    262144 4KiB objects took 61348.6ms
> 
> 	s/readl/READ_ONCE/
> 	lmem0: Creating    262144 4KiB objects took 61333.2ms
> 
> So we do take a little bit more time than before the conversion, but
> that is due to other factors: bringing the READ_ONCE back would be as
> good as just doing this conversion.
> 
> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> ---
> 
> If this is acceptable we should probably add the write counterpart, too.
> Sending here only the read for now since this fixes the issue we are
> seeing and to gather feedback.

That would not be a problem, but please only add functions that you use.

> 
>   include/linux/iosys-map.h | 26 ++++++++++++++++++++++----
>   1 file changed, 22 insertions(+), 4 deletions(-)
> 
> diff --git a/include/linux/iosys-map.h b/include/linux/iosys-map.h
> index e69a002d5aa4..4ae3e459419e 100644
> --- a/include/linux/iosys-map.h
> +++ b/include/linux/iosys-map.h
> @@ -333,6 +333,20 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
>   		memset(dst->vaddr + offset, value, len);
>   }
>   
> +#ifdef CONFIG_64BIT
> +#define __iosys_map_rd_io_u64_case(val_, vaddr_iomem_)			\
> +	u64: val_ = readq(vaddr_iomem_),
> +#else
> +#define __iosys_map_u64_case(val_, vaddr_iomem_)
> +#endif
> +
> +#define __iosys_map_rd_io(val__, vaddr_iomem__, type__) _Generic(val__,	\
> +	u8: val__ = readb(vaddr_iomem__),				\
> +	u16: val__ = readw(vaddr_iomem__),				\
> +	u32: val__ = readl(vaddr_iomem__),				\
> +	__iosys_map_rd_io_u64_case(val__, vaddr_iomem__)		\
> +	default: memcpy_fromio(&(val__), vaddr_iomem__, sizeof(val__)))
> +
>   /**
>    * iosys_map_rd - Read a C-type value from the iosys_map
>    *
> @@ -346,10 +360,14 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
>    * Returns:
>    * The value read from the mapping.
>    */
> -#define iosys_map_rd(map__, offset__, type__) ({			\
> -	type__ val;							\
> -	iosys_map_memcpy_from(&val, map__, offset__, sizeof(val));	\
> -	val;								\
> +#define iosys_map_rd(map__, offset__, type__) ({				\
> +	type__ val;								\
> +	if ((map__)->is_iomem) {						\
> +		__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
> +	} else {								\
> +		memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
> +	}									\
> +	val;									\

To my knowledge, calls to readw/readl have alignment requirements on 
some platforms, while memcpy_fromio() has none. Mixing memcpy() and 
read*() sounds like a problem for subtle bugs. I'd prefer to at least 
mitigate that to some extend.

For each case in the _Generic statement, there should be an if/else 
branch on is_iomem. Here's the example

#define iosys_map_rd() \
_Generic( (val__),
   u8: {
     if (map__)->is_iomem
       val__ = readb()
     else
       val__ *(volatile u8*)(vaddr_iomem);
   },
   u16: {
     if (map__)->is_iomem
       val__ = readw()
     else
       val__ *(volatile u16*)(vaddr_iomem);
   },
   u32,
   u64,
   ...
   default: {
     if (map__)->is_iomem
       mempy_fromio()
     else
       memcpy()
   })

Using volatile with system memory enforces single instructions or even 
alignment on some platforms. While experimenting with framebuffer 
updates, I've also found this to be faster then regular code. With 
'volatile' the compiler generated a single movq instead of a number of 
shorter movs. (But I won't promise anything. :)

Within _Generic, for each type, a macro can generate the case. Like this

#define __iosys_map_rd_case(__type, __map, __read) \
   __type: if else ...

In the case of u64, you can simply do

#if CONFIG_64BIT
#define __iosys_map_rd_case_u64(__map) \
   __iosys_map_rc_case(u64, __map, readq)
#else
#define __iosys_map_rd_case_u64(__map)
#endif

and use that macro in the _Generic. On 64-bit systems, the case will be 
there. Otherwise it will be empty.

The only user of iosys_map_rd() is i915. I quickly looked through the 
usage and found no cases where the default memcpy could be used. It's 
all structs with u32. (Right?)  If so, please remove the default case 
with memcpy entirely.  This will result in clear compile-time errors if 
a certain type is not supported.  There's still iosys_mem_memcpy() for 
those who need it.

Best regards
Thomas

>   })
>   
>   /**

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Intel-gfx] [PATCH] iosys-map: Add word-sized reads
  2022-06-13 10:58 ` [Intel-gfx] [PATCH] " Thomas Zimmermann
@ 2022-06-13 18:37   ` Lucas De Marchi
  0 siblings, 0 replies; 11+ messages in thread
From: Lucas De Marchi @ 2022-06-13 18:37 UTC (permalink / raw)
  To: Thomas Zimmermann
  Cc: daniel.vetter, intel-gfx, christian.koenig, dri-devel, Chris Wilson

On Mon, Jun 13, 2022 at 12:58:52PM +0200, Thomas Zimmermann wrote:
>Hi Lucas
>
>Am 10.06.22 um 01:20 schrieb Lucas De Marchi:
>>Instead of always falling back to memcpy_fromio() for any size, prefer
>>using read{b,w,l}(). When reading struct members it's common to read
>>individual integer variables individually. Going through memcpy_fromio()
>>for each of them poses a high penalty.
>>
>>Employ a similar trick as __seqprop() by using _Generic() to generate
>>only the specific call based on a type-compatible variable.
>>
>>For a pariticular i915 workload producing GPU context switches,
>>__get_engine_usage_record() is particularly hot since the engine usage
>>is read from device local memory with dgfx, possibly multiple times
>>since it's racy. Test execution time for this test shows a ~12.5%
>>improvement with DG2:
>>
>>Before:
>>	nrepeats = 1000; min = 7.63243e+06; max = 1.01817e+07;
>>	median = 9.52548e+06; var = 526149;
>>After:
>>	nrepeats = 1000; min = 7.03402e+06; max = 8.8832e+06;
>>	median = 8.33955e+06; var = 333113;
>>
>>Other things attempted that didn't prove very useful:
>>1) Change the _Generic() on x86 to just dereference the memory address
>>2) Change __get_engine_usage_record() to do just 1 read per loop,
>>    comparing with the previous value read
>>3) Change __get_engine_usage_record() to access the fields directly as it
>>    was before the conversion to iosys-map
>>
>>(3) did gave a small improvement (~3%), but doesn't seem to scale well
>>to other similar cases in the driver.
>>
>>Additional test by Chris Wilson using gem_create from igt with some
>>changes to track object creation time. This happens to accidentaly
>>stress this code path:
>>
>>	Pre iosys_map conversion of engine busyness:
>>	lmem0: Creating    262144 4KiB objects took 59274.2ms
>>
>>	Unpatched:
>>	lmem0: Creating    262144 4KiB objects took 108830.2ms
>>
>>	With readl (this patch):
>>	lmem0: Creating    262144 4KiB objects took 61348.6ms
>>
>>	s/readl/READ_ONCE/
>>	lmem0: Creating    262144 4KiB objects took 61333.2ms
>>
>>So we do take a little bit more time than before the conversion, but
>>that is due to other factors: bringing the READ_ONCE back would be as
>>good as just doing this conversion.
>>
>>Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
>>---
>>
>>If this is acceptable we should probably add the write counterpart, too.
>>Sending here only the read for now since this fixes the issue we are
>>seeing and to gather feedback.
>
>That would not be a problem, but please only add functions that you use.

I sent v2 that includes the write as the second patch. We do use it,
it's just not in the critical path.

$ git grep iosys_map_wr drivers/
drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:     iosys_map_wr_field(&(guc_)->ads_map, 0, struct __guc_ads_blob,  \
drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c:     iosys_map_wr_field(map_, 0, struct guc_gt_system_info, field_, val_)

>>  include/linux/iosys-map.h | 26 ++++++++++++++++++++++----
>>  1 file changed, 22 insertions(+), 4 deletions(-)
>>
>>diff --git a/include/linux/iosys-map.h b/include/linux/iosys-map.h
>>index e69a002d5aa4..4ae3e459419e 100644
>>--- a/include/linux/iosys-map.h
>>+++ b/include/linux/iosys-map.h
>>@@ -333,6 +333,20 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
>>  		memset(dst->vaddr + offset, value, len);
>>  }
>>+#ifdef CONFIG_64BIT
>>+#define __iosys_map_rd_io_u64_case(val_, vaddr_iomem_)			\
>>+	u64: val_ = readq(vaddr_iomem_),
>>+#else
>>+#define __iosys_map_u64_case(val_, vaddr_iomem_)
>>+#endif
>>+
>>+#define __iosys_map_rd_io(val__, vaddr_iomem__, type__) _Generic(val__,	\
>>+	u8: val__ = readb(vaddr_iomem__),				\
>>+	u16: val__ = readw(vaddr_iomem__),				\
>>+	u32: val__ = readl(vaddr_iomem__),				\
>>+	__iosys_map_rd_io_u64_case(val__, vaddr_iomem__)		\
>>+	default: memcpy_fromio(&(val__), vaddr_iomem__, sizeof(val__)))
>>+
>>  /**
>>   * iosys_map_rd - Read a C-type value from the iosys_map
>>   *
>>@@ -346,10 +360,14 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
>>   * Returns:
>>   * The value read from the mapping.
>>   */
>>-#define iosys_map_rd(map__, offset__, type__) ({			\
>>-	type__ val;							\
>>-	iosys_map_memcpy_from(&val, map__, offset__, sizeof(val));	\
>>-	val;								\
>>+#define iosys_map_rd(map__, offset__, type__) ({				\
>>+	type__ val;								\
>>+	if ((map__)->is_iomem) {						\
>>+		__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
>>+	} else {								\
>>+		memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
>>+	}									\
>>+	val;									\
>
>To my knowledge, calls to readw/readl have alignment requirements on 
>some platforms, while memcpy_fromio() has none. Mixing memcpy() and 
>read*() sounds like a problem for subtle bugs. I'd prefer to at least 
>mitigate that to some extend.
>
>For each case in the _Generic statement, there should be an if/else 
>branch on is_iomem. Here's the example
>
>#define iosys_map_rd() \
>_Generic( (val__),
>  u8: {
>    if (map__)->is_iomem
>      val__ = readb()
>    else
>      val__ *(volatile u8*)(vaddr_iomem);
>  },
>  u16: {
>    if (map__)->is_iomem
>      val__ = readw()
>    else
>      val__ *(volatile u16*)(vaddr_iomem);
>  },
>  u32,
>  u64,
>  ...
>  default: {
>    if (map__)->is_iomem
>      mempy_fromio()
>    else
>      memcpy()
>  })
>
>Using volatile with system memory enforces single instructions or even 
>alignment on some platforms. While experimenting with framebuffer 
>updates, I've also found this to be faster then regular code. With 
>'volatile' the compiler generated a single movq instead of a number of 
>shorter movs. (But I won't promise anything. :)

Here I focused on making the *io* part faster instead of the system
memory part faster since io is order of magnitudes slower and showing up
on perf. Yes, we can also do it on the system memory part.

Note that the READ_ONCE() I mentioned in the commit message does the
volatile cast behind the scene. I also checked that the readl in the
generated code expands to a mov instruction in 64-bit mode,
which is correct.

>
>Within _Generic, for each type, a macro can generate the case. Like this
>
>#define __iosys_map_rd_case(__type, __map, __read) \
>  __type: if else ...
>
>In the case of u64, you can simply do
>
>#if CONFIG_64BIT
>#define __iosys_map_rd_case_u64(__map) \
>  __iosys_map_rc_case(u64, __map, readq)
>#else
>#define __iosys_map_rd_case_u64(__map)
>#endif
>
>and use that macro in the _Generic. On 64-bit systems, the case will 
>be there. Otherwise it will be empty.

/me confused... this is what I did, no?

>
>The only user of iosys_map_rd() is i915. I quickly looked through the 
>usage and found no cases where the default memcpy could be used. It's 
>all structs with u32. (Right?)  If so, please remove the default case 
>with memcpy entirely.  This will result in clear compile-time errors 
>if a certain type is not supported.  There's still iosys_mem_memcpy() 
>for those who need it.

yeah, I think we had cases copying the whole struct before. Just took a look
and removing the default doesn't explodes the build, so we should be fine...
although it may lead to build issue if we are trying to read a u64 on 32-bit
since it won't fallback to memcpy by simply expanding the u64 case to nothing.

Another thing not clear: how does moving the if/else inside the
_Generic() help with unaligned accesses?

For your suggestion on also handling system memory,  I was actually thinking on
leaving the if/else where it is now and in future add a _Generic() for the
system memory accesses (hence why my macro has he _io suffix):

diff --git a/include/linux/iosys-map.h b/include/linux/iosys-map.h
index d092d30f5812..0e758424088e 100644
--- a/include/linux/iosys-map.h
+++ b/include/linux/iosys-map.h
@@ -375,7 +375,7 @@ static inline void iosys_map_memset(struct iosys_map *dst, size_t offset,
  	if ((map__)->is_iomem) {						\
  		__iosys_map_rd_io(val, (map__)->vaddr_iomem + offset__, type__);\
  	} else {								\
-		memcpy(&val, (map__)->vaddr + offset__, sizeof(val));		\
+		__iosys_map_rd_sys(val, (map__)->vaddr_iomem + offset__, type__);\
  	}									\
  	val;									\
  })

it seems cleaner than adding the if/else to each case expanded by _Generic().

thanks
Lucas De Marchi

^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-06-13 18:37 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-09 23:20 [Intel-gfx] [PATCH] iosys-map: Add word-sized reads Lucas De Marchi
2022-06-09 23:36 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
2022-06-09 23:36 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-06-10  2:55 ` [Intel-gfx] [PATCH] " kernel test robot
2022-06-10  7:05 ` [Intel-gfx] ✓ Fi.CI.BAT: success for " Patchwork
2022-06-10  7:20 ` [Intel-gfx] [PATCH] " Christian König
2022-06-10 17:35   ` Lucas De Marchi
2022-06-10 14:17 ` kernel test robot
2022-06-11  7:02 ` [Intel-gfx] ✓ Fi.CI.IGT: success for " Patchwork
2022-06-13 10:58 ` [Intel-gfx] [PATCH] " Thomas Zimmermann
2022-06-13 18:37   ` Lucas De Marchi

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).