drm/i915/gvt: clean up intel_gvt.h as interface for i915 core
PATCH v2 1/1 drm/i915/gvt: clean up intel_gvt.h as interface for i915 core
i915 core should only call functions and structures exposed through intel_gvt.h. Remove internal gvt.h and i915_pvinfo.h.
Change for internal intel_gvt structure as private handler which not requires to expose gvt internal structure for i915 core.
v2: Fix per Chris's comment
- carefully handle dev_priv->gvt assignment
- add necessary bracket for macro helper
- forward declartion struct intel_gvt
- keep free operation within same file handling alloc
--- drivers/gpu/drm/i915/gvt/aperture_gm.c | 1 + drivers/gpu/drm/i915/gvt/cfg_space.c | 1 + drivers/gpu/drm/i915/gvt/cmd_parser.c | 2 ++ drivers/gpu/drm/i915/gvt/display.c | 1 + drivers/gpu/drm/i915/gvt/edid.c | 1 + drivers/gpu/drm/i915/gvt/execlist.c | 1 + drivers/gpu/drm/i915/gvt/firmware.c | 2 ++ drivers/gpu/drm/i915/gvt/gtt.c | 2 ++ drivers/gpu/drm/i915/gvt/gvt.c | 15 ++++++++++++--- drivers/gpu/drm/i915/gvt/gvt.h | 2 ++ drivers/gpu/drm/i915/gvt/handlers.c | 2 ++ drivers/gpu/drm/i915/gvt/interrupt.c | 1 + drivers/gpu/drm/i915/gvt/mmio.c | 1 + drivers/gpu/drm/i915/gvt/opregion.c | 1 + drivers/gpu/drm/i915/gvt/render.c | 1 + drivers/gpu/drm/i915/gvt/sched_policy.c | 1 + drivers/gpu/drm/i915/gvt/scheduler.c | 5 +++-- drivers/gpu/drm/i915/gvt/vgpu.c | 2 ++ drivers/gpu/drm/i915/i915_drv.h | 4 ++-- drivers/gpu/drm/i915/intel_gvt.h | 3 +-- 20 files changed, 40 insertions(+), 9 deletions(-)
drivers/gpu/drm/i915/gvt/aperture_gm.c +1 -0
@@ -35,6 +35,7 @@*/ #include "i915_drv.h" +#include "gvt.h" #define MB_TO_BYTES (mb) ((mb) << 20ULL)#define BYTES_TO_MB (b) ((b) >> 20ULL)
drivers/gpu/drm/i915/gvt/cfg_space.c +1 -0
@@ -32,6 +32,7 @@*/ #include "i915_drv.h" +#include "gvt.h" enum {INTEL_GVT_PCI_BAR_GTTMMIO =0 ,
drivers/gpu/drm/i915/gvt/cmd_parser.c +2 -0
@@ -36,6 +36,8 @@#include <linux/slab.h> #include "i915_drv.h" +#include "gvt.h" +#include "i915_pvinfo.h" #include "trace.h" #define INVALID_OP (~0U)
drivers/gpu/drm/i915/gvt/display.c +1 -0
@@ -33,6 +33,7 @@*/ #include "i915_drv.h" +#include "gvt.h" static int get_edp_pipe (struct intel_vgpu *vgpu) {
drivers/gpu/drm/i915/gvt/edid.c +1 -0
@@ -33,6 +33,7 @@*/ #include "i915_drv.h" +#include "gvt.h" #define GMBUS1_TOTAL_BYTES_SHIFT 16#define GMBUS1_TOTAL_BYTES_MASK 0x1ff
drivers/gpu/drm/i915/gvt/execlist.c +1 -0
@@ -33,6 +33,7 @@*/ #include "i915_drv.h" +#include "gvt.h" #define _EL_OFFSET_STATUS 0x234#define _EL_OFFSET_STATUS_BUF 0x370
drivers/gpu/drm/i915/gvt/firmware.c +2 -0
@@ -32,6 +32,8 @@#include <linux/crc32.h> #include "i915_drv.h" +#include "gvt.h" +#include "i915_pvinfo.h" #define FIRMWARE_VERSION (0x0)
drivers/gpu/drm/i915/gvt/gtt.c +2 -0
@@ -34,6 +34,8 @@*/ #include "i915_drv.h" +#include "gvt.h" +#include "i915_pvinfo.h" #include "trace.h" static bool enable_out_of_sync = false;
drivers/gpu/drm/i915/gvt/gvt.c +12 -3
@@ -35,6 +35,7 @@#include <linux/kthread.h> #include "i915_drv.h" +#include "gvt.h" struct intel_gvt_host intel_gvt_host;
@@ -173,7 +174,7 @@ static int init_service_thread(struct intel_gvt *gvt)*/ void intel_gvt_clean_device (struct drm_i915_private *dev_priv) { -struct intel_gvt *gvt = &dev_priv->gvt; +struct intel_gvt *gvt =to_gvt (dev_priv);if (WARN_ON (!gvt->initialized))return ;
@@ -188,6 +189,8 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)intel_gvt_clean_mmio_info (gvt);intel_gvt_free_firmware (gvt); +kfree (dev_priv->gvt); + dev_priv->gvt =NULL ; gvt->initialized = false; }
@@ -204,7 +207,7 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)*/ int intel_gvt_init_device (struct drm_i915_private *dev_priv) { -struct intel_gvt *gvt = &dev_priv->gvt; +struct intel_gvt *gvt;int ret;/*
@@ -214,9 +217,13 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)if (WARN_ON (!intel_gvt_host.initialized))return -EINVAL ; -if (WARN_ON (gvt->initialized)) +if (WARN_ON (dev_priv->gvt))return -EEXIST ; + gvt =kzalloc (sizeof (struct intel_gvt ),GFP_KERNEL ); +if (!gvt) +return -ENOMEM ; +gvt_dbg_core ("init gvt device\n" );mutex_init (&gvt->lock);
@@ -262,6 +269,7 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)gvt_dbg_core ("gvt device creation is done\n" ); gvt->initialized = true; + dev_priv->gvt = gvt;return 0 ; out_clean_cmd_parser:
@@ -280,5 +288,6 @@ out_free_firmware:intel_gvt_free_firmware (gvt); out_clean_mmio_info:intel_gvt_clean_mmio_info (gvt); +kfree (gvt);return ret; }
drivers/gpu/drm/i915/gvt/gvt.h +2 -0
@@ -213,6 +213,8 @@ struct intel_gvt {unsigned long service_request; }; +#define to_gvt (dev_priv) (struct intel_gvt *)((dev_priv)->gvt) +enum {INTEL_GVT_REQUEST_EMULATE_VBLANK =0 , };
drivers/gpu/drm/i915/gvt/handlers.c +2 -0
@@ -37,6 +37,8 @@*/ #include "i915_drv.h" +#include "gvt.h" +#include "i915_pvinfo.h" /* XXX FIXME i915 has changed PP_XXX definition */ #define PCH_PP_STATUS _MMIO(0xc7200)
drivers/gpu/drm/i915/gvt/interrupt.c +1 -0
@@ -30,6 +30,7 @@*/ #include "i915_drv.h" +#include "gvt.h" /* common offset among interrupt control registers */ #define regbase_to_isr (base) (base)
drivers/gpu/drm/i915/gvt/mmio.c +1 -0
@@ -34,6 +34,7 @@*/ #include "i915_drv.h" +#include "gvt.h" /** * intel_vgpu_gpa_to_mmio_offset - translate a GPA to MMIO offset
drivers/gpu/drm/i915/gvt/opregion.c +1 -0
@@ -23,6 +23,7 @@#include <linux/acpi.h> #include "i915_drv.h" +#include "gvt.h" static int init_vgpu_opregion (struct intel_vgpu *vgpu,u32 gpa) {
drivers/gpu/drm/i915/gvt/render.c +1 -0
@@ -34,6 +34,7 @@*/ #include "i915_drv.h" +#include "gvt.h" struct render_mmio {int ring_id;
drivers/gpu/drm/i915/gvt/sched_policy.c +1 -0
@@ -32,6 +32,7 @@*/ #include "i915_drv.h" +#include "gvt.h" static bool vgpu_has_pending_workload (struct intel_vgpu *vgpu) {
drivers/gpu/drm/i915/gvt/scheduler.c +3 -2
@@ -33,10 +33,11 @@* */ -#include "i915_drv.h" -#include <linux/kthread.h> +#include "i915_drv.h" +#include "gvt.h" +#define RING_CTX_OFF (x) \ offsetof(struct execlist_ring_context, x)
drivers/gpu/drm/i915/gvt/vgpu.c +2 -0
@@ -32,6 +32,8 @@*/ #include "i915_drv.h" +#include "gvt.h" +#include "i915_pvinfo.h" static void clean_vgpu_mmio (struct intel_vgpu *vgpu) {
drivers/gpu/drm/i915/i915_drv.h +2 -2
@@ -1778,7 +1778,7 @@ struct drm_i915_private {struct i915_virtual_gpu vgpu; -struct intel_gvt gvt; +struct intel_gvt *gvt;struct intel_guc guc;
@@ -2992,7 +2992,7 @@ int intel_wait_for_register_fw(struct drm_i915_private *dev_priv,static inline bool intel_gvt_active (struct drm_i915_private *dev_priv) { -return dev_priv->gvt.initialized; +return dev_priv->gvt; }static inline bool intel_vgpu_active (struct drm_i915_private *dev_priv)
drivers/gpu/drm/i915/intel_gvt.h +1 -2
@@ -24,8 +24,7 @@#ifndef _INTEL_GVT_H_#define _INTEL_GVT_H_ -#include "i915_pvinfo.h" -#include "gvt/gvt.h" +struct intel_gvt ;#ifdef CONFIG_DRM_I915_GVT int intel_gvt_init (struct drm_i915_private *dev_priv);
Signature · 6 lines
2.9.3 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Quoted 8 lines · Zhenyu Wang
void
intel_gvt_clean_device(struct drm_i915_private *dev_priv){drivers/gpu/drm/i915/gvt/gvt.c +1
-1-struct intel_gvt *gvt = &dev_priv->gvt; +struct intel_gvt *gvt =to_gvt (dev_priv);if (WARN_ON (!gvt->initialized))return ;
drivers/gpu/drm/i915/gvt/gvt.c void intel_gvt_clean_device(struct drm_i915_private *dev_priv) · line 195
Quoted 7 lines
drivers/gpu/drm/i915/gvt/gvt.c +2
-0@@ -188,6 +189,8 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)intel_gvt_clean_mmio_info (gvt);intel_gvt_free_firmware (gvt); +kfree (dev_priv->gvt); + dev_priv->gvt =NULL ; gvt->initialized = false; }
Whoops. First a NULL pointer deref then a use-after-free before coffee. I need coffee!
Just remove struct intel_gvt.initialized, it is leading you astray. -Chris
Signature · 5 lines
Chris Wilson, Intel Open Source Technology Centre _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Quoted 20 lines · Chris Wilson
Quoted 8 lines · Zhenyu Wang
void
intel_gvt_clean_device(struct drm_i915_private *dev_priv){drivers/gpu/drm/i915/gvt/gvt.c +1
-1-struct intel_gvt *gvt = &dev_priv->gvt; +struct intel_gvt *gvt =to_gvt (dev_priv);if (WARN_ON (!gvt->initialized))return ;drivers/gpu/drm/i915/gvt/gvt.c void intel_gvt_clean_device(struct drm_i915_private *dev_priv) · line 195
Quoted 7 lines
drivers/gpu/drm/i915/gvt/gvt.c +2
-0@@ -188,6 +189,8 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)intel_gvt_clean_mmio_info (gvt);intel_gvt_free_firmware (gvt); +kfree (dev_priv->gvt); + dev_priv->gvt =NULL ; gvt->initialized = false; }Whoops. First a NULL pointer deref then a use-after-free before coffee. I need coffee!
Quoted 1 line
Just remove struct intel_gvt.initialized, it is leading you astray.
oops! sorry about that...
Signature · 3 lines
Open Source Technology Center, Intel ltd. $gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx