All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/1] Add sysfs interface to control class-of-service
@ 2019-10-15  7:31 Prathap Kumar Valsan
  2019-10-15  7:31 ` [PATCH v4 1/1] drm/i915: " Prathap Kumar Valsan
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Prathap Kumar Valsan @ 2019-10-15  7:31 UTC (permalink / raw)
  To: intel-gfx; +Cc: reinette.chatre, Chris P Wilson

For GEN11 MOCS are part of context register state. This means updating
CLOS also needs to update the context state of active contexts.

v4: 
- Make it explicit in the commit message that we want to set CLOS global
  on device (Chris)
- Fixe the Locking (Chris)
- Move the global configuration of contexts away from gt.(Chris)

v3: Rebase

v2: 
- Update the interface to use two sysfs files(Joonas)
- Gen12 PCode interface is not ready yet to read the way mask.
  So removed TGL support and added support for Gen11.
- Updating MOCS in Gen 11 also require changing the context image of
  existing contexts.
- Referred to gen8_configure_all_contexts() as suggested by Chris.

Prathap Kumar Valsan (1):
  drm/i915: Add sysfs interface to control class-of-service

 drivers/gpu/drm/i915/Makefile           |   1 +
 drivers/gpu/drm/i915/gt/intel_lrc.c     |   7 ++
 drivers/gpu/drm/i915/gt/intel_lrc_reg.h |   1 +
 drivers/gpu/drm/i915/gt/intel_mocs.c    | 115 +++++++++++++++++++++
 drivers/gpu/drm/i915/gt/intel_mocs.h    |   7 ++
 drivers/gpu/drm/i915/i915_clos.c        | 128 ++++++++++++++++++++++++
 drivers/gpu/drm/i915/i915_clos.h        |  15 +++
 drivers/gpu/drm/i915/i915_drv.h         |  10 ++
 drivers/gpu/drm/i915/i915_gem.c         |   3 +
 drivers/gpu/drm/i915/i915_reg.h         |   1 +
 drivers/gpu/drm/i915/i915_sysfs.c       | 105 +++++++++++++++++++
 11 files changed, 393 insertions(+)
 create mode 100644 drivers/gpu/drm/i915/i915_clos.c
 create mode 100644 drivers/gpu/drm/i915/i915_clos.h

-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* [PATCH v4 1/1] drm/i915: Add sysfs interface to control class-of-service
  2019-10-15  7:31 [PATCH v4 0/1] Add sysfs interface to control class-of-service Prathap Kumar Valsan
@ 2019-10-15  7:31 ` Prathap Kumar Valsan
  2019-10-15  7:55   ` Chris Wilson
  2019-10-16 18:16   ` Reinette Chatre
  2019-10-15  7:41 ` ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
  2019-10-15  8:02 ` ✗ Fi.CI.BAT: failure " Patchwork
  2 siblings, 2 replies; 7+ messages in thread
From: Prathap Kumar Valsan @ 2019-10-15  7:31 UTC (permalink / raw)
  To: intel-gfx; +Cc: reinette.chatre, Chris P Wilson

Real-Time clients running on CPU may want to run on its own partition of
Last-Level-Cache(LLC) to achieve isolation and to be more deterministic.
The Intel Cache-Allocation-Technology exist on CPU to partition LLC in
to ways and dedicate a partition to an application.

However, when LLC is shared between CPU and GPU, the workloads running
on GPU  has no notion about this partition and can thrash the cache lines
dedicated to a Real Time task running on CPU. To avoid this, Real-Time
clients wants a mechanism to read the existing cache ways that GPU can
allocate, which depends on a class-of-service(CLOS) and its associated
cache way mask and to restrict the GPU device globally to one of the
supported CLOS levels.

Currently GPU hardware supports four CLOS levels and  there is an
associated way-mask for each CLOS. Each LLC MOCS register has a field
to select the CLOS level. So in-order to globally set the GPU to a CLOS
level, driver needs to program entire MOCS table.

Hardware supports reading supported way-mask configuration for GPU using
a bios PCode interface. The sysfs interface has two files--llc_clos_modes
and llc_clos. The file llc_clos_modes is read only file and will list the
available way masks. The file llc_clos is read/write and will show the
currently active way mask and writing a new way mask will update the
active way mask of the GPU.

Note of Caution: Restricting cache ways using this mechanism presents a
larger attack surface for side-channel attacks.

Example usage:
> cat /sys/class/drm/card0/llc_clos_modes
0xfff 0xfc0 0xc00 0x800

>cat /sys/class/drm/card0/llc_clos
0xfff

Update to new clos
echo "0x800" > /sys/class/drm/card0/llc_clos

Signed-off-by: Prathap Kumar Valsan <prathap.kumar.valsan@intel.com>
---
 drivers/gpu/drm/i915/Makefile           |   1 +
 drivers/gpu/drm/i915/gt/intel_lrc.c     |   7 ++
 drivers/gpu/drm/i915/gt/intel_lrc_reg.h |   1 +
 drivers/gpu/drm/i915/gt/intel_mocs.c    | 115 +++++++++++++++++++++
 drivers/gpu/drm/i915/gt/intel_mocs.h    |   7 ++
 drivers/gpu/drm/i915/i915_clos.c        | 128 ++++++++++++++++++++++++
 drivers/gpu/drm/i915/i915_clos.h        |  15 +++
 drivers/gpu/drm/i915/i915_drv.h         |  10 ++
 drivers/gpu/drm/i915/i915_gem.c         |   3 +
 drivers/gpu/drm/i915/i915_reg.h         |   1 +
 drivers/gpu/drm/i915/i915_sysfs.c       | 105 +++++++++++++++++++
 11 files changed, 393 insertions(+)
 create mode 100644 drivers/gpu/drm/i915/i915_clos.c
 create mode 100644 drivers/gpu/drm/i915/i915_clos.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index e791d9323b51..5b8769fb7540 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -135,6 +135,7 @@ i915-y += \
 	  $(gem-y) \
 	  i915_active.o \
 	  i915_buddy.o \
+	  i915_clos.o \
 	  i915_cmd_parser.o \
 	  i915_gem_evict.o \
 	  i915_gem_fence_reg.o \
diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index 484efe3b4273..0191c10486e4 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -2130,6 +2130,13 @@ __execlists_update_reg_state(const struct intel_context *ce,
 			intel_sseu_make_rpcs(engine->i915, &ce->sseu);
 
 		i915_oa_init_reg_state(ce, engine);
+		/*
+		 * Gen11+ wants to support update of LLC class-of-service via
+		 * sysfs interface. CLOS is defined in MOCS registers and for
+		 * Gen11, MOCS is part of context resgister state.
+		 */
+		if (IS_GEN(engine->i915, 11))
+			intel_mocs_init_reg_state(ce);
 	}
 }
 
diff --git a/drivers/gpu/drm/i915/gt/intel_lrc_reg.h b/drivers/gpu/drm/i915/gt/intel_lrc_reg.h
index 06ab0276e10e..f07a6262217c 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc_reg.h
+++ b/drivers/gpu/drm/i915/gt/intel_lrc_reg.h
@@ -28,6 +28,7 @@
 #define CTX_R_PWR_CLK_STATE		(0x42 + 1)
 
 #define GEN9_CTX_RING_MI_MODE		0x54
+#define GEN11_CTX_GFX_MOCS_BASE		0x4F2
 
 /* GEN12+ Reg State Context */
 #define GEN12_CTX_BB_PER_CTX_PTR		(0x12 + 1)
