Re: [PATCH v8 2/4] drm/virtgpu api: add blob userptr resource

From: Huang, Honglei

Date: Fri Sep 18 2026 - 12:09:14 EST




On 9/18/2026 8:12 PM, Akihiko Odaki wrote:
On 2026/09/18 18:59, Honglei Huang wrote:
Add a userptr address field so userspace can request a blob backed
by an existing process mapping. A non-zero userptr selects that
path; probe VIRTGPU_PARAM_USERPTR before using the field.

GPU-readonly backing is requested with the virtio CREATE_BLOB wire
flag VIRTIO_GPU_BLOB_FLAG_USE_READONLY (also
VIRTGPU_BLOB_FLAG_USE_READONLY). The device MUST NOT write such a
resource. The guest pins without FOLL_WRITE only when the device
advertised VIRTIO_GPU_F_BLOB_READONLY (VIRTGPU_PARAM_BLOB_READONLY).

Signed-off-by: Honglei Huang <honghuan@xxxxxxx>
---
  include/uapi/drm/virtgpu_drm.h  | 13 +++++++++++++
  include/uapi/linux/virtio_gpu.h |  6 ++++++
  2 files changed, 19 insertions(+)

diff --git a/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/ virtgpu_drm.h
index 95587e12ae..80f73b3276 100644
--- a/include/uapi/drm/virtgpu_drm.h
+++ b/include/uapi/drm/virtgpu_drm.h
@@ -99,6 +99,8 @@ struct drm_virtgpu_execbuffer {
  #define VIRTGPU_PARAM_SUPPORTED_CAPSET_IDs 7 /* Bitmask of supported capability set ids */
  #define VIRTGPU_PARAM_EXPLICIT_DEBUG_NAME 8 /* Ability to set debug name from userspace */
  #define VIRTGPU_PARAM_BLOB_ALIGNMENT 9 /* Device alignment requirements for blobs */
+#define VIRTGPU_PARAM_USERPTR 10 /* CREATE_BLOB userptr field is supported */
+#define VIRTGPU_PARAM_BLOB_READONLY 11 /* VIRTGPU_BLOB_FLAG_USE_READONLY is honored */
  struct drm_virtgpu_getparam {
      __u64 param;
@@ -186,6 +188,10 @@ struct drm_virtgpu_resource_create_blob {
  #define VIRTGPU_BLOB_FLAG_USE_MAPPABLE     0x0001
  #define VIRTGPU_BLOB_FLAG_USE_SHAREABLE    0x0002
  #define VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004
+/* Wire flag: device MUST NOT write. Guest pins without FOLL_WRITE.
+ * Rejected unless VIRTGPU_PARAM_BLOB_READONLY is 1.
+ */

According to Documentation/process/coding-style.rst, the preferred style for long (multi-line) comments is:

    /*
     * This is the preferred style for multi-line
     * comments in the Linux kernel source code.
     * Please use it consistently.
     *
     * Description:  A column of asterisks on the left side,
     * with beginning and ending almost-blank lines.
     */

So please avoid putting text on the same line as the opening /*.

Furthermore, because this is a UAPI header (defining the interface between userspace and the kernel, rather than the guest and the host), it should use terminology appropriate for userspace. Kernel-internal implementation details like FOLL_WRITE and terms like "guest" shouldn't be mentioned here.

That being said, I don't think this comment is necessary in the first place. Anyone who needs to know the exact behavior will look at the virtio specification. I recommend just dropping the comment entirely.


Thanks for the review, will remove this comment here.

+#define VIRTGPU_BLOB_FLAG_USE_READONLY     0x0008
      /* zero is invalid blob_mem */
      __u32 blob_mem;
      __u32 blob_flags;
@@ -205,6 +211,13 @@ struct drm_virtgpu_resource_create_blob {
  #define DRM_VIRTGPU_BLOB_FLAG_HINT_DEFER_MAPPING        0x0001
      __u32 blob_hints;
      __u32 pad2;
+
+    /*
+     * Guest VA to pin as blob backing. Non-zero selects the userptr
+     * path and is valid only with VIRTGPU_BLOB_MEM_GUEST. Must be 0
+     * otherwise. Probe VIRTGPU_PARAM_USERPTR before using this field.
+     */

This comment is useful since it discusses UAPI specifics. However, please avoid the term "Guest VA". Since guest userspace has no concept of a "host" or "PA" (physical address), simply saying "address" is sufficient and more concise.

Got it, will modify the comment in next version.

Regards,
Honglei


Regards,
Akihiko Odaki

+    __u64 userptr;
  };
  #define VIRTGPU_CONTEXT_PARAM_CAPSET_ID       0x0001
diff --git a/include/uapi/linux/virtio_gpu.h b/include/uapi/linux/ virtio_gpu.h
index 3d4dfadc9d..33f5332e59 100644
--- a/include/uapi/linux/virtio_gpu.h
+++ b/include/uapi/linux/virtio_gpu.h
@@ -72,6 +72,10 @@
   * must be aligned to that value.
   */
  #define VIRTIO_GPU_F_BLOB_ALIGNMENT      5
+/*
+ * VIRTIO_GPU_BLOB_FLAG_USE_READONLY
+ */
+#define VIRTIO_GPU_F_BLOB_READONLY       6
  enum virtio_gpu_ctrl_type {
      VIRTIO_GPU_UNDEFINED = 0,
@@ -415,6 +419,8 @@ struct virtio_gpu_resource_create_blob {
  #define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE     0x0001
  #define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE    0x0002
  #define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004
+/* Device MUST NOT write. Driver may pin read-only guest pages. */
+#define VIRTIO_GPU_BLOB_FLAG_USE_READONLY     0x0008
      /* zero is invalid blob mem */
      __le32 blob_mem;
      __le32 blob_flags;