diff mbox series

[v2,1/6] drm/i915: use mock device info for creating mock device

Message ID b0db62045a96a3fd4cf123685da88cc777f9b485.1687878757.git.jani.nikula@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915: further device info fixes and cleanups | expand

Commit Message

Jani Nikula June 27, 2023, 3:13 p.m. UTC
Instead of modifying the device info on the fly, use static const mock
device info.

It's not okay to modify device info at runtime; we've added separate
runtime info for info that needs to be modified at runtime. We've added
safeguards to device info to prevent it from being modified, but commit
5e352e32aec2 ("drm/i915: preparation for using PAT index") just cast the
const away and modified it anyway. This prevents device info from being
moved to rodata.

Fixes: 5e352e32aec2 ("drm/i915: preparation for using PAT index")
Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Cc: Fei Yang <fei.yang@intel.com>
Cc: Andi Shyti <andi.shyti@linux.intel.com>
Cc: Andrzej Hajda <andrzej.hajda@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 .../gpu/drm/i915/selftests/mock_gem_device.c  | 45 ++++++++++---------
 1 file changed, 24 insertions(+), 21 deletions(-)

Comments

Tvrtko Ursulin June 29, 2023, 11 a.m. UTC | #1
On 27/06/2023 16:13, Jani Nikula wrote:
> Instead of modifying the device info on the fly, use static const mock
> device info.
> 
> It's not okay to modify device info at runtime; we've added separate
> runtime info for info that needs to be modified at runtime. We've added
> safeguards to device info to prevent it from being modified, but commit
> 5e352e32aec2 ("drm/i915: preparation for using PAT index") just cast the
> const away and modified it anyway. This prevents device info from being
> moved to rodata.
> 
> Fixes: 5e352e32aec2 ("drm/i915: preparation for using PAT index")
> Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
> Cc: Fei Yang <fei.yang@intel.com>
> Cc: Andi Shyti <andi.shyti@linux.intel.com>
> Cc: Andrzej Hajda <andrzej.hajda@intel.com>
> Cc: Matt Roper <matthew.d.roper@intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   .../gpu/drm/i915/selftests/mock_gem_device.c  | 45 ++++++++++---------
>   1 file changed, 24 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> index 09d4bbcdcdbf..4de6a4e8280d 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> +++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> @@ -118,15 +118,31 @@ static void mock_gt_probe(struct drm_i915_private *i915)
>   	i915->gt[0]->name = "Mock GT";
>   }
>   
> +static const struct intel_device_info mock_info = {
> +	.__runtime.graphics.ip.ver = -1,
> +	.__runtime.page_sizes = (I915_GTT_PAGE_SIZE_4K |
> +				 I915_GTT_PAGE_SIZE_64K |
> +				 I915_GTT_PAGE_SIZE_2M),
> +	.__runtime.memory_regions = REGION_SMEM,
> +	.__runtime.platform_engine_mask = BIT(0),
> +
> +	/* simply use legacy cache level for mock device */
> +	.max_pat_index = 3,
> +	.cachelevel_to_pat = {
> +		[I915_CACHE_NONE]   = 0,
> +		[I915_CACHE_LLC]    = 1,
> +		[I915_CACHE_L3_LLC] = 2,
> +		[I915_CACHE_WT]     = 3,
> +	},
> +};
> +
>   struct drm_i915_private *mock_gem_device(void)
>   {
>   #if IS_ENABLED(CONFIG_IOMMU_API) && defined(CONFIG_INTEL_IOMMU)
>   	static struct dev_iommu fake_iommu = { .priv = (void *)-1 };
>   #endif
>   	struct drm_i915_private *i915;
> -	struct intel_device_info *i915_info;
>   	struct pci_dev *pdev;
> -	unsigned int i;
>   	int ret;
>   
>   	pdev = kzalloc(sizeof(*pdev), GFP_KERNEL);
> @@ -159,15 +175,18 @@ struct drm_i915_private *mock_gem_device(void)
>   
>   	pci_set_drvdata(pdev, i915);
>   
> +	/* Device parameters start as a copy of module parameters. */
> +	i915_params_copy(&i915->params, &i915_modparams);
> +
> +	/* Set up device info and initial runtime info. */
> +	intel_device_info_driver_create(i915, pdev->device, &mock_info);

This one was new to me but figuring out what will dev->device contain, 
or if it could have any unintended consequences was too time consuming. 
If something breaks it will break loudly in testing.

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Regards,

Tvrtko

> +
>   	dev_pm_domain_set(&pdev->dev, &pm_domain);
>   	pm_runtime_enable(&pdev->dev);
>   	pm_runtime_dont_use_autosuspend(&pdev->dev);
>   	if (pm_runtime_enabled(&pdev->dev))
>   		WARN_ON(pm_runtime_get_sync(&pdev->dev));
>   
> -
> -	i915_params_copy(&i915->params, &i915_modparams);
> -
>   	intel_runtime_pm_init_early(&i915->runtime_pm);
>   	/* wakeref tracking has significant overhead */
>   	i915->runtime_pm.no_wakeref_tracking = true;
> @@ -175,21 +194,6 @@ struct drm_i915_private *mock_gem_device(void)
>   	/* Using the global GTT may ask questions about KMS users, so prepare */
>   	drm_mode_config_init(&i915->drm);
>   
> -	RUNTIME_INFO(i915)->graphics.ip.ver = -1;
> -
> -	RUNTIME_INFO(i915)->page_sizes =
> -		I915_GTT_PAGE_SIZE_4K |
> -		I915_GTT_PAGE_SIZE_64K |
> -		I915_GTT_PAGE_SIZE_2M;
> -
> -	RUNTIME_INFO(i915)->memory_regions = REGION_SMEM;
> -
> -	/* simply use legacy cache level for mock device */
> -	i915_info = (struct intel_device_info *)INTEL_INFO(i915);
> -	i915_info->max_pat_index = 3;
> -	for (i = 0; i < I915_MAX_CACHE_LEVEL; i++)
> -		i915_info->cachelevel_to_pat[i] = i;
> -
>   	intel_memory_regions_hw_probe(i915);
>   
>   	spin_lock_init(&i915->gpu_error.lock);
> @@ -223,7 +227,6 @@ struct drm_i915_private *mock_gem_device(void)
>   	mock_init_ggtt(to_gt(i915));
>   	to_gt(i915)->vm = i915_vm_get(&to_gt(i915)->ggtt->vm);
>   
> -	RUNTIME_INFO(i915)->platform_engine_mask = BIT(0);
>   	to_gt(i915)->info.engine_mask = BIT(0);
>   
>   	to_gt(i915)->engine[RCS0] = mock_engine(i915, "mock", RCS0);
Andi Shyti June 29, 2023, 11:53 a.m. UTC | #2
Hi Jani,

On Tue, Jun 27, 2023 at 06:13:58PM +0300, Jani Nikula wrote:
> Instead of modifying the device info on the fly, use static const mock
> device info.
> 
> It's not okay to modify device info at runtime; we've added separate
> runtime info for info that needs to be modified at runtime. We've added
> safeguards to device info to prevent it from being modified, but commit
> 5e352e32aec2 ("drm/i915: preparation for using PAT index") just cast the
> const away and modified it anyway. This prevents device info from being
> moved to rodata.
> 
> Fixes: 5e352e32aec2 ("drm/i915: preparation for using PAT index")
> Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
> Cc: Fei Yang <fei.yang@intel.com>
> Cc: Andi Shyti <andi.shyti@linux.intel.com>
> Cc: Andrzej Hajda <andrzej.hajda@intel.com>
> Cc: Matt Roper <matthew.d.roper@intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

thanks for fixing this!

Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com> 

Andi
Andrzej Hajda June 29, 2023, 12:57 p.m. UTC | #3
On 27.06.2023 17:13, Jani Nikula wrote:
> Instead of modifying the device info on the fly, use static const mock
> device info.
>
> It's not okay to modify device info at runtime; we've added separate
> runtime info for info that needs to be modified at runtime. We've added
> safeguards to device info to prevent it from being modified, but commit
> 5e352e32aec2 ("drm/i915: preparation for using PAT index") just cast the
> const away and modified it anyway. This prevents device info from being
> moved to rodata.
>
> Fixes: 5e352e32aec2 ("drm/i915: preparation for using PAT index")
> Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
> Cc: Fei Yang <fei.yang@intel.com>
> Cc: Andi Shyti <andi.shyti@linux.intel.com>
> Cc: Andrzej Hajda <andrzej.hajda@intel.com>
> Cc: Matt Roper <matthew.d.roper@intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com>

Regards
Andrzej
> ---
>   .../gpu/drm/i915/selftests/mock_gem_device.c  | 45 ++++++++++---------
>   1 file changed, 24 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> index 09d4bbcdcdbf..4de6a4e8280d 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> +++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> @@ -118,15 +118,31 @@ static void mock_gt_probe(struct drm_i915_private *i915)
>   	i915->gt[0]->name = "Mock GT";
>   }
>   
> +static const struct intel_device_info mock_info = {
> +	.__runtime.graphics.ip.ver = -1,
> +	.__runtime.page_sizes = (I915_GTT_PAGE_SIZE_4K |
> +				 I915_GTT_PAGE_SIZE_64K |
> +				 I915_GTT_PAGE_SIZE_2M),
> +	.__runtime.memory_regions = REGION_SMEM,
> +	.__runtime.platform_engine_mask = BIT(0),
> +
> +	/* simply use legacy cache level for mock device */
> +	.max_pat_index = 3,
> +	.cachelevel_to_pat = {
> +		[I915_CACHE_NONE]   = 0,
> +		[I915_CACHE_LLC]    = 1,
> +		[I915_CACHE_L3_LLC] = 2,
> +		[I915_CACHE_WT]     = 3,
> +	},
> +};
> +
>   struct drm_i915_private *mock_gem_device(void)
>   {
>   #if IS_ENABLED(CONFIG_IOMMU_API) && defined(CONFIG_INTEL_IOMMU)
>   	static struct dev_iommu fake_iommu = { .priv = (void *)-1 };
>   #endif
>   	struct drm_i915_private *i915;
> -	struct intel_device_info *i915_info;
>   	struct pci_dev *pdev;
> -	unsigned int i;
>   	int ret;
>   
>   	pdev = kzalloc(sizeof(*pdev), GFP_KERNEL);
> @@ -159,15 +175,18 @@ struct drm_i915_private *mock_gem_device(void)
>   
>   	pci_set_drvdata(pdev, i915);
>   
> +	/* Device parameters start as a copy of module parameters. */
> +	i915_params_copy(&i915->params, &i915_modparams);
> +
> +	/* Set up device info and initial runtime info. */
> +	intel_device_info_driver_create(i915, pdev->device, &mock_info);
> +
>   	dev_pm_domain_set(&pdev->dev, &pm_domain);
>   	pm_runtime_enable(&pdev->dev);
>   	pm_runtime_dont_use_autosuspend(&pdev->dev);
>   	if (pm_runtime_enabled(&pdev->dev))
>   		WARN_ON(pm_runtime_get_sync(&pdev->dev));
>   
> -
> -	i915_params_copy(&i915->params, &i915_modparams);
> -
>   	intel_runtime_pm_init_early(&i915->runtime_pm);
>   	/* wakeref tracking has significant overhead */
>   	i915->runtime_pm.no_wakeref_tracking = true;
> @@ -175,21 +194,6 @@ struct drm_i915_private *mock_gem_device(void)
>   	/* Using the global GTT may ask questions about KMS users, so prepare */
>   	drm_mode_config_init(&i915->drm);
>   
> -	RUNTIME_INFO(i915)->graphics.ip.ver = -1;
> -
> -	RUNTIME_INFO(i915)->page_sizes =
> -		I915_GTT_PAGE_SIZE_4K |
> -		I915_GTT_PAGE_SIZE_64K |
> -		I915_GTT_PAGE_SIZE_2M;
> -
> -	RUNTIME_INFO(i915)->memory_regions = REGION_SMEM;
> -
> -	/* simply use legacy cache level for mock device */
> -	i915_info = (struct intel_device_info *)INTEL_INFO(i915);
> -	i915_info->max_pat_index = 3;
> -	for (i = 0; i < I915_MAX_CACHE_LEVEL; i++)
> -		i915_info->cachelevel_to_pat[i] = i;
> -
>   	intel_memory_regions_hw_probe(i915);
>   
>   	spin_lock_init(&i915->gpu_error.lock);
> @@ -223,7 +227,6 @@ struct drm_i915_private *mock_gem_device(void)
>   	mock_init_ggtt(to_gt(i915));
>   	to_gt(i915)->vm = i915_vm_get(&to_gt(i915)->ggtt->vm);
>   
> -	RUNTIME_INFO(i915)->platform_engine_mask = BIT(0);
>   	to_gt(i915)->info.engine_mask = BIT(0);
>   
>   	to_gt(i915)->engine[RCS0] = mock_engine(i915, "mock", RCS0);
Yang, Fei June 29, 2023, 4:12 p.m. UTC | #4
> Instead of modifying the device info on the fly, use static const
> mock device info.
>
> It's not okay to modify device info at runtime; we've added separate
> runtime info for info that needs to be modified at runtime. We've
> added safeguards to device info to prevent it from being modified,
> but commit 5e352e32aec2 ("drm/i915: preparation for using PAT index")
> just cast the const away and modified it anyway. This prevents device
> info from being moved to rodata.
>
> Fixes: 5e352e32aec2 ("drm/i915: preparation for using PAT index")
> Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
> Cc: Fei Yang <fei.yang@intel.com>
> Cc: Andi Shyti <andi.shyti@linux.intel.com>
> Cc: Andrzej Hajda <andrzej.hajda@intel.com>
> Cc: Matt Roper <matthew.d.roper@intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

Thanks for fixing this.

Reviewed-by: Fei Yang <fei.yang@intel.com>

> ---
>  .../gpu/drm/i915/selftests/mock_gem_device.c  | 45 ++++++++++---------
>  1 file changed, 24 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> index 09d4bbcdcdbf..4de6a4e8280d 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> +++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> @@ -118,15 +118,31 @@ static void mock_gt_probe(struct drm_i915_private *i915)
>       i915->gt[0]->name = "Mock GT";
>  }
>
> +static const struct intel_device_info mock_info = {
> +     .__runtime.graphics.ip.ver = -1,
> +     .__runtime.page_sizes = (I915_GTT_PAGE_SIZE_4K |
> +                              I915_GTT_PAGE_SIZE_64K |
> +                              I915_GTT_PAGE_SIZE_2M),
> +     .__runtime.memory_regions = REGION_SMEM,
> +     .__runtime.platform_engine_mask = BIT(0),
> +
> +     /* simply use legacy cache level for mock device */
> +     .max_pat_index = 3,
> +     .cachelevel_to_pat = {
> +             [I915_CACHE_NONE]   = 0,
> +             [I915_CACHE_LLC]    = 1,
> +             [I915_CACHE_L3_LLC] = 2,
> +             [I915_CACHE_WT]     = 3,
> +     },
> +};
> +
>  struct drm_i915_private *mock_gem_device(void)  {  #if IS_ENABLED(CONFIG_IOMMU_API) && defined(CONFIG_INTEL_IOMMU)
>       static struct dev_iommu fake_iommu = { .priv = (void *)-1 };  #endif
>       struct drm_i915_private *i915;
> -     struct intel_device_info *i915_info;
>       struct pci_dev *pdev;
> -     unsigned int i;
>       int ret;
>
>       pdev = kzalloc(sizeof(*pdev), GFP_KERNEL); @@ -159,15 +175,18 @@ struct drm_i915_private *mock_gem_device(void)
>
>       pci_set_drvdata(pdev, i915);
>
> +     /* Device parameters start as a copy of module parameters. */
> +     i915_params_copy(&i915->params, &i915_modparams);
> +
> +     /* Set up device info and initial runtime info. */
> +     intel_device_info_driver_create(i915, pdev->device, &mock_info);
> +
>       dev_pm_domain_set(&pdev->dev, &pm_domain);
>       pm_runtime_enable(&pdev->dev);
>       pm_runtime_dont_use_autosuspend(&pdev->dev);
>       if (pm_runtime_enabled(&pdev->dev))
>               WARN_ON(pm_runtime_get_sync(&pdev->dev));
>
> -
> -     i915_params_copy(&i915->params, &i915_modparams);
> -
>       intel_runtime_pm_init_early(&i915->runtime_pm);
>       /* wakeref tracking has significant overhead */
>       i915->runtime_pm.no_wakeref_tracking = true;
> @@ -175,21 +194,6 @@ struct drm_i915_private *mock_gem_device(void)
>       /* Using the global GTT may ask questions about KMS users, so prepare */
>       drm_mode_config_init(&i915->drm);
>
> -     RUNTIME_INFO(i915)->graphics.ip.ver = -1;
> -
> -     RUNTIME_INFO(i915)->page_sizes =
> -             I915_GTT_PAGE_SIZE_4K |
> -             I915_GTT_PAGE_SIZE_64K |
> -             I915_GTT_PAGE_SIZE_2M;
> -
> -     RUNTIME_INFO(i915)->memory_regions = REGION_SMEM;
> -
> -     /* simply use legacy cache level for mock device */
> -     i915_info = (struct intel_device_info *)INTEL_INFO(i915);
> -     i915_info->max_pat_index = 3;
> -     for (i = 0; i < I915_MAX_CACHE_LEVEL; i++)
> -             i915_info->cachelevel_to_pat[i] = i;
> -
>       intel_memory_regions_hw_probe(i915);
>
>       spin_lock_init(&i915->gpu_error.lock);
> @@ -223,7 +227,6 @@ struct drm_i915_private *mock_gem_device(void)
>       mock_init_ggtt(to_gt(i915));
>       to_gt(i915)->vm = i915_vm_get(&to_gt(i915)->ggtt->vm);
>
> -     RUNTIME_INFO(i915)->platform_engine_mask = BIT(0);
>       to_gt(i915)->info.engine_mask = BIT(0);
>
>       to_gt(i915)->engine[RCS0] = mock_engine(i915, "mock", RCS0);
> --
> 2.39.2
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
index 09d4bbcdcdbf..4de6a4e8280d 100644
--- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
+++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
@@ -118,15 +118,31 @@  static void mock_gt_probe(struct drm_i915_private *i915)
 	i915->gt[0]->name = "Mock GT";
 }
 