diff --git a/drivers/gpu/drm/i915/gt/intel_mocs.c b/drivers/gpu/drm/i915/gt/intel_mocs.c
index 728704bbbe18..bbe95e899540 100644
--- a/drivers/gpu/drm/i915/gt/intel_mocs.c
+++ b/drivers/gpu/drm/i915/gt/intel_mocs.c
@@ -26,6 +26,7 @@
 #include "intel_gt.h"
 #include "intel_mocs.h"
 #include "intel_lrc.h"
+#include "intel_lrc_reg.h"
 
 /* structures required */
 struct drm_i915_mocs_entry {
@@ -40,6 +41,7 @@ struct drm_i915_mocs_table {
 	const struct drm_i915_mocs_entry *table;
 };
 
+#define ctx_mocsN(N) (GEN11_CTX_GFX_MOCS_BASE + 2 * (N) + 1)
 /* Defines for the tables (XXX_MOCS_0 - XXX_MOCS_63) */
 #define _LE_CACHEABILITY(value)	((value) << 0)
 #define _LE_TGT_CACHE(value)	((value) << 2)
@@ -51,6 +53,7 @@ struct drm_i915_mocs_table {
 #define LE_SCF(value)		((value) << 14)
 #define LE_COS(value)		((value) << 15)
 #define LE_SSE(value)		((value) << 17)
+#define LE_COS_MASK		GENMASK(16, 15)
 
 /* Defines for the tables (LNCFMOCS0 - LNCFMOCS31) - two entries per word */
 #define L3_ESC(value)		((value) << 0)
@@ -379,6 +382,7 @@ void intel_mocs_init_engine(struct intel_engine_cs *engine)
 	struct drm_i915_mocs_table table;
 	unsigned int index;
 	u32 unused_value;
+	u32 active_clos;
 
 	/* Platforms with global MOCS do not need per-engine initialization. */
 	if (HAS_GLOBAL_MOCS_REGISTERS(gt->i915))
@@ -390,11 +394,16 @@ void intel_mocs_init_engine(struct intel_engine_cs *engine)
 	if (!get_mocs_settings(gt, &table))
 		return;
 
+	active_clos = engine->i915->clos.active_clos;
 	/* Set unused values to PTE */
 	unused_value = table.table[I915_MOCS_PTE].control_value;
+	unused_value &= ~LE_COS_MASK;
+	unused_value |= FIELD_PREP(LE_COS_MASK, active_clos);
 
 	for (index = 0; index < table.size; index++) {
 		u32 value = get_entry_control(&table, index);
+		value &= ~LE_COS_MASK;
+		value |= FIELD_PREP(LE_COS_MASK, active_clos);
 
 		intel_uncore_write_fw(uncore,
 				      mocs_register(engine->id, index),
@@ -444,13 +453,17 @@ static int emit_mocs_control_table(struct i915_request *rq,
 	enum intel_engine_id engine = rq->engine->id;
 	unsigned int index;
 	u32 unused_value;
+	u32 active_clos;
 	u32 *cs;
 
 	if (GEM_WARN_ON(table->size > table->n_entries))
 		return -ENODEV;
 
+	active_clos = rq->i915->clos.active_clos;
 	/* Set unused values to PTE */
 	unused_value = table->table[I915_MOCS_PTE].control_value;
+	unused_value &= ~LE_COS_MASK;
+	unused_value |= FIELD_PREP(LE_COS_MASK, active_clos);
 
 	cs = intel_ring_begin(rq, 2 + 2 * table->n_entries);
 	if (IS_ERR(cs))
@@ -460,6 +473,8 @@ static int emit_mocs_control_table(struct i915_request *rq,
 
 	for (index = 0; index < table->size; index++) {
 		u32 value = get_entry_control(table, index);
+		value &= ~LE_COS_MASK;
+		value |= FIELD_PREP(LE_COS_MASK, active_clos);
 
 		*cs++ = i915_mmio_reg_offset(mocs_register(engine, index));
 		*cs++ = value;
@@ -625,6 +640,106 @@ int intel_mocs_emit(struct i915_request *rq)
 	return 0;
 }
 
+void intel_mocs_init_reg_state(const struct intel_context *ce)
+{
+	struct drm_i915_private *i915 = ce->engine->i915;
+	u32 *reg_state = ce->lrc_reg_state;
+	struct drm_i915_mocs_table t;
+	u32 active_clos;
+	u32 value;
+	int i;
+
+	get_mocs_settings(ce->engine->gt, &t);
+
+	active_clos = i915->clos.active_clos;
+
+	if (active_clos == FIELD_GET(LE_COS_MASK, get_entry_control(&t, 0)))
+		return;
+
+	for (i = 0; i < t.n_entries; i++) {
+		value = reg_state[ctx_mocsN(i)];
+		value &= ~LE_COS_MASK;
+		value |= FIELD_PREP(LE_COS_MASK, active_clos);
+		reg_state[ctx_mocsN(i)] = value;
+	}
+}
+
+int intel_mocs_store_clos(struct i915_request *rq,
+			  struct intel_context *ce)
+{
+	struct drm_i915_mocs_table t;
+	unsigned int count, index;
+	u32 value, unused_value, active_clos;
+	u32 offset;
+	u32 *cs;
+
+	if (!get_mocs_settings(rq->engine->gt, &t))
+		return -ENODEV;
+
+	count = t.n_entries;
+	active_clos = rq->i915->clos.active_clos;
+	cs = intel_ring_begin(rq, 4 * count);
+	if (IS_ERR(cs))
+		return PTR_ERR(cs);
+
+	offset = i915_ggtt_offset(ce->state) + LRC_STATE_PN * PAGE_SIZE;
+
+	unused_value = t.table[I915_MOCS_PTE].control_value;
+	unused_value &= ~LE_COS_MASK;
+	unused_value |= FIELD_PREP(LE_COS_MASK, active_clos);
+
+	for (index = 0; index < t.size; index++) {
+		value = get_entry_control(&t, index);
+		value &= ~LE_COS_MASK;
+		value |= FIELD_PREP(LE_COS_MASK, active_clos);
+
+		*cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
+		*cs++ = offset + ctx_mocsN(index) * sizeof(uint32_t);
+		*cs++ = 0;
+		*cs++ = value;
+	}
+
+	for (; index < t.n_entries; index++) {
+		*cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
+		*cs++ = offset + ctx_mocsN(index) * sizeof(uint32_t);
+		*cs++ = 0;
+		*cs++ = unused_value;
+	}
+
+	intel_ring_advance(rq, cs);
+
+	return 0;
+}
+
+int intel_mocs_emit_all_engines(struct intel_gt *gt)
+{
+	struct drm_i915_private *i915 = gt->i915;
+	struct intel_engine_cs *engine;
+	enum intel_engine_id id;
+	int err;
+
+	for_each_engine(engine, i915, id) {
+		struct i915_request *rq;
+		struct drm_i915_mocs_table t;
+
+		rq = i915_request_create(engine->kernel_context);
+		if (IS_ERR(rq))
+			return PTR_ERR(rq);
+
+		get_mocs_settings(rq->engine->gt, &t);
+		err = emit_mocs_control_table(rq, &t);
+		if (err) {
+			i915_request_skip(rq, err);
+			i915_request_add(rq);
+			return err;
+		}
+
+		i915_request_add(rq);
+	}
+
+	return 0;
+}
+
 void intel_mocs_init(struct intel_gt *gt)
 {
 	intel_mocs_init_l3cc_table(gt);
diff --git a/drivers/gpu/drm/i915/gt/intel_mocs.h b/drivers/gpu/drm/i915/gt/intel_mocs.h
index 2ae816b7ca19..6a584aa36370 100644
--- a/drivers/gpu/drm/i915/gt/intel_mocs.h
+++ b/drivers/gpu/drm/i915/gt/intel_mocs.h
@@ -49,13 +49,20 @@
  * context handling keep the MOCS in step.
  */
 
+#include <linux/types.h>
+
 struct i915_request;
 struct intel_engine_cs;
+struct intel_context;
 struct intel_gt;
 
 void intel_mocs_init(struct intel_gt *gt);
 void intel_mocs_init_engine(struct intel_engine_cs *engine);
+void intel_mocs_init_reg_state(const struct intel_context *ce);
 
 int intel_mocs_emit(struct i915_request *rq);
+int intel_mocs_emit_all_engines(struct intel_gt *gt);
+
+int intel_mocs_store_clos(struct i915_request *rq, struct intel_context *ce);
 
 #endif
diff --git a/drivers/gpu/drm/i915/i915_clos.c b/drivers/gpu/drm/i915/i915_clos.c
new file mode 100644
index 000000000000..ead6fadcb5b3
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_clos.c
@@ -0,0 +1,128 @@
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright © 2019 Intel Corporation
+ */
+
+#include "gem/i915_gem_context.h"
+#include "gt/intel_context.h"
+#include "gt/intel_mocs.h"
+
+#include "i915_clos.h"
+#include "i915_drv.h"
+#include "intel_sideband.h"
+
+#define GEN11_DEFAULT_CLOS 0
+
+static int clos_modify_context(struct intel_context *ce)
+{
+	struct i915_request *rq;
+	int err;
+
+	lockdep_assert_held(&ce->pin_mutex);
+
+	rq = i915_request_create(ce->engine->kernel_context);
+	if (IS_ERR(rq))
+		return PTR_ERR(rq);
+
+	/* Serialise with the remote context */
+	err = intel_context_prepare_remote_request(ce, rq);
+	if (err == 0)
+		err = intel_mocs_store_clos(rq, ce);
+
+	i915_request_add(rq);
+	return err;
+}
+
+static int clos_configure_context(struct i915_gem_context *ctx)
+{
+	struct i915_gem_engines_iter it;
+	struct intel_context *ce;
+	int err = 0;
+
+	for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
+		GEM_BUG_ON(ce == ce->engine->kernel_context);
+
+		if (ce->engine->class != RENDER_CLASS)
+			continue;
+
+		err = intel_context_lock_pinned(ce);
+		if (err)
+			break;
+
+		if (intel_context_is_pinned(ce))
+			err = clos_modify_context(ce);
+
+		intel_context_unlock_pinned(ce);
+		if (err)
+			break;
+	}
+	i915_gem_context_unlock_engines(ctx);
+
+	return err;
+}
+
+static int clos_configure_all_contexts(struct drm_i915_private *i915)
+{
+	struct i915_gem_context *ctx, *cn;
+	int err;
+
+	/*
+	 * MOCS registers of render engine are context saved and restored to and
+	 * from a context image.
+	 * So for any MOCS update to reflect on the existing contexts requires
+	 * updating the context image.
+	 */
+	spin_lock(&i915->gem.contexts.lock);
+	list_for_each_entry_safe(ctx, cn, &i915->gem.contexts.list, link) {
+		if (ctx == i915->kernel_context)
+			continue;
+
+		spin_unlock(&i915->gem.contexts.lock);
+
+		err = clos_configure_context(ctx);
+		if (err)
+			return err;
+
+		spin_lock(&i915->gem.contexts.lock);
+		list_safe_reset_next(ctx, cn, link);
+		i915_gem_context_put(ctx);
+	}
+	spin_unlock(&i915->gem.contexts.lock);
+	/*
+	 * After updating all other contexts, update render context image of
+	 * kernel context. Also update the MOCS of non-render engines.
+	 */
+	err = intel_mocs_emit_all_engines(&i915->gt);
+
+	return err;
+}
+
+int i915_mocs_update_clos(struct drm_i915_private *i915)
+{
+	return clos_configure_all_contexts(i915);
+}
+
+void i915_read_clos_way_mask(struct drm_i915_private *i915)
+{
+	int ret, i;
+	u32 val;
+
+	i915->clos.active_clos = GEN11_DEFAULT_CLOS;
+
+	for (i = 0; i < NUM_OF_CLOS; i++) {
+		val = i;
+		ret = sandybridge_pcode_read(i915,
+					     ICL_PCODE_LLC_COS_WAY_MASK_INFO,
+					     &val, NULL);
+		if (ret) {
+			DRM_ERROR("Mailbox read error = %d\n", ret);
+			return;
+		}
+
+		i915->clos.way_mask[i] = val;
+	}
+
+	i915->clos.support_way_mask_read = true;
+}
+
diff --git a/drivers/gpu/drm/i915/i915_clos.h b/drivers/gpu/drm/i915/i915_clos.h
new file mode 100644
index 000000000000..02bfbdaf0ca3
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_clos.h
@@ -0,0 +1,15 @@
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright © 2019 Intel Corporation
+ */
+
+#ifndef __I915_CLOS_H__
+#define __I915_CLOS_H__
+
+struct drm_i915_private;
+
+int i915_mocs_update_clos(struct drm_i915_private *i915);
+void i915_read_clos_way_mask(struct drm_i915_private *i915);
+
+#endif /* __I915_CLOS_H__ */
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index c46b339064c0..73d1f79f347e 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1313,6 +1313,16 @@ struct drm_i915_private {
 		bool distrust_bios_wm;
 	} wm;
 
+	/* Last Level Cache  Class of Service */
+	struct {
+		bool support_way_mask_read;
+		u32 active_clos;
+#define NUM_OF_CLOS 4
+		u16 way_mask[NUM_OF_CLOS];
+		/* Lock to serialize updating device clos via sysfs interface.*/
+		struct mutex lock;
+	} clos;
+
 	struct dram_info {
 		bool valid;
 		bool is_16gb_dimm;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 0ddbd3a5fb8d..b2b89ca8c726 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -54,6 +54,7 @@
 #include "gt/intel_renderstate.h"
 #include "gt/intel_workarounds.h"
 
+#include "i915_clos.h"
 #include "i915_drv.h"
 #include "i915_scatterlist.h"
 #include "i915_trace.h"
@@ -1281,6 +1282,8 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
 
 	intel_uc_init(&dev_priv->gt.uc);
 
+	i915_read_clos_way_mask(dev_priv);
+
 	ret = intel_gt_init_hw(&dev_priv->gt);
 	if (ret)
 		goto err_uc_init;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index e24991e54897..d9689a494910 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -8869,6 +8869,7 @@ enum {
 #define   ICL_PCODE_MEM_SUBSYSYSTEM_INFO	0xd
 #define     ICL_PCODE_MEM_SS_READ_GLOBAL_INFO	(0x0 << 8)
 #define     ICL_PCODE_MEM_SS_READ_QGV_POINT_INFO(point)	(((point) << 16) | (0x1 << 8))
+#define   ICL_PCODE_LLC_COS_WAY_MASK_INFO	0x1d
 #define   GEN6_PCODE_READ_D_COMP		0x10
 #define   GEN6_PCODE_WRITE_D_COMP		0x11
 #define   HSW_PCODE_DE_WRITE_FREQ_REQ		0x17
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
index bf039b8ba593..cb90cee474fb 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++ b/drivers/gpu/drm/i915/i915_sysfs.c
@@ -32,10 +32,12 @@
 
 #include "gt/intel_rc6.h"
 
+#include "i915_clos.h"
 #include "i915_drv.h"
 #include "i915_sysfs.h"
 #include "intel_pm.h"
 #include "intel_sideband.h"
+#include "gt/intel_mocs.h"
 
 static inline struct drm_i915_private *kdev_minor_to_i915(struct device *kdev)
 {
@@ -255,6 +257,92 @@ static const struct bin_attribute dpf_attrs_1 = {
 	.private = (void *)1
 };
 
+static ssize_t llc_clos_show(struct device *kdev,
+			     struct device_attribute *attr, char *buf)
+{
+	struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
+	ssize_t len = 0;
+	int active_clos;
+
+	active_clos = dev_priv->clos.active_clos;
+	len += snprintf(buf + len, PAGE_SIZE, "0x%x\n",
+			dev_priv->clos.way_mask[active_clos]);
+
+	return len;
+}
+
+/*
+ * This will tie the GPU device to a class-of-service. Each class-of-service
+ * has way_mask associated with it. A way-mask determines the LLC cache ways
+ * that wil be used to allocate cachelines for the GPU memory accesses.
+ */
+static ssize_t llc_clos_store(struct device *kdev,
+			      struct device_attribute *attr,
+			      const char *buf, size_t count)
+{
+	struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
+	u8 active_clos, new_clos, clos_index;
+	bool valid_mask = false;
+	ssize_t ret;
+	u16 way_mask;
+
+	ret = kstrtou16(buf, 0, &way_mask);
+	if (ret)
+		return ret;
+
+	active_clos = dev_priv->clos.active_clos;
+
+	if (dev_priv->clos.way_mask[active_clos] == way_mask)
+		return count;
+
+	for (clos_index = 0; clos_index < NUM_OF_CLOS; clos_index++) {
+		if (dev_priv->clos.way_mask[clos_index] == way_mask) {
+			new_clos = clos_index;
+			valid_mask = true;
+			break;
+		}
+	}
+
+	if (!valid_mask)
+		return -EINVAL;
+
+	ret = mutex_lock_interruptible(&dev_priv->clos.lock);
+	if (ret)
+		return ret;
+
+	dev_priv->clos.active_clos = new_clos;
+	ret = i915_mocs_update_clos(dev_priv);
+	if (ret) {
+		DRM_ERROR("Failed to update Class of service\n");
+		dev_priv->clos.active_clos = active_clos;
+		mutex_unlock(&dev_priv->clos.lock);
+		return ret;
+	}
+
+	mutex_unlock(&dev_priv->clos.lock);
+
+	return count;
+}
+
+static ssize_t llc_clos_modes_show(struct device *kdev,
+				   struct device_attribute *attr, char *buf)
+{
+	struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
+	ssize_t len = 0;
+	int i;
+
+	for (i = 0; i < NUM_OF_CLOS; i++)
+		len += snprintf(buf + len, PAGE_SIZE, "0x%x ",
+				dev_priv->clos.way_mask[i]);
+
+	len += snprintf(buf + len, PAGE_SIZE, "\n");
+
+	return len;
+}
+
+static DEVICE_ATTR_RW(llc_clos);
+static DEVICE_ATTR_RO(llc_clos_modes);
+
 static ssize_t gt_act_freq_mhz_show(struct device *kdev,
 				    struct device_attribute *attr, char *buf)
 {
@@ -574,6 +662,18 @@ void i915_setup_sysfs(struct drm_i915_private *dev_priv)
 	struct device *kdev = dev_priv->drm.primary->kdev;
 	int ret;
 
+	if (dev_priv->clos.support_way_mask_read) {
+		ret = sysfs_create_file(&kdev->kobj,
+					&dev_attr_llc_clos.attr);
+		if (ret)
+			DRM_ERROR("LLC COS sysfs setup failed\n");
+
+		ret = sysfs_create_file(&kdev->kobj,
+					&dev_attr_llc_clos_modes.attr);
+		if (ret)
+			DRM_ERROR("LLC COS sysfs setup failed\n");
+	}
+
 #ifdef CONFIG_PM
 	if (HAS_RC6(dev_priv)) {
 		ret = sysfs_merge_group(&kdev->kobj,
@@ -624,6 +724,11 @@ void i915_teardown_sysfs(struct drm_i915_private *dev_priv)
 
 	i915_teardown_error_capture(kdev);
 
+	if (dev_priv->clos.support_way_mask_read) {
+		sysfs_remove_file(&kdev->kobj, &dev_attr_llc_clos.attr);
+		sysfs_remove_file(&kdev->kobj, &dev_attr_llc_clos_modes.attr);
+	}
+
 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
 		sysfs_remove_files(&kdev->kobj, vlv_attrs);
 	else
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* ✗ Fi.CI.CHECKPATCH: warning for Add sysfs interface to control class-of-service
  2019-10-15  7:31 [PATCH v4 0/1] Add sysfs interface to control class-of-service Prathap Kumar Valsan
  2019-10-15  7:31 ` [PATCH v4 1/1] drm/i915: " Prathap Kumar Valsan
@ 2019-10-15  7:41 ` Patchwork
  2019-10-15  8:02 ` ✗ Fi.CI.BAT: failure " Patchwork
  2 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2019-10-15  7:41 UTC (permalink / raw)
  To: Kumar Valsan, Prathap; +Cc: intel-gfx

== Series Details ==

Series: Add sysfs interface to control class-of-service
URL   : https://patchwork.freedesktop.org/series/68007/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
2e4da329bf04 drm/i915: Add sysfs interface to control class-of-service
-:301: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#301: 
new file mode 100644

-:306: WARNING:SPDX_LICENSE_TAG: Missing or malformed SPDX-License-Identifier tag in line 1
#306: FILE: drivers/gpu/drm/i915/i915_clos.c:1:
+/*

-:307: WARNING:SPDX_LICENSE_TAG: Misplaced SPDX-License-Identifier tag - use line 1 instead
#307: FILE: drivers/gpu/drm/i915/i915_clos.c:2:
+ * SPDX-License-Identifier: MIT

-:440: WARNING:SPDX_LICENSE_TAG: Missing or malformed SPDX-License-Identifier tag in line 1
#440: FILE: drivers/gpu/drm/i915/i915_clos.h:1:
+/*

-:441: WARNING:SPDX_LICENSE_TAG: Misplaced SPDX-License-Identifier tag - use line 1 instead
#441: FILE: drivers/gpu/drm/i915/i915_clos.h:2:
+ * SPDX-License-Identifier: MIT

total: 0 errors, 5 warnings, 0 checks, 536 lines checked

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* Re: [PATCH v4 1/1] drm/i915: Add sysfs interface to control class-of-service
  2019-10-15  7:31 ` [PATCH v4 1/1] drm/i915: " Prathap Kumar Valsan
@ 2019-10-15  7:55   ` Chris Wilson
  2019-10-16 18:16   ` Reinette Chatre
  1 sibling, 0 replies; 7+ messages in thread
From: Chris Wilson @ 2019-10-15  7:55 UTC (permalink / raw)
  To: Prathap Kumar Valsan, intel-gfx; +Cc: reinette.chatre

Quoting Prathap Kumar Valsan (2019-10-15 08:31:29)
> +int intel_mocs_emit_all_engines(struct intel_gt *gt)
> +{
> +       struct drm_i915_private *i915 = gt->i915;
> +       struct intel_engine_cs *engine;
> +       enum intel_engine_id id;
> +       int err;
> +
> +       for_each_engine(engine, i915, id) {

Pass i915, and use for_each_uabi_engine(engine, i915) instead.

> +               struct i915_request *rq;
> +               struct drm_i915_mocs_table t;
> +
> +               rq = i915_request_create(engine->kernel_context);
> +               if (IS_ERR(rq))
> +                       return PTR_ERR(rq);
> +
> +               get_mocs_settings(rq->engine->gt, &t);
> +               err = emit_mocs_control_table(rq, &t);
> +               if (err) {
> +                       i915_request_skip(rq, err);
> +                       i915_request_add(rq);
> +                       return err;
> +               }
> +
> +               i915_request_add(rq);
> +       }
> +
> +       return 0;
> +}
> +
>  void intel_mocs_init(struct intel_gt *gt)
>  {
>         intel_mocs_init_l3cc_table(gt);
> diff --git a/drivers/gpu/drm/i915/gt/intel_mocs.h b/drivers/gpu/drm/i915/gt/intel_mocs.h
> index 2ae816b7ca19..6a584aa36370 100644
> --- a/drivers/gpu/drm/i915/gt/intel_mocs.h
> +++ b/drivers/gpu/drm/i915/gt/intel_mocs.h
> @@ -49,13 +49,20 @@
>   * context handling keep the MOCS in step.
>   */
>  
> +#include <linux/types.h>
> +
>  struct i915_request;
>  struct intel_engine_cs;
> +struct intel_context;
>  struct intel_gt;
>  
>  void intel_mocs_init(struct intel_gt *gt);
>  void intel_mocs_init_engine(struct intel_engine_cs *engine);
> +void intel_mocs_init_reg_state(const struct intel_context *ce);
>  
>  int intel_mocs_emit(struct i915_request *rq);
> +int intel_mocs_emit_all_engines(struct intel_gt *gt);
> +
> +int intel_mocs_store_clos(struct i915_request *rq, struct intel_context *ce);
>  
>  #endif
> diff --git a/drivers/gpu/drm/i915/i915_clos.c b/drivers/gpu/drm/i915/i915_clos.c
> new file mode 100644
> index 000000000000..ead6fadcb5b3
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/i915_clos.c
> @@ -0,0 +1,128 @@
> +/*
> + * SPDX-License-Identifier: MIT
> + *
> + * Copyright © 2019 Intel Corporation
> + */
> +
> +#include "gem/i915_gem_context.h"
> +#include "gt/intel_context.h"
> +#include "gt/intel_mocs.h"
> +
> +#include "i915_clos.h"
> +#include "i915_drv.h"
> +#include "intel_sideband.h"
> +
> +#define GEN11_DEFAULT_CLOS 0
> +
> +static int clos_modify_context(struct intel_context *ce)
> +{
> +       struct i915_request *rq;
> +       int err;
> +
> +       lockdep_assert_held(&ce->pin_mutex);
> +
> +       rq = i915_request_create(ce->engine->kernel_context);
> +       if (IS_ERR(rq))
> +               return PTR_ERR(rq);
> +
> +       /* Serialise with the remote context */
> +       err = intel_context_prepare_remote_request(ce, rq);
> +       if (err == 0)
> +               err = intel_mocs_store_clos(rq, ce);
> +
> +       i915_request_add(rq);
> +       return err;
> +}
> +
> +static int clos_configure_context(struct i915_gem_context *ctx)
> +{
> +       struct i915_gem_engines_iter it;
> +       struct intel_context *ce;
> +       int err = 0;
> +
> +       for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
> +               GEM_BUG_ON(ce == ce->engine->kernel_context);
> +
> +               if (ce->engine->class != RENDER_CLASS)
> +                       continue;
> +
> +               err = intel_context_lock_pinned(ce);
> +               if (err)
> +                       break;
> +
> +               if (intel_context_is_pinned(ce))
> +                       err = clos_modify_context(ce);
> +
> +               intel_context_unlock_pinned(ce);
> +               if (err)
> +                       break;
> +       }
> +       i915_gem_context_unlock_engines(ctx);
> +
> +       return err;
> +}
> +
> +static int clos_configure_all_contexts(struct drm_i915_private *i915)
> +{
> +       struct i915_gem_context *ctx, *cn;
> +       int err;
> +
> +       /*
> +        * MOCS registers of render engine are context saved and restored to and
> +        * from a context image.
> +        * So for any MOCS update to reflect on the existing contexts requires
> +        * updating the context image.
> +        */
> +       spin_lock(&i915->gem.contexts.lock);
> +       list_for_each_entry_safe(ctx, cn, &i915->gem.contexts.list, link) {
> +               if (ctx == i915->kernel_context)
> +                       continue;

Did you forget something here?

> +
> +               spin_unlock(&i915->gem.contexts.lock);
> +
> +               err = clos_configure_context(ctx);
> +               if (err)
> +                       return err;
> +
> +               spin_lock(&i915->gem.contexts.lock);
> +               list_safe_reset_next(ctx, cn, link);
> +               i915_gem_context_put(ctx);

... Something that pairs with the put?

> +       }
> +       spin_unlock(&i915->gem.contexts.lock);
> +       /*
> +        * After updating all other contexts, update render context image of
> +        * kernel context. Also update the MOCS of non-render engines.
> +        */
> +       err = intel_mocs_emit_all_engines(&i915->gt);
> +
> +       return err;
> +}
> +
> +int i915_mocs_update_clos(struct drm_i915_private *i915)
> +{
> +       return clos_configure_all_contexts(i915);
> +}
> +
> +void i915_read_clos_way_mask(struct drm_i915_private *i915)
> +{
> +       int ret, i;
> +       u32 val;
> +
> +       i915->clos.active_clos = GEN11_DEFAULT_CLOS;
> +
> +       for (i = 0; i < NUM_OF_CLOS; i++) {
> +               val = i;
> +               ret = sandybridge_pcode_read(i915,
> +                                            ICL_PCODE_LLC_COS_WAY_MASK_INFO,
> +                                            &val, NULL);
> +               if (ret) {
> +                       DRM_ERROR("Mailbox read error = %d\n", ret);
> +                       return;
> +               }
> +
> +               i915->clos.way_mask[i] = val;
> +       }
> +
> +       i915->clos.support_way_mask_read = true;

So you opt for boot failure on 10 generations?

> +}
> +
> diff --git a/drivers/gpu/drm/i915/i915_clos.h b/drivers/gpu/drm/i915/i915_clos.h
> new file mode 100644
> index 000000000000..02bfbdaf0ca3
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/i915_clos.h
> @@ -0,0 +1,15 @@
> +/*
> + * SPDX-License-Identifier: MIT
> + *
> + * Copyright © 2019 Intel Corporation
> + */
> +
> +#ifndef __I915_CLOS_H__
> +#define __I915_CLOS_H__
> +
> +struct drm_i915_private;
> +
> +int i915_mocs_update_clos(struct drm_i915_private *i915);
> +void i915_read_clos_way_mask(struct drm_i915_private *i915);
> +
> +#endif /* __I915_CLOS_H__ */
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index c46b339064c0..73d1f79f347e 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1313,6 +1313,16 @@ struct drm_i915_private {
>                 bool distrust_bios_wm;
>         } wm;
>  
> +       /* Last Level Cache  Class of Service */
> +       struct {
> +               bool support_way_mask_read;
> +               u32 active_clos;
> +#define NUM_OF_CLOS 4

We don't use _OF_

> +               u16 way_mask[NUM_OF_CLOS];
> +               /* Lock to serialize updating device clos via sysfs interface.*/
> +               struct mutex lock;

At least try to reorder this so the holes are less obvious.

> +       } clos;
> +
>         struct dram_info {
>                 bool valid;
>                 bool is_16gb_dimm;
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 0ddbd3a5fb8d..b2b89ca8c726 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -54,6 +54,7 @@
>  #include "gt/intel_renderstate.h"
>  #include "gt/intel_workarounds.h"
>  
> +#include "i915_clos.h"
>  #include "i915_drv.h"
>  #include "i915_scatterlist.h"
>  #include "i915_trace.h"
> @@ -1281,6 +1282,8 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
>  
>         intel_uc_init(&dev_priv->gt.uc);
>  
> +       i915_read_clos_way_mask(dev_priv);

This seems very out of place.

>         ret = intel_gt_init_hw(&dev_priv->gt);
>         if (ret)
>                 goto err_uc_init;
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index e24991e54897..d9689a494910 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -8869,6 +8869,7 @@ enum {
>  #define   ICL_PCODE_MEM_SUBSYSYSTEM_INFO       0xd
>  #define     ICL_PCODE_MEM_SS_READ_GLOBAL_INFO  (0x0 << 8)
>  #define     ICL_PCODE_MEM_SS_READ_QGV_POINT_INFO(point)        (((point) << 16) | (0x1 << 8))
> +#define   ICL_PCODE_LLC_COS_WAY_MASK_INFO      0x1d
>  #define   GEN6_PCODE_READ_D_COMP               0x10
>  #define   GEN6_PCODE_WRITE_D_COMP              0x11
>  #define   HSW_PCODE_DE_WRITE_FREQ_REQ          0x17
> diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
> index bf039b8ba593..cb90cee474fb 100644
> --- a/drivers/gpu/drm/i915/i915_sysfs.c
> +++ b/drivers/gpu/drm/i915/i915_sysfs.c
> @@ -32,10 +32,12 @@
>  
>  #include "gt/intel_rc6.h"
>  
> +#include "i915_clos.h"
>  #include "i915_drv.h"
>  #include "i915_sysfs.h"
>  #include "intel_pm.h"
>  #include "intel_sideband.h"
> +#include "gt/intel_mocs.h"
>  
>  static inline struct drm_i915_private *kdev_minor_to_i915(struct device *kdev)
>  {
> @@ -255,6 +257,92 @@ static const struct bin_attribute dpf_attrs_1 = {
>         .private = (void *)1
>  };
>  
> +static ssize_t llc_clos_show(struct device *kdev,
> +                            struct device_attribute *attr, char *buf)
> +{
> +       struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
> +       ssize_t len = 0;
> +       int active_clos;
> +
> +       active_clos = dev_priv->clos.active_clos;
> +       len += snprintf(buf + len, PAGE_SIZE, "0x%x\n",
> +                       dev_priv->clos.way_mask[active_clos]);

Go through this pair with READ/WRITE_ONCE to highlight the races to
yourself and work out if they are legal (and prevent the compiler from
fouling up your race prevention logic).

> +       return len;
> +}
> +
> +/*
> + * This will tie the GPU device to a class-of-service. Each class-of-service
> + * has way_mask associated with it. A way-mask determines the LLC cache ways
> + * that wil be used to allocate cachelines for the GPU memory accesses.
> + */
> +static ssize_t llc_clos_store(struct device *kdev,
> +                             struct device_attribute *attr,
> +                             const char *buf, size_t count)
> +{
> +       struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
> +       u8 active_clos, new_clos, clos_index;
> +       bool valid_mask = false;
> +       ssize_t ret;
> +       u16 way_mask;
> +
> +       ret = kstrtou16(buf, 0, &way_mask);
> +       if (ret)
> +               return ret;
> +
> +       active_clos = dev_priv->clos.active_clos;
> +
> +       if (dev_priv->clos.way_mask[active_clos] == way_mask)
> +               return count;
> +
> +       for (clos_index = 0; clos_index < NUM_OF_CLOS; clos_index++) {
> +               if (dev_priv->clos.way_mask[clos_index] == way_mask) {
> +                       new_clos = clos_index;
> +                       valid_mask = true;
> +                       break;
> +               }
> +       }
> +
> +       if (!valid_mask)
> +               return -EINVAL;
> +
> +       ret = mutex_lock_interruptible(&dev_priv->clos.lock);
> +       if (ret)
> +               return ret;
> +
> +       dev_priv->clos.active_clos = new_clos;
> +       ret = i915_mocs_update_clos(dev_priv);
> +       if (ret) {
> +               DRM_ERROR("Failed to update Class of service\n");
> +               dev_priv->clos.active_clos = active_clos;

Half the contexts are using new_clos. One way out might be to set_wedged
and burn all the evidence.

> +               mutex_unlock(&dev_priv->clos.lock);
> +               return ret;
> +       }
> +
> +       mutex_unlock(&dev_priv->clos.lock);
> +
> +       return count;
> +}
> +
> +static ssize_t llc_clos_modes_show(struct device *kdev,
> +                                  struct device_attribute *attr, char *buf)
> +{
> +       struct drm_i915_private *dev_priv = kdev_minor_to_i915(kdev);
> +       ssize_t len = 0;
> +       int i;
> +
> +       for (i = 0; i < NUM_OF_CLOS; i++)
> +               len += snprintf(buf + len, PAGE_SIZE, "0x%x ",
> +                               dev_priv->clos.way_mask[i]);
> +
> +       len += snprintf(buf + len, PAGE_SIZE, "\n");

One way other sysfs use for a single interface is to show the active
mode with an asterisk [*].

> +
> +       return len;
> +}
> +
> +static DEVICE_ATTR_RW(llc_clos);
> +static DEVICE_ATTR_RO(llc_clos_modes);
> +
>  static ssize_t gt_act_freq_mhz_show(struct device *kdev,
>                                     struct device_attribute *attr, char *buf)
>  {
> @@ -574,6 +662,18 @@ void i915_setup_sysfs(struct drm_i915_private *dev_priv)
>         struct device *kdev = dev_priv->drm.primary->kdev;
>         int ret;
>  
> +       if (dev_priv->clos.support_way_mask_read) {
> +               ret = sysfs_create_file(&kdev->kobj,
> +                                       &dev_attr_llc_clos.attr);
> +               if (ret)
> +                       DRM_ERROR("LLC COS sysfs setup failed\n");
> +
> +               ret = sysfs_create_file(&kdev->kobj,
> +                                       &dev_attr_llc_clos_modes.attr);
> +               if (ret)
> +                       DRM_ERROR("LLC COS sysfs setup failed\n");

On the scale of 0-9, how serious is this actually?

More like a 4 than 6?

> +       }

---------------------------------------------------------------------
Intel Corporation (UK) Limited
Registered No. 1134945 (England)
Registered Office: Pipers Way, Swindon SN3 1RJ
VAT No: 860 2173 47

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* ✗ Fi.CI.BAT: failure for Add sysfs interface to control class-of-service
  2019-10-15  7:31 [PATCH v4 0/1] Add sysfs interface to control class-of-service Prathap Kumar Valsan
  2019-10-15  7:31 ` [PATCH v4 1/1] drm/i915: " Prathap Kumar Valsan
  2019-10-15  7:41 ` ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
@ 2019-10-15  8:02 ` Patchwork
  2 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2019-10-15  8:02 UTC (permalink / raw)
  To: Kumar Valsan, Prathap; +Cc: intel-gfx

== Series Details ==

Series: Add sysfs interface to control class-of-service
URL   : https://patchwork.freedesktop.org/series/68007/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_7091 -> Patchwork_14804
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with Patchwork_14804 absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_14804, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

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

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

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

### IGT changes ###

#### Possible regressions ####

  * igt@i915_selftest@live_active:
    - fi-bdw-5557u:       [PASS][1] -> [DMESG-WARN][2] +25 similar issues
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-bdw-5557u/igt@i915_selftest@live_active.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-bdw-5557u/igt@i915_selftest@live_active.html
    - fi-snb-2600:        [PASS][3] -> [DMESG-WARN][4] +24 similar issues
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-snb-2600/igt@i915_selftest@live_active.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-snb-2600/igt@i915_selftest@live_active.html

  * igt@i915_selftest@live_evict:
    - fi-ivb-3770:        [PASS][5] -> [DMESG-WARN][6] +24 similar issues
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-ivb-3770/igt@i915_selftest@live_evict.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-ivb-3770/igt@i915_selftest@live_evict.html

  * igt@i915_selftest@live_guc:
    - fi-hsw-4770:        [PASS][7] -> [DMESG-WARN][8] +25 similar issues
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-hsw-4770/igt@i915_selftest@live_guc.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-hsw-4770/igt@i915_selftest@live_guc.html
    - fi-bdw-gvtdvm:      [PASS][9] -> [DMESG-WARN][10] +24 similar issues
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-bdw-gvtdvm/igt@i915_selftest@live_guc.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-bdw-gvtdvm/igt@i915_selftest@live_guc.html

  * igt@i915_selftest@live_requests:
    - fi-hsw-peppy:       [PASS][11] -> [DMESG-WARN][12] +25 similar issues
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-hsw-peppy/igt@i915_selftest@live_requests.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-hsw-peppy/igt@i915_selftest@live_requests.html

  * igt@i915_selftest@live_reset:
    - fi-snb-2520m:       [PASS][13] -> [DMESG-WARN][14] +24 similar issues
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-snb-2520m/igt@i915_selftest@live_reset.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-snb-2520m/igt@i915_selftest@live_reset.html

  * igt@i915_selftest@live_workarounds:
    - fi-ilk-650:         [PASS][15] -> [DMESG-WARN][16] +24 similar issues
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-ilk-650/igt@i915_selftest@live_workarounds.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-ilk-650/igt@i915_selftest@live_workarounds.html

  
#### Suppressed ####

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

  * {igt@i915_selftest@live_gt_engines}:
    - fi-hsw-peppy:       [PASS][17] -> [DMESG-WARN][18] +4 similar issues
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-hsw-peppy/igt@i915_selftest@live_gt_engines.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-hsw-peppy/igt@i915_selftest@live_gt_engines.html
    - fi-ivb-3770:        [PASS][19] -> [DMESG-WARN][20] +4 similar issues
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-ivb-3770/igt@i915_selftest@live_gt_engines.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-ivb-3770/igt@i915_selftest@live_gt_engines.html
    - fi-hsw-4770:        [PASS][21] -> [DMESG-WARN][22] +4 similar issues
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-hsw-4770/igt@i915_selftest@live_gt_engines.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-hsw-4770/igt@i915_selftest@live_gt_engines.html
    - fi-ilk-650:         [PASS][23] -> [DMESG-WARN][24] +4 similar issues
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-ilk-650/igt@i915_selftest@live_gt_engines.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-ilk-650/igt@i915_selftest@live_gt_engines.html

  * {igt@i915_selftest@live_gt_lrc}:
    - fi-bdw-5557u:       [PASS][25] -> [DMESG-WARN][26] +4 similar issues
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-bdw-5557u/igt@i915_selftest@live_gt_lrc.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-bdw-5557u/igt@i915_selftest@live_gt_lrc.html

  * {igt@i915_selftest@live_gt_pm}:
    - fi-bdw-gvtdvm:      [PASS][27] -> [DMESG-WARN][28] +4 similar issues
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-bdw-gvtdvm/igt@i915_selftest@live_gt_pm.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-bdw-gvtdvm/igt@i915_selftest@live_gt_pm.html

  * {igt@i915_selftest@live_gt_timelines}:
    - fi-snb-2520m:       [PASS][29] -> [DMESG-WARN][30] +4 similar issues
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-snb-2520m/igt@i915_selftest@live_gt_timelines.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-snb-2520m/igt@i915_selftest@live_gt_timelines.html
    - fi-snb-2600:        [PASS][31] -> [DMESG-WARN][32] +4 similar issues
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-snb-2600/igt@i915_selftest@live_gt_timelines.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-snb-2600/igt@i915_selftest@live_gt_timelines.html

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

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

### IGT changes ###

#### Issues hit ####

  * igt@gem_ctx_switch@rcs0:
    - fi-apl-guc:         [PASS][33] -> [INCOMPLETE][34] ([fdo#103927])
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-apl-guc/igt@gem_ctx_switch@rcs0.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-apl-guc/igt@gem_ctx_switch@rcs0.html

  * igt@gem_mmap_gtt@basic-write-gtt-no-prefault:
    - fi-icl-u3:          [PASS][35] -> [DMESG-WARN][36] ([fdo#107724])
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-icl-u3/igt@gem_mmap_gtt@basic-write-gtt-no-prefault.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-icl-u3/igt@gem_mmap_gtt@basic-write-gtt-no-prefault.html

  * igt@i915_module_load@reload:
    - fi-blb-e6850:       [PASS][37] -> [INCOMPLETE][38] ([fdo#107718])
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-blb-e6850/igt@i915_module_load@reload.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-blb-e6850/igt@i915_module_load@reload.html
    - fi-elk-e7500:       [PASS][39] -> [INCOMPLETE][40] ([fdo#103989])
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-elk-e7500/igt@i915_module_load@reload.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-elk-e7500/igt@i915_module_load@reload.html

  * igt@i915_selftest@live_hangcheck:
    - fi-hsw-4770r:       [PASS][41] -> [DMESG-FAIL][42] ([fdo#111991])
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-hsw-4770r/igt@i915_selftest@live_hangcheck.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-hsw-4770r/igt@i915_selftest@live_hangcheck.html

  * igt@kms_chamelium@hdmi-hpd-fast:
    - fi-kbl-7500u:       [PASS][43] -> [FAIL][44] ([fdo#109483])
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html

  
#### Possible fixes ####

  * igt@gem_mmap_gtt@basic-read-no-prefault:
    - fi-icl-u3:          [DMESG-WARN][45] ([fdo#107724]) -> [PASS][46] +1 similar issue
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7091/fi-icl-u3/igt@gem_mmap_gtt@basic-read-no-prefault.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/fi-icl-u3/igt@gem_mmap_gtt@basic-read-no-prefault.html

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

  [fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
  [fdo#103989]: https://bugs.freedesktop.org/show_bug.cgi?id=103989
  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#107718]: https://bugs.freedesktop.org/show_bug.cgi?id=107718
  [fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
  [fdo#109483]: https://bugs.freedesktop.org/show_bug.cgi?id=109483
  [fdo#111381]: https://bugs.freedesktop.org/show_bug.cgi?id=111381
  [fdo#111600]: https://bugs.freedesktop.org/show_bug.cgi?id=111600
  [fdo#111735]: https://bugs.freedesktop.org/show_bug.cgi?id=111735
  [fdo#111991]: https://bugs.freedesktop.org/show_bug.cgi?id=111991


Participating hosts (52 -> 43)
------------------------------

  Missing    (9): fi-kbl-soraka fi-ilk-m540 fi-hsw-4200u fi-byt-j1900 fi-byt-squawks fi-bsw-cyan fi-icl-y fi-byt-n2820 fi-byt-clapper 


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

  * CI: CI-20190529 -> None
  * Linux: CI_DRM_7091 -> Patchwork_14804

  CI-20190529: 20190529
  CI_DRM_7091: d88a66d195bcf71e6e05db07ba79c9fab5651f22 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5225: 991ce4eede1c52f76378aebf162a13c20d6f6293 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_14804: 2e4da329bf04793107157d697343be2430f3b652 @ git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

2e4da329bf04 drm/i915: Add sysfs interface to control class-of-service

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14804/index.html
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* Re: [PATCH v4 1/1] drm/i915: Add sysfs interface to control class-of-service
  2019-10-15  7:31 ` [PATCH v4 1/1] drm/i915: " Prathap Kumar Valsan
  2019-10-15  7:55   ` Chris Wilson
@ 2019-10-16 18:16   ` Reinette Chatre
  1 sibling, 0 replies; 7+ messages in thread
From: Reinette Chatre @ 2019-10-16 18:16 UTC (permalink / raw)
  To: Prathap Kumar Valsan, intel-gfx; +Cc: Chris P Wilson

Hi Prathap,

On 10/15/2019 12:31 AM, Prathap Kumar Valsan wrote:
> Real-Time clients running on CPU may want to run on its own partition of
> Last-Level-Cache(LLC) to achieve isolation and to be more deterministic.
> The Intel Cache-Allocation-Technology exist on CPU to partition LLC in
> to ways and dedicate a partition to an application.
> 
> However, when LLC is shared between CPU and GPU, the workloads running
> on GPU  has no notion about this partition and can thrash the cache lines
> dedicated to a Real Time task running on CPU. To avoid this, Real-Time
> clients wants a mechanism to read the existing cache ways that GPU can
> allocate, which depends on a class-of-service(CLOS) and its associated
> cache way mask and to restrict the GPU device globally to one of the
> supported CLOS levels.
> 
> Currently GPU hardware supports four CLOS levels and  there is an
> associated way-mask for each CLOS. Each LLC MOCS register has a field
> to select the CLOS level. So in-order to globally set the GPU to a CLOS
> level, driver needs to program entire MOCS table.
> 
> Hardware supports reading supported way-mask configuration for GPU using
> a bios PCode interface. The sysfs interface has two files--llc_clos_modes
> and llc_clos. The file llc_clos_modes is read only file and will list the
> available way masks. The file llc_clos is read/write and will show the
> currently active way mask and writing a new way mask will update the
> active way mask of the GPU.
> 
> Note of Caution: Restricting cache ways using this mechanism presents a
> larger attack surface for side-channel attacks.
> 
> Example usage:
>> cat /sys/class/drm/card0/llc_clos_modes
> 0xfff 0xfc0 0xc00 0x800
> 
>> cat /sys/class/drm/card0/llc_clos
> 0xfff
> 
> Update to new clos
> echo "0x800" > /sys/class/drm/card0/llc_clos

Would it be possible to expose this bitmask associated with the active
CLOS internally for the resctrl (kernel subsystem managing IA cache
allocation) to consume? The resctrl subsystem already supports
discovering (as far as hardware exposes this) cache interference to
support cache allocation decisions but at this time the Graphics cache
interference is not discoverable. It would be valuable to the resctrl
subsystem as well as the applications interacting with it to have more
accurate interference information.

Thank you

Reinette
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* ✗ Fi.CI.BAT: failure for Add sysfs interface to control class-of-service
  2019-10-07 16:52 [PATCH v3 0/1] " Prathap Kumar Valsan
@ 2019-10-07 17:15 ` Patchwork
  0 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2019-10-07 17:15 UTC (permalink / raw)
  To: Prathap Kumar Valsan; +Cc: intel-gfx

== Series Details ==

Series: Add sysfs interface to control class-of-service
URL   : https://patchwork.freedesktop.org/series/67700/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_7024 -> Patchwork_14694
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with Patchwork_14694 absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_14694, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

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

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

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

### IGT changes ###

#### Possible regressions ####

  * igt@i915_selftest@live_execlists:
    - fi-skl-6260u:       [PASS][1] -> [DMESG-WARN][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7024/fi-skl-6260u/igt@i915_selftest@live_execlists.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14694/fi-skl-6260u/igt@i915_selftest@live_execlists.html

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

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

### IGT changes ###

#### Issues hit ####

  * igt@i915_selftest@live_execlists:
    - fi-icl-u3:          [PASS][3] -> [DMESG-FAIL][4] ([fdo#111872])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7024/fi-icl-u3/igt@i915_selftest@live_execlists.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14694/fi-icl-u3/igt@i915_selftest@live_execlists.html

  * igt@prime_vgem@basic-read:
    - fi-icl-u3:          [PASS][5] -> [DMESG-WARN][6] ([fdo#107724])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7024/fi-icl-u3/igt@prime_vgem@basic-read.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14694/fi-icl-u3/igt@prime_vgem@basic-read.html

  
#### Possible fixes ####

  * igt@gem_mmap_gtt@basic-write-gtt:
    - fi-icl-u3:          [DMESG-WARN][7] ([fdo#107724]) -> [PASS][8] +1 similar issue
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7024/fi-icl-u3/igt@gem_mmap_gtt@basic-write-gtt.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14694/fi-icl-u3/igt@gem_mmap_gtt@basic-write-gtt.html

  * igt@kms_chamelium@dp-edid-read:
    - fi-kbl-7500u:       [WARN][9] ([fdo#109483]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7024/fi-kbl-7500u/igt@kms_chamelium@dp-edid-read.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14694/fi-kbl-7500u/igt@kms_chamelium@dp-edid-read.html

  
  [fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
  [fdo#109483]: https://bugs.freedesktop.org/show_bug.cgi?id=109483
  [fdo#111872]: https://bugs.freedesktop.org/show_bug.cgi?id=111872


Participating hosts (52 -> 44)
------------------------------

  Missing    (8): fi-ilk-m540 fi-tgl-u fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-icl-y fi-byt-clapper fi-bdw-samus 


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

  * CI: CI-20190529 -> None
  * Linux: CI_DRM_7024 -> Patchwork_14694

  CI-20190529: 20190529
  CI_DRM_7024: b149aba92ace27b28e068c2541270653c23bca75 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5215: 880c8d3c9831349a269ac6822c8d44e80807089f @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_14694: c0fc7c3ea79f2cfb9c05e4e26e3cbd76d74652a2 @ git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

c0fc7c3ea79f drm/i915/ehl: Add sysfs interface to control class-of-service

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_14694/index.html
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

end of thread, other threads:[~2019-10-16 18:16 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-15  7:31 [PATCH v4 0/1] Add sysfs interface to control class-of-service Prathap Kumar Valsan
2019-10-15  7:31 ` [PATCH v4 1/1] drm/i915: " Prathap Kumar Valsan
2019-10-15  7:55   ` Chris Wilson
2019-10-16 18:16   ` Reinette Chatre
2019-10-15  7:41 ` ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
2019-10-15  8:02 ` ✗ Fi.CI.BAT: failure " Patchwork
  -- strict thread matches above, loose matches on Subject: below --
2019-10-07 16:52 [PATCH v3 0/1] " Prathap Kumar Valsan
2019-10-07 17:15 ` ✗ Fi.CI.BAT: failure for " Patchwork

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.