[Intel-xe] [PATCH v2 1/2] drm/xe/mmio: don't leak the forcewake ref

Lucas De Marchi lucas.demarchi at intel.com
Tue Feb 14 19:37:28 UTC 2023


On Tue, Feb 14, 2023 at 05:32:23PM +0000, Matthew Auld wrote:
>Make sure we properly release the forcewake ref on all error paths.
>
>Signed-off-by: Matthew Auld <matthew.auld at intel.com>
>Cc: Lucas De Marchi <lucas.demarchi at intel.com>
>---
> drivers/gpu/drm/xe/xe_mmio.c | 18 ++++++++++++------
> 1 file changed, 12 insertions(+), 6 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_mmio.c b/drivers/gpu/drm/xe/xe_mmio.c
>index 8a953df2b468..497f643271ae 100644
>--- a/drivers/gpu/drm/xe/xe_mmio.c
>+++ b/drivers/gpu/drm/xe/xe_mmio.c
>@@ -426,12 +426,16 @@ int xe_mmio_ioctl(struct drm_device *dev, void *data,
> 	if (args->flags & DRM_XE_MMIO_WRITE) {
> 		switch (bits_flag) {
> 		case DRM_XE_MMIO_8BIT:
>-			return -EINVAL; /* TODO */
>+			ret = -EINVAL; /* TODO */
>+			goto exit;
> 		case DRM_XE_MMIO_16BIT:
>-			return -EINVAL; /* TODO */
>+			ret = -EINVAL; /* TODO */
>+			goto exit;
> 		case DRM_XE_MMIO_32BIT:
>-			if (XE_IOCTL_ERR(xe, args->value > U32_MAX))
>-				return -EINVAL;
>+			if (XE_IOCTL_ERR(xe, args->value > U32_MAX)) {
>+				ret = -EINVAL;
>+				goto exit;
>+			}
> 			xe_mmio_write32(to_gt(xe), args->addr, args->value);
> 			break;
> 		case DRM_XE_MMIO_64BIT:
>@@ -447,9 +451,11 @@ int xe_mmio_ioctl(struct drm_device *dev, void *data,
> 	if (args->flags & DRM_XE_MMIO_READ) {
> 		switch (bits_flag) {
> 		case DRM_XE_MMIO_8BIT:
>-			return -EINVAL; /* TODO */
>+			ret = -EINVAL; /* TODO */
>+			break;
> 		case DRM_XE_MMIO_16BIT:
>-			return -EINVAL; /* TODO */
>+			ret = -EINVAL; /* TODO */
>+			break;


Reviewed-by: Lucas De Marchi <lucas.demarchi at intel.com>


Suggestion, up to you:  move the read and write to separate functions
and just surround the them with the forcewake. Or just moving the
default and adding a fallthrough would make it less verbose too. Up to
you.

-----------------8<----------------
diff --git a/drivers/gpu/drm/xe/xe_mmio.c b/drivers/gpu/drm/xe/xe_mmio.c
index ced757ba9ccb..10704d8ed8b8 100644
--- a/drivers/gpu/drm/xe/xe_mmio.c
+++ b/drivers/gpu/drm/xe/xe_mmio.c
@@ -383,6 +383,52 @@ static const i915_reg_t mmio_read_whitelist[] = {
  	RING_TIMESTAMP(RENDER_RING_BASE),
  };
  
+static int mmio_ioctl_read(struct xe_device *xe,
+			   struct drm_xe_mmio *args)
+{
+	switch (args->flags & DRM_XE_MMIO_BITS_MASK) {
+	case DRM_XE_MMIO_32BIT:
+		if (XE_IOCTL_ERR(xe, args->value > U32_MAX))
+			return -EINVAL;
+		xe_mmio_write32(to_gt(xe), args->addr, args->value);
+		break;
+	case DRM_XE_MMIO_64BIT:
+		xe_mmio_write64(to_gt(xe), args->addr, args->value);
+		break;
+
+	default:
+		drm_WARN(&xe->drm, 1, "Invalid MMIO bit size");
+		fallthrough;
+	case DRM_XE_MMIO_8BIT: /* TODO */
+	case DRM_XE_MMIO_16BIT: /* TODO */
+		return -ENOTSUPP;
+	}
+
+	return 0;
+}
+
+static int mmio_ioctl_write(struct xe_device *xe,
+			    struct drm_xe_mmio *args)
+{
+	switch (args->flags & DRM_XE_MMIO_BITS_MASK) {
+	case DRM_XE_MMIO_32BIT:
+		args->value = xe_mmio_read32(to_gt(xe), args->addr);
+		break;
+	case DRM_XE_MMIO_64BIT:
+		args->value = xe_mmio_read64(to_gt(xe), args->addr);
+		break;
+
+	default:
+		drm_WARN(&xe->drm, 1, "Invalid MMIO bit size");
+		fallthrough;
+	case DRM_XE_MMIO_8BIT: /* TODO */
+	case DRM_XE_MMIO_16BIT: /* TODO */
+		return -ENOTSUPP;
+	}
+
+	return 0;
+}
+
  int xe_mmio_ioctl(struct drm_device *dev, void *data,
  		  struct drm_file *file)
  {
@@ -424,43 +470,13 @@ int xe_mmio_ioctl(struct drm_device *dev, void *data,
  	xe_force_wake_get(gt_to_fw(&xe->gt[0]), XE_FORCEWAKE_ALL);
  
  	if (args->flags & DRM_XE_MMIO_WRITE) {
-		switch (bits_flag) {
-		case DRM_XE_MMIO_8BIT:
-			return -EINVAL; /* TODO */
-		case DRM_XE_MMIO_16BIT:
-			return -EINVAL; /* TODO */
-		case DRM_XE_MMIO_32BIT:
-			if (XE_IOCTL_ERR(xe, args->value > U32_MAX))
-				return -EINVAL;
-			xe_mmio_write32(to_gt(xe), args->addr, args->value);
-			break;
-		case DRM_XE_MMIO_64BIT:
-			xe_mmio_write64(to_gt(xe), args->addr, args->value);
-			break;
-		default:
-			drm_WARN(&xe->drm, 1, "Invalid MMIO bit size");
-			ret = -EINVAL;
+		ret = mmio_ioctl_write(xe, args);
+		if (ret)
  			goto exit;
-		}
  	}
  
-	if (args->flags & DRM_XE_MMIO_READ) {
-		switch (bits_flag) {
-		case DRM_XE_MMIO_8BIT:
-			return -EINVAL; /* TODO */
-		case DRM_XE_MMIO_16BIT:
-			return -EINVAL; /* TODO */
-		case DRM_XE_MMIO_32BIT:
-			args->value = xe_mmio_read32(to_gt(xe), args->addr);
-			break;
-		case DRM_XE_MMIO_64BIT:
-			args->value = xe_mmio_read64(to_gt(xe), args->addr);
-			break;
-		default:
-			drm_WARN(&xe->drm, 1, "Invalid MMIO bit size");
-			ret = -EINVAL;
-		}
-	}
+	if (args->flags & DRM_XE_MMIO_READ)
+		ret = mmio_ioctl_read(xe, args);
  
  exit:
  	xe_force_wake_put(gt_to_fw(&xe->gt[0]), XE_FORCEWAKE_ALL);
-----------------8<----------------

Lucas De Marchi


More information about the Intel-xe mailing list