+static const struct intel_device_info mock_info = {
+	.__runtime.graphics.ip.ver = -1,
+	.__runtime.page_sizes = (I915_GTT_PAGE_SIZE_4K |
+				 I915_GTT_PAGE_SIZE_64K |
+				 I915_GTT_PAGE_SIZE_2M),
+	.__runtime.memory_regions = REGION_SMEM,
+	.__runtime.platform_engine_mask = BIT(0),
+
+	/* simply use legacy cache level for mock device */
+	.max_pat_index = 3,
+	.cachelevel_to_pat = {
+		[I915_CACHE_NONE]   = 0,
+		[I915_CACHE_LLC]    = 1,
+		[I915_CACHE_L3_LLC] = 2,
+		[I915_CACHE_WT]     = 3,
+	},
+};
+
 struct drm_i915_private *mock_gem_device(void)
 {
 #if IS_ENABLED(CONFIG_IOMMU_API) && defined(CONFIG_INTEL_IOMMU)
 	static struct dev_iommu fake_iommu = { .priv = (void *)-1 };
 #endif
 	struct drm_i915_private *i915;
-	struct intel_device_info *i915_info;
 	struct pci_dev *pdev;
-	unsigned int i;
 	int ret;
 
 	pdev = kzalloc(sizeof(*pdev), GFP_KERNEL);
@@ -159,15 +175,18 @@  struct drm_i915_private *mock_gem_device(void)
 
 	pci_set_drvdata(pdev, i915);
 
+	/* Device parameters start as a copy of module parameters. */
+	i915_params_copy(&i915->params, &i915_modparams);
+
+	/* Set up device info and initial runtime info. */
+	intel_device_info_driver_create(i915, pdev->device, &mock_info);
+
 	dev_pm_domain_set(&pdev->dev, &pm_domain);
 	pm_runtime_enable(&pdev->dev);
 	pm_runtime_dont_use_autosuspend(&pdev->dev);
 	if (pm_runtime_enabled(&pdev->dev))
 		WARN_ON(pm_runtime_get_sync(&pdev->dev));
 
-
-	i915_params_copy(&i915->params, &i915_modparams);
-
 	intel_runtime_pm_init_early(&i915->runtime_pm);
 	/* wakeref tracking has significant overhead */
 	i915->runtime_pm.no_wakeref_tracking = true;
@@ -175,21 +194,6 @@  struct drm_i915_private *mock_gem_device(void)
 	/* Using the global GTT may ask questions about KMS users, so prepare */
 	drm_mode_config_init(&i915->drm);
 
-	RUNTIME_INFO(i915)->graphics.ip.ver = -1;
-
-	RUNTIME_INFO(i915)->page_sizes =
-		I915_GTT_PAGE_SIZE_4K |
-		I915_GTT_PAGE_SIZE_64K |
-		I915_GTT_PAGE_SIZE_2M;
-
-	RUNTIME_INFO(i915)->memory_regions = REGION_SMEM;
-
-	/* simply use legacy cache level for mock device */
-	i915_info = (struct intel_device_info *)INTEL_INFO(i915);
-	i915_info->max_pat_index = 3;
-	for (i = 0; i < I915_MAX_CACHE_LEVEL; i++)
-		i915_info->cachelevel_to_pat[i] = i;
-
 	intel_memory_regions_hw_probe(i915);
 
 	spin_lock_init(&i915->gpu_error.lock);
@@ -223,7 +227,6 @@  struct drm_i915_private *mock_gem_device(void)
 	mock_init_ggtt(to_gt(i915));
 	to_gt(i915)->vm = i915_vm_get(&to_gt(i915)->ggtt->vm);
 
-	RUNTIME_INFO(i915)->platform_engine_mask = BIT(0);
 	to_gt(i915)->info.engine_mask = BIT(0);
 
 	to_gt(i915)->engine[RCS0] = mock_engine(i915, "mock", RCS0);