]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/msm: Fix 32b size truncation
authorRob Clark <robin.clark@oss.qualcomm.com>
Thu, 21 Aug 2025 00:04:27 +0000 (17:04 -0700)
committerRob Clark <robin.clark@oss.qualcomm.com>
Sat, 6 Sep 2025 15:58:11 +0000 (08:58 -0700)
Somehow we never noticed this when arm64 became a thing, many years ago.

v2: also fix npages

Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com>
Tested-by: Connor Abbott <cwabbott0@gmail.com>
Patchwork: https://patchwork.freedesktop.org/patch/669785/

drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gem_prime.c

index 9f0f5b77f1bd4fc67c23fffe7b706da7b20e0a32..e6cb51f21d975be33a2caa17b09ba58775ba6c7f 100644 (file)
@@ -192,7 +192,7 @@ static struct page **get_pages(struct drm_gem_object *obj)
        if (!msm_obj->pages) {
                struct drm_device *dev = obj->dev;
                struct page **p;
-               int npages = obj->size >> PAGE_SHIFT;
+               size_t npages = obj->size >> PAGE_SHIFT;
 
                p = drm_gem_get_pages(obj);
 
@@ -1149,7 +1149,7 @@ static int msm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct
 
 /* convenience method to construct a GEM buffer object, and userspace handle */
 int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
-               uint32_t size, uint32_t flags, uint32_t *handle,
+               size_t size, uint32_t flags, uint32_t *handle,
                char *name)
 {
        struct drm_gem_object *obj;
@@ -1215,9 +1215,8 @@ static const struct drm_gem_object_funcs msm_gem_object_funcs = {
        .vm_ops = &vm_ops,
 };
 
-static int msm_gem_new_impl(struct drm_device *dev,
-               uint32_t size, uint32_t flags,
-               struct drm_gem_object **obj)
+static int msm_gem_new_impl(struct drm_device *dev, uint32_t flags,
+                           struct drm_gem_object **obj)
 {
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_gem_object *msm_obj;
@@ -1251,7 +1250,7 @@ static int msm_gem_new_impl(struct drm_device *dev,
        return 0;
 }
 
-struct drm_gem_object *msm_gem_new(struct drm_device *dev, uint32_t size, uint32_t flags)
+struct drm_gem_object *msm_gem_new(struct drm_device *dev, size_t size, uint32_t flags)
 {
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_gem_object *msm_obj;
@@ -1266,7 +1265,7 @@ struct drm_gem_object *msm_gem_new(struct drm_device *dev, uint32_t size, uint32
        if (size == 0)
                return ERR_PTR(-EINVAL);
 
-       ret = msm_gem_new_impl(dev, size, flags, &obj);
+       ret = msm_gem_new_impl(dev, flags, &obj);
        if (ret)
                return ERR_PTR(ret);
 
@@ -1306,12 +1305,12 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_gem_object *msm_obj;
        struct drm_gem_object *obj;
-       uint32_t size;
-       int ret, npages;
+       size_t size, npages;
+       int ret;
 
        size = PAGE_ALIGN(dmabuf->size);
 
-       ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj);
+       ret = msm_gem_new_impl(dev, MSM_BO_WC, &obj);
        if (ret)
                return ERR_PTR(ret);
 
@@ -1354,7 +1353,7 @@ fail:
        return ERR_PTR(ret);
 }
 
-void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size, uint32_t flags,
+void *msm_gem_kernel_new(struct drm_device *dev, size_t size, uint32_t flags,
                         struct drm_gpuvm *vm, struct drm_gem_object **bo,
                         uint64_t *iova)
 {
index 751c3b4965bcd992c8574b18115e5192f05b265e..a4cf31853c5008e171c3ad72cde1004c60fe5212 100644 (file)
@@ -297,10 +297,10 @@ bool msm_gem_active(struct drm_gem_object *obj);
 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout);
 int msm_gem_cpu_fini(struct drm_gem_object *obj);
 int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
-               uint32_t size, uint32_t flags, uint32_t *handle, char *name);
+               size_t size, uint32_t flags, uint32_t *handle, char *name);
 struct drm_gem_object *msm_gem_new(struct drm_device *dev,
-               uint32_t size, uint32_t flags);
-void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size, uint32_t flags,
+               size_t size, uint32_t flags);
+void *msm_gem_kernel_new(struct drm_device *dev, size_t size, uint32_t flags,
                         struct drm_gpuvm *vm, struct drm_gem_object **bo,
                         uint64_t *iova);
 void msm_gem_kernel_put(struct drm_gem_object *bo, struct drm_gpuvm *vm);
index c0a33ac839cb66ab900dd95373895ce647e0d012..036d34c674d9a25da849d257332deae7a905628c 100644 (file)
@@ -15,7 +15,7 @@
 struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
-       int npages = obj->size >> PAGE_SHIFT;
+       size_t npages = obj->size >> PAGE_SHIFT;
 
        if (msm_obj->flags & MSM_BO_NO_SHARE)
                return ERR_PTR(-EINVAL);