From 7f7629cc680bf3c22d547fb5333e521af58c6c9e Mon Sep 17 00:00:00 2001 From: Ryo Hashimoto Date: Wed, 11 Dec 2019 18:32:03 +0900 Subject: [PATCH] CHROMIUM: virtwl: Support multiple host sockets Add a new argument to VIRTWL_IOCTL_NEW_CTX. This CL doesn't change the size of structs. Guest can use this parameter to create a context connected to a host process other than the compositor. BUG=b:146100044, b:140202859 TEST=Camera works Change-Id: I1c6b1a256002a336774a36caf0fe8d18f08c0f56 Signed-off-by: Ryo Hashimoto Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/1962108 Reviewed-by: Dmitry Torokhov Reviewed-by: Zach Reizner (cherry picked from commit 5d641a7b7b64664230d2fd2aa1e74dd792b8b7bf) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/2035921 Tested-by: Chirantan Ekbote Commit-Queue: Chirantan Ekbote Auto-Submit: Chirantan Ekbote Signed-off-by: Alyssa Ross --- drivers/virtio/virtio_wl.c | 6 ++++++ include/uapi/linux/virtio_wl.h | 29 +++++++++++++++++------------ include/uapi/linux/virtwl.h | 3 +++ 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/drivers/virtio/virtio_wl.c b/drivers/virtio/virtio_wl.c index 1b3f8926519a7..80cf799bed464 100644 --- a/drivers/virtio/virtio_wl.c +++ b/drivers/virtio/virtio_wl.c @@ -1024,6 +1024,7 @@ static struct virtwl_vfd *do_new(struct virtwl_info *vi, int ret = 0; if (ioctl_new->type != VIRTWL_IOCTL_NEW_CTX && + ioctl_new->type != VIRTWL_IOCTL_NEW_CTX_NAMED && ioctl_new->type != VIRTWL_IOCTL_NEW_ALLOC && ioctl_new->type != VIRTWL_IOCTL_NEW_PIPE_READ && ioctl_new->type != VIRTWL_IOCTL_NEW_PIPE_WRITE && @@ -1060,6 +1061,11 @@ static struct virtwl_vfd *do_new(struct virtwl_info *vi, ctrl_new->hdr.type = VIRTIO_WL_CMD_VFD_NEW_CTX; ctrl_new->flags = VIRTIO_WL_VFD_WRITE | VIRTIO_WL_VFD_READ; break; + case VIRTWL_IOCTL_NEW_CTX_NAMED: + ctrl_new->hdr.type = VIRTIO_WL_CMD_VFD_NEW_CTX_NAMED; + ctrl_new->flags = VIRTIO_WL_VFD_WRITE | VIRTIO_WL_VFD_READ; + memcpy(ctrl_new->name, ioctl_new->name, sizeof(ctrl_new->name)); + break; case VIRTWL_IOCTL_NEW_ALLOC: ctrl_new->hdr.type = VIRTIO_WL_CMD_VFD_NEW; ctrl_new->size = PAGE_ALIGN(ioctl_new->size); diff --git a/include/uapi/linux/virtio_wl.h b/include/uapi/linux/virtio_wl.h index 1d3ec6b31d4d3..ad9b6dfcd3263 100644 --- a/include/uapi/linux/virtio_wl.h +++ b/include/uapi/linux/virtio_wl.h @@ -37,6 +37,7 @@ enum virtio_wl_ctrl_type { VIRTIO_WL_CMD_VFD_NEW_DMABUF, /* virtio_wl_ctrl_vfd_new */ VIRTIO_WL_CMD_VFD_DMABUF_SYNC, /* virtio_wl_ctrl_vfd_dmabuf_sync */ VIRTIO_WL_CMD_VFD_SEND_FOREIGN_ID, /* virtio_wl_ctrl_vfd_send + data */ + VIRTIO_WL_CMD_VFD_NEW_CTX_NAMED, /* virtio_wl_ctrl_vfd_new */ VIRTIO_WL_RESP_OK = 0x1000, VIRTIO_WL_RESP_VFD_NEW = 0x1001, /* virtio_wl_ctrl_vfd_new */ @@ -78,18 +79,22 @@ struct virtio_wl_ctrl_vfd_new { __le32 flags; /* virtio_wl_vfd_flags */ __le64 pfn; /* first guest physical page frame number if VFD_MAP */ __le32 size; /* size in bytes if VIRTIO_WL_CMD_VFD_NEW* */ - /* buffer description if VIRTIO_WL_CMD_VFD_NEW_DMABUF */ - struct { - __le32 width; /* width in pixels */ - __le32 height; /* height in pixels */ - __le32 format; /* fourcc format */ - __le32 stride0; /* return stride0 */ - __le32 stride1; /* return stride1 */ - __le32 stride2; /* return stride2 */ - __le32 offset0; /* return offset0 */ - __le32 offset1; /* return offset1 */ - __le32 offset2; /* return offset2 */ - } dmabuf; + union { + /* buffer description if VIRTIO_WL_CMD_VFD_NEW_DMABUF */ + struct { + __le32 width; /* width in pixels */ + __le32 height; /* height in pixels */ + __le32 format; /* fourcc format */ + __le32 stride0; /* return stride0 */ + __le32 stride1; /* return stride1 */ + __le32 stride2; /* return stride2 */ + __le32 offset0; /* return offset0 */ + __le32 offset1; /* return offset1 */ + __le32 offset2; /* return offset2 */ + } dmabuf; + /* name of socket if VIRTIO_WL_CMD_VFD_NEW_CTX_NAMED */ + char name[32]; + }; }; diff --git a/include/uapi/linux/virtwl.h b/include/uapi/linux/virtwl.h index 939041389b403..baa9b341377a5 100644 --- a/include/uapi/linux/virtwl.h +++ b/include/uapi/linux/virtwl.h @@ -21,6 +21,7 @@ enum virtwl_ioctl_new_type { VIRTWL_IOCTL_NEW_PIPE_WRITE, /* create a new virtwl dmabuf that is writable via the returned fd */ VIRTWL_IOCTL_NEW_DMABUF, + VIRTWL_IOCTL_NEW_CTX_NAMED, /* open a new named connection context */ }; struct virtwl_ioctl_new { @@ -42,6 +43,8 @@ struct virtwl_ioctl_new { __u32 offset1; /* return offset1 */ __u32 offset2; /* return offset2 */ } dmabuf; + /* name of socket if type == VIRTIO_WL_CMD_VFD_NEW_CTX_NAMED */ + char name[32]; }; }; -- 2.26.2