Received: by 2002:ac0:8845:0:0:0:0:0 with SMTP id g63csp1342179img; Tue, 26 Feb 2019 19:55:46 -0800 (PST) X-Google-Smtp-Source: AHgI3IZtlIby797HUr3AU/dYMj1GG0gffKzpc+jk5WoTCg0/AZQAxQti8TxTQFgV9a7CJrWuiFf9 X-Received: by 2002:a65:63c2:: with SMTP id n2mr916090pgv.439.1551239745981; Tue, 26 Feb 2019 19:55:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551239745; cv=none; d=google.com; s=arc-20160816; b=D6GhELy9ZoUzBdXlswDtfrlWeA/6EU28oHSVfAsvNrYldMpwn4PgouoyjZN9aMViLs DRU1z/NMmYUtAqf/+pXFEiW2RetmnMWmN/PjJ3nDzCaDQnxBb+bcnWRTGmUBKdDAxZhG /SSeC0bc/sJT0qmlFc5/rvGjs3TT8zdRsV1gpKlgaLAi92MkSb6yNdjr7Gvsurz4ZDYB IGP+2RPnwBZWSoLmJ8RFsUaFHv38xqES3oOIVJSIGt9WoqQTs7xSNxqlCbEvbMhLiTWY BJJR8JJAlNie4+iT3vej91o/i1MclEA4YkdnXPbm28CXCFh5MHsTPkePewiud1s2qO93 tfTw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=OeEbxgdEvD7vVmHTXrOO/jaZroEBj9Mfsqoiz7bsGqk=; b=Y+jT/ujjaGh4zcVSzptzKdt6BOxd2YQOwOEc4b8Abmws8FGU1uByhwjfq5VTdikSKC T8ETrVxFrOOTB0puR4vMnTScy63iHfNyQOpOULrQPjtDMVW01zGTw2MS/ZdmtH262L7n TpEAPNwrDfBDd8FZlINrt2weJw3fhD6kIzg8VO+as55qLpGpPSfRIY48lx1XZQ8SfLZH qtZeBXLbDIZRZouahUXzK15atF2V7qbnpEHYCzX1KMaU+K0wPqyR1CyTYVkLJPL+LHyT dSeGRzUzBQKkBn12On/OMmZt38AiZWUqm9hkBfurzEBS6q0j/qQ/ATcBAKwwhje/8FH7 U2Tg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="o/Owk6qk"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u17si1758984pfm.82.2019.02.26.19.55.31; Tue, 26 Feb 2019 19:55:45 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="o/Owk6qk"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729734AbfB0DzF (ORCPT + 99 others); Tue, 26 Feb 2019 22:55:05 -0500 Received: from mail-pl1-f202.google.com ([209.85.214.202]:52107 "EHLO mail-pl1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729662AbfB0DzC (ORCPT ); Tue, 26 Feb 2019 22:55:02 -0500 Received: by mail-pl1-f202.google.com with SMTP id f10so11429610plr.18 for ; Tue, 26 Feb 2019 19:55:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=OeEbxgdEvD7vVmHTXrOO/jaZroEBj9Mfsqoiz7bsGqk=; b=o/Owk6qki0EHKuavI3s2QYe8Si20yn7yvy0fW7oYtTT16BFT6Ez+CxIngEz/GgBC+5 vfp2xvA6b8jy6gAvR1YAHrv2XZIRnptxj9FSgzM8SzMvy+2CnRwG5xLVnjgjqpNHRZqu UyTSA4AmMUFHsmSKY4GR6T1MhcjZRGk/f5r6h9RJDo0ag/OLdxPKmhJkFDSDtcbfdZIu EmIBTdJjel2nHHbEHp7lKLPqSaRUOBJ2rgjtIV6ArB+t1nVso2AOdCeQ8adD3HRMsJ9o teXVa5eA4TpZv5dhOq88B2ZkhGAin6Dw/M967yOlS0njb3u+w3rozr9JPm1Op2+LiXJW JqWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=OeEbxgdEvD7vVmHTXrOO/jaZroEBj9Mfsqoiz7bsGqk=; b=L7JB4pEBCGWTENOMrp5drOCK8ab5BlP4a5Vm73L8EwZpI2pTrOIl8dnAbEO0StRcNL Hq3Qd8abugBYpgRNhUaUGQhrgoFuyPe1Gfg7jk3As6a8Kvum86tx9b0/tkyhg1WF4aGm kW0J3FF8r0VuhUCSa2zI7Zkd8VU0EJn4B+8sKVJgdth/yGJ6c271ngSkfV4mIhI481iH c89E2kfMdhSmfYxsioo9H143Q4k2TGChQexYgNVoQfVW7tGfinaVX11HaUWNp23COPM8 eX3yyj1HNoDycte1CPxPC5NH3Am/myCc851GzfMXCWVSyy41A21pv9L9uIzGWMb7jmEJ 5cqQ== X-Gm-Message-State: AHQUAuYIbN5BcvFza7Hy1uwHM0FIbCuqSAFeKqXdd6CrEN0/sKaRGGQy vYvcAfegtE2RFmtlHNqeynjIHOzrV/XibpK05a1kDvhCYePS7/PuzgE1hGYxTQIFjkrnQArvsOk v0IRlcjfLjpGyGORBq/va+Jq5YTVcZhhYMyq4En6oCtDt8OehEtAekvGNRofukb8vsgE= X-Received: by 2002:a62:6b06:: with SMTP id g6mr9965004pfc.76.1551239701364; Tue, 26 Feb 2019 19:55:01 -0800 (PST) Date: Tue, 26 Feb 2019 19:54:47 -0800 In-Reply-To: <20190227035448.117169-1-fengc@google.com> Message-Id: <20190227035448.117169-3-fengc@google.com> Mime-Version: 1.0 References: <20190227035448.117169-1-fengc@google.com> X-Mailer: git-send-email 2.21.0.rc2.261.ga7da99ff1b-goog Subject: [RFC dma-buf 2/3] dma-buf: add DMA_BUF_{GET,SET}_NAME ioctls From: Chenbo Feng To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org Cc: Sumit Semwal , erickreyes@google.com, Greg Hackmann , Chenbo Feng Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Greg Hackmann This patch adds complimentary DMA_BUF_SET_NAME and DMA_BUF_GET_NAME ioctls, which lets userspace processes attach a free-form name to each buffer. This information can be extremely helpful for tracking and accounting shared buffers. For example, on Android, we know what each buffer will be used for at allocation time: GL, multimedia, camera, etc. The userspace allocator can use DMA_BUF_SET_NAME to associate that information with the buffer, so we can later give developers a breakdown of how much memory they're allocating for graphics, camera, etc. Signed-off-by: Greg Hackmann Signed-off-by: Chenbo Feng --- drivers/dma-buf/dma-buf.c | 42 ++++++++++++++++++++++++++++++++++-- include/linux/dma-buf.h | 5 ++++- include/uapi/linux/dma-buf.h | 4 ++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index d72352356ac5..e0d9cdd3520b 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -297,6 +297,36 @@ static __poll_t dma_buf_poll(struct file *file, poll_table *poll) return events; } +static long dma_buf_set_name(struct dma_buf *dmabuf, const char __user *buf) +{ + char *name = strndup_user(buf, DMA_BUF_NAME_LEN); + + if (IS_ERR(name)) + return PTR_ERR(name); + + mutex_lock(&dmabuf->lock); + kfree(dmabuf->name); + dmabuf->name = name; + mutex_unlock(&dmabuf->lock); + + return 0; +} + +static long dma_buf_get_name(struct dma_buf *dmabuf, char __user *buf) +{ + const char *name = ""; + long ret = 0; + + mutex_lock(&dmabuf->lock); + if (dmabuf->name) + name = dmabuf->name; + if (copy_to_user(buf, name, strlen(name) + 1)) + ret = -EFAULT; + mutex_unlock(&dmabuf->lock); + + return ret; +} + static long dma_buf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { @@ -335,6 +365,13 @@ static long dma_buf_ioctl(struct file *file, ret = dma_buf_begin_cpu_access(dmabuf, direction); return ret; + + case DMA_BUF_SET_NAME: + return dma_buf_set_name(dmabuf, (const char __user *)arg); + + case DMA_BUF_GET_NAME: + return dma_buf_get_name(dmabuf, (char __user *)arg); + default: return -ENOTTY; } @@ -1083,12 +1120,13 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused) continue; } - seq_printf(s, "%08zu\t%08x\t%08x\t%08ld\t%s\t%08lu\n", + seq_printf(s, "%08zu\t%08x\t%08x\t%08ld\t%s\t%08lu\t%s\n", buf_obj->size, buf_obj->file->f_flags, buf_obj->file->f_mode, file_count(buf_obj->file), buf_obj->exp_name, - file_inode(buf_obj->file)->i_ino); + file_inode(buf_obj->file)->i_ino, + buf_obj->name ?: ""); robj = buf_obj->resv; while (true) { diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index 58725f890b5b..582998e19df6 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h @@ -255,10 +255,12 @@ struct dma_buf_ops { * @file: file pointer used for sharing buffers across, and for refcounting. * @attachments: list of dma_buf_attachment that denotes all devices attached. * @ops: dma_buf_ops associated with this buffer object. - * @lock: used internally to serialize list manipulation, attach/detach and vmap/unmap + * @lock: used internally to serialize list manipulation, attach/detach and + * vmap/unmap, and accesses to name * @vmapping_counter: used internally to refcnt the vmaps * @vmap_ptr: the current vmap ptr if vmapping_counter > 0 * @exp_name: name of the exporter; useful for debugging. + * @name: userspace-provided name; useful for accounting and debugging. * @owner: pointer to exporter module; used for refcounting when exporter is a * kernel module. * @list_node: node for dma_buf accounting and debugging. @@ -286,6 +288,7 @@ struct dma_buf { unsigned vmapping_counter; void *vmap_ptr; const char *exp_name; + const char *name; struct module *owner; struct list_head list_node; void *priv; diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h index d75df5210a4a..4e9c5fe7aecd 100644 --- a/include/uapi/linux/dma-buf.h +++ b/include/uapi/linux/dma-buf.h @@ -35,7 +35,11 @@ struct dma_buf_sync { #define DMA_BUF_SYNC_VALID_FLAGS_MASK \ (DMA_BUF_SYNC_RW | DMA_BUF_SYNC_END) +#define DMA_BUF_NAME_LEN 32 + #define DMA_BUF_BASE 'b' #define DMA_BUF_IOCTL_SYNC _IOW(DMA_BUF_BASE, 0, struct dma_buf_sync) +#define DMA_BUF_SET_NAME _IOW(DMA_BUF_BASE, 1, const char *) +#define DMA_BUF_GET_NAME _IOR(DMA_BUF_BASE, 2, char *) #endif -- 2.21.0.rc2.261.ga7da99ff1b-goog