From: Claude Code Review Bot <claude-review@example.com>
To: dri-devel-reviews@example.com
Subject: Claude review: drm/gpusvm: Use dma-map IOVA alloc, link, and sync API in GPU SVM
Date: Sun, 12 Apr 2026 09:24:51 +1000 [thread overview]
Message-ID: <review-patch1-20260410205929.3914474-2-matthew.brost@intel.com> (raw)
In-Reply-To: <20260410205929.3914474-2-matthew.brost@intel.com>
Patch Review
**Bug: Incorrect unmap logic for mixed system+device pages**
In `__drm_gpusvm_unmap_pages` (`drm_gpusvm.c:1149-1161`), the conditional structure is wrong when `use_iova` is true and the range contains both system and device pages:
```c
if (!use_iova && addr->proto == DRM_INTERCONNECT_SYSTEM)
dma_unmap_page(dev,
addr->addr,
PAGE_SIZE << addr->order,
addr->dir);
else if (dpagemap && dpagemap->ops->device_unmap)
dpagemap->ops->device_unmap(dpagemap,
dev, addr);
```
When `use_iova` is true and a system page entry is encountered, `!use_iova` is false, so the first condition fails. The code then falls through to the `else if`, which calls `device_unmap` on a system page address that was already freed by `dma_iova_destroy` above. This is a use-after-free of the IOVA address from the device_unmap callback's perspective.
This can occur when `ctx->allow_mixed` is true and a range contains both device pages (mapped via `device_map`) and system pages (mapped via IOVA). The fix should be:
```c
if (addr->proto == DRM_INTERCONNECT_SYSTEM) {
if (!use_iova)
dma_unmap_page(dev, addr->addr,
PAGE_SIZE << addr->order,
addr->dir);
} else if (dpagemap && dpagemap->ops->device_unmap) {
dpagemap->ops->device_unmap(dpagemap, dev, addr);
}
```
**Performance gap: IOVA allocation trigger uses `!i` instead of a flag**
In `drm_gpusvm_get_pages` (`drm_gpusvm.c:1552-1557`):
```c
if (!i)
dma_iova_try_alloc(gpusvm->drm->dev, state,
npages * PAGE_SIZE >=
HPAGE_PMD_SIZE ?
HPAGE_PMD_SIZE : 0,
npages * PAGE_SIZE);
```
The `!i` condition means IOVA is only allocated when the very first page (i==0) is a valid system page. If page 0 is invalid (`HMM_PFN_VALID` not set) or is a device page, `i` advances past 0 and IOVA is never allocated for any subsequent system pages. They all fall back to per-page `dma_map_page`. Contrast this with Patch 4's pagemap version which uses a `bool try_alloc` flag that triggers on the first valid page regardless of index -- that pattern would be more robust here.
**Overall**: The structure of adding `state` and `state_offset` to `struct drm_gpusvm_pages` is clean. The initialization at `drm_gpusvm.c:1456-1457` is correct, and the `dma_iova_sync` call after the mapping loop at `drm_gpusvm.c:1590-1594` is properly placed. The fallback path when `dma_use_iova` returns false is correct.
---
---
Generated by Claude Code Patch Reviewer
next prev parent reply other threads:[~2026-04-11 23:24 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-10 20:59 [PATCH v7 0/5] Use new dma-map IOVA alloc, link, and sync API in GPU SVM and DRM pagemap Matthew Brost
2026-04-10 20:59 ` [PATCH v7 1/5] drm/gpusvm: Use dma-map IOVA alloc, link, and sync API in GPU SVM Matthew Brost
2026-04-11 23:24 ` Claude Code Review Bot [this message]
2026-04-10 20:59 ` [PATCH v7 2/5] drm/pagemap: Drop source_peer_migrates flag and assume true Matthew Brost
2026-04-11 23:24 ` Claude review: " Claude Code Review Bot
2026-04-10 20:59 ` [PATCH v7 3/5] drm/pagemap: Split drm_pagemap_migrate_map_pages into device / system Matthew Brost
2026-04-11 23:24 ` Claude review: " Claude Code Review Bot
2026-04-10 20:59 ` [PATCH v7 4/5] drm/pagemap: Use dma-map IOVA alloc, link, and sync API for DRM pagemap Matthew Brost
2026-04-11 23:24 ` Claude review: " Claude Code Review Bot
2026-04-10 20:59 ` [PATCH v7 5/5] drm/pagemap: Fix drm_pagemap_migrate_unmap_pages kerneldoc Matthew Brost
2026-04-11 23:24 ` Claude review: " Claude Code Review Bot
2026-04-11 23:24 ` Claude review: Use new dma-map IOVA alloc, link, and sync API in GPU SVM and DRM pagemap Claude Code Review Bot
-- strict thread matches above, loose matches on Subject: below --
2026-04-08 20:15 [PATCH v6 0/5] " Matthew Brost
2026-04-08 20:15 ` [PATCH v6 1/5] drm/gpusvm: Use dma-map IOVA alloc, link, and sync API in GPU SVM Matthew Brost
2026-04-12 2:09 ` Claude review: " Claude Code Review Bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=review-patch1-20260410205929.3914474-2-matthew.brost@intel.com \
--to=claude-review@example.com \
--cc=dri-devel-reviews@example.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox