accel/habanalabs: export dma-buf only if size/offset multiples of PAGE_SIZE
authorTomer Tayar <ttayar@habana.ai>
Wed, 9 Aug 2023 13:14:49 +0000 (16:14 +0300)
committerOded Gabbay <ogabbay@kernel.org>
Mon, 9 Oct 2023 09:37:22 +0000 (12:37 +0300)
It is currently allowed for a user to export dma-buf with size and
offset that are not multiples of PAGE_SIZE.
The exported memory is mapped for the importer device, and there it will
be rounded to PAGE_SIZE, leading to actually exporting more than the
user intended to.
To make the user be aware of it, accept only size and offset which are
multiple of PAGE_SIZE.

Signed-off-by: Tomer Tayar <ttayar@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
drivers/accel/habanalabs/common/memory.c

index 27ab176c55c1ffea24dadc760202fbcf833c7369..b4a9ff692ebc2add00cb92f982d168d49f1894fb 100644 (file)
@@ -1877,16 +1877,16 @@ err_dma_buf_put:
 
 static int validate_export_params_common(struct hl_device *hdev, u64 device_addr, u64 size)
 {
-       if (!IS_ALIGNED(device_addr, PAGE_SIZE)) {
+       if (!PAGE_ALIGNED(device_addr)) {
                dev_dbg(hdev->dev,
-                       "exported device memory address 0x%llx should be aligned to 0x%lx\n",
+                       "exported device memory address 0x%llx should be aligned to PAGE_SIZE 0x%lx\n",
                        device_addr, PAGE_SIZE);
                return -EINVAL;
        }
 
-       if (size < PAGE_SIZE) {
+       if (!size || !PAGE_ALIGNED(size)) {
                dev_dbg(hdev->dev,
-                       "exported device memory size %llu should be equal to or greater than %lu\n",
+                       "exported device memory size %llu should be a multiple of PAGE_SIZE %lu\n",
                        size, PAGE_SIZE);
                return -EINVAL;
        }
@@ -1937,6 +1937,13 @@ static int validate_export_params(struct hl_device *hdev, u64 device_addr, u64 s
        if (rc)
                return rc;
 
+       if (!PAGE_ALIGNED(offset)) {
+               dev_dbg(hdev->dev,
+                       "exported device memory offset %llu should be a multiple of PAGE_SIZE %lu\n",
+                       offset, PAGE_SIZE);
+               return -EINVAL;
+       }
+
        if ((offset + size) > phys_pg_pack->total_size) {
                dev_dbg(hdev->dev, "offset %#llx and size %#llx exceed total map size %#llx\n",
                                offset, size, phys_pg_pack->total_size);