Message ID | 20211113062222.3743909-1-jay.xu@rock-chips.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | dma-buf: add DMA_BUF_IOCTL_SYNC_PARTIAL support | expand |
Am 13.11.21 um 07:22 schrieb Jianqun Xu: > Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with > offset and len. You have not given an use case for this so it is a bit hard to review. And from the existing use cases I don't see why this should be necessary. Even worse from the existing backend implementation I don't even see how drivers should be able to fulfill this semantics. Please explain further, Christian. > > Change-Id: I03d2d2e10e48d32aa83c31abade57e0931e1be49 > Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> > --- > drivers/dma-buf/dma-buf.c | 42 ++++++++++++++++++++++++++++++++++++ > include/uapi/linux/dma-buf.h | 8 +++++++ > 2 files changed, 50 insertions(+) > > diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c > index d9948d58b3f4..78f37f7c3462 100644 > --- a/drivers/dma-buf/dma-buf.c > +++ b/drivers/dma-buf/dma-buf.c > @@ -392,6 +392,7 @@ static long dma_buf_ioctl(struct file *file, > { > struct dma_buf *dmabuf; > struct dma_buf_sync sync; > + struct dma_buf_sync_partial sync_p; > enum dma_data_direction direction; > int ret; > > @@ -430,6 +431,47 @@ static long dma_buf_ioctl(struct file *file, > case DMA_BUF_SET_NAME_B: > return dma_buf_set_name(dmabuf, (const char __user *)arg); > > + case DMA_BUF_IOCTL_SYNC_PARTIAL: > + if (copy_from_user(&sync_p, (void __user *) arg, sizeof(sync_p))) > + return -EFAULT; > + > + if (sync_p.len == 0) > + return 0; > + > + if ((sync_p.offset % cache_line_size()) || (sync_p.len % cache_line_size())) > + return -EINVAL; > + > + if (sync_p.len > dmabuf->size || sync_p.offset > dmabuf->size - sync_p.len) > + return -EINVAL; > + > + if (sync_p.flags & ~DMA_BUF_SYNC_VALID_FLAGS_MASK) > + return -EINVAL; > + > + switch (sync_p.flags & DMA_BUF_SYNC_RW) { > + case DMA_BUF_SYNC_READ: > + direction = DMA_FROM_DEVICE; > + break; > + case DMA_BUF_SYNC_WRITE: > + direction = DMA_TO_DEVICE; > + break; > + case DMA_BUF_SYNC_RW: > + direction = DMA_BIDIRECTIONAL; > + break; > + default: > + return -EINVAL; > + } > + > + if (sync_p.flags & DMA_BUF_SYNC_END) > + ret = dma_buf_end_cpu_access_partial(dmabuf, direction, > + sync_p.offset, > + sync_p.len); > + else > + ret = dma_buf_begin_cpu_access_partial(dmabuf, direction, > + sync_p.offset, > + sync_p.len); > + > + return ret; > + > default: > return -ENOTTY; > } > diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h > index 7f30393b92c3..6236c644624d 100644 > --- a/include/uapi/linux/dma-buf.h > +++ b/include/uapi/linux/dma-buf.h > @@ -47,4 +47,12 @@ struct dma_buf_sync { > #define DMA_BUF_SET_NAME_A _IOW(DMA_BUF_BASE, 1, u32) > #define DMA_BUF_SET_NAME_B _IOW(DMA_BUF_BASE, 1, u64) > > +struct dma_buf_sync_partial { > + __u64 flags; > + __u32 offset; > + __u32 len; > +}; > + > +#define DMA_BUF_IOCTL_SYNC_PARTIAL _IOW(DMA_BUF_BASE, 2, struct dma_buf_sync_partial) > + > #endif
在 2021/11/15 19:42, Christian König 写道: > Am 13.11.21 um 07:22 schrieb Jianqun Xu: >> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >> offset and len. > > You have not given an use case for this so it is a bit hard to review. > And from the existing use cases I don't see why this should be necessary. > > Even worse from the existing backend implementation I don't even see > how drivers should be able to fulfill this semantics. > > Please explain further, > Christian. > >> >> Change-Id: I03d2d2e10e48d32aa83c31abade57e0931e1be49 >> Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> >> --- >> drivers/dma-buf/dma-buf.c | 42 ++++++++++++++++++++++++++++++++++++ >> include/uapi/linux/dma-buf.h | 8 +++++++ >> 2 files changed, 50 insertions(+) >> >> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c >> index d9948d58b3f4..78f37f7c3462 100644 >> --- a/drivers/dma-buf/dma-buf.c >> +++ b/drivers/dma-buf/dma-buf.c >> @@ -392,6 +392,7 @@ static long dma_buf_ioctl(struct file *file, >> { >> struct dma_buf *dmabuf; >> struct dma_buf_sync sync; >> + struct dma_buf_sync_partial sync_p; >> enum dma_data_direction direction; >> int ret; >> @@ -430,6 +431,47 @@ static long dma_buf_ioctl(struct file *file, >> case DMA_BUF_SET_NAME_B: >> return dma_buf_set_name(dmabuf, (const char __user *)arg); >> + case DMA_BUF_IOCTL_SYNC_PARTIAL: >> + if (copy_from_user(&sync_p, (void __user *) arg, >> sizeof(sync_p))) >> + return -EFAULT; >> + >> + if (sync_p.len == 0) >> + return 0; >> + >> + if ((sync_p.offset % cache_line_size()) || (sync_p.len % >> cache_line_size())) >> + return -EINVAL; >> + >> + if (sync_p.len > dmabuf->size || sync_p.offset > >> dmabuf->size - sync_p.len) >> + return -EINVAL; >> + >> + if (sync_p.flags & ~DMA_BUF_SYNC_VALID_FLAGS_MASK) >> + return -EINVAL; >> + >> + switch (sync_p.flags & DMA_BUF_SYNC_RW) { >> + case DMA_BUF_SYNC_READ: >> + direction = DMA_FROM_DEVICE; >> + break; >> + case DMA_BUF_SYNC_WRITE: >> + direction = DMA_TO_DEVICE; >> + break; >> + case DMA_BUF_SYNC_RW: >> + direction = DMA_BIDIRECTIONAL; >> + break; >> + default: >> + return -EINVAL; >> + } >> + >> + if (sync_p.flags & DMA_BUF_SYNC_END) >> + ret = dma_buf_end_cpu_access_partial(dmabuf, direction, >> + sync_p.offset, >> + sync_p.len); >> + else >> + ret = dma_buf_begin_cpu_access_partial(dmabuf, direction, >> + sync_p.offset, >> + sync_p.len); >> + >> + return ret; >> + >> default: >> return -ENOTTY; >> } >> diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h >> index 7f30393b92c3..6236c644624d 100644 >> --- a/include/uapi/linux/dma-buf.h >> +++ b/include/uapi/linux/dma-buf.h >> @@ -47,4 +47,12 @@ struct dma_buf_sync { >> #define DMA_BUF_SET_NAME_A _IOW(DMA_BUF_BASE, 1, u32) >> #define DMA_BUF_SET_NAME_B _IOW(DMA_BUF_BASE, 1, u64) >> +struct dma_buf_sync_partial { >> + __u64 flags; >> + __u32 offset; >> + __u32 len; >> +}; >> + >> +#define DMA_BUF_IOCTL_SYNC_PARTIAL _IOW(DMA_BUF_BASE, 2, struct >> dma_buf_sync_partial) >> + >> #endif > > > From mboxrd@z Thu Jan 1 00:00:00 1970 > Return-Path: > <SRS0=2xhc=QC=lists.freedesktop.org=dri-devel-bounces@kernel.org> > X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on > aws-us-west-2-korg-lkml-1.web.codeaurora.org > Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) > by smtp.lore.kernel.org (Postfix) with ESMTP id C34E8C433EF > for <dri-devel@archiver.kernel.org>; Mon, 15 Nov 2021 11:42:25 > +0000 (UTC) > Received: from gabe.freedesktop.org (gabe.freedesktop.org > [131.252.210.177]) > (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 > bits)) > (No client certificate requested) > by mail.kernel.org (Postfix) with ESMTPS id 802C761AA2 > for <dri-devel@archiver.kernel.org>; Mon, 15 Nov 2021 11:42:25 > +0000 (UTC) > DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 802C761AA2 > Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine > dis=none) header.from=amd.com > Authentication-Results: mail.kernel.org; spf=none > smtp.mailfrom=lists.freedesktop.org > Received: from gabe.freedesktop.org (localhost [127.0.0.1]) > by gabe.freedesktop.org (Postfix) with ESMTP id 10E466E943; > Mon, 15 Nov 2021 11:42:25 +0000 (UTC) > Received: from NAM10-BN7-obe.outbound.protection.outlook.com > (mail-bn7nam10on2068.outbound.protection.outlook.com [40.107.92.68]) > by gabe.freedesktop.org (Postfix) with ESMTPS id D422E6E943 > for <dri-devel@lists.freedesktop.org>; Mon, 15 Nov 2021 11:42:23 +0000 > (UTC) > ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; > b=ZYSFfhU+N5Fq39gpw5NCsolRnyvMmfKTA5cWgJx3l903N5tP6BK6x7pUqmtcQZvyCwwzQwonnQGCZqIx/M4qourfwzBBS0SVUSHvvU6Vn4nZRrd/wffjMaX24XwtUxIdQAQntPFWRi0SjIWpG+72E2TIxwcuyY3/5+qkQiF8s3iNnNXmY4zdZ9fx48I5MHFePTx+VAyZvxzedsyfjjAxGaaaPl2uZagHTH9TDFFaAg/rHvH6O2vq0RwQIaMOGxhA8DgCmsj9dMlSloko0iLt+p2s/WUQShbSQrZq13R3POIyU6aCBx32Zz+biTbwpcXQyXxwfQIi+2nIruJQvuvwSw== > > ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; > d=microsoft.com; s=arcselector9901; > h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; > > bh=JkRdepoBhhvZgBl9zd4oG1PeOv+kPWSxKw1ORztFSv4=; > b=hYGlnailNdl4CzgRcFMK/ZTAFR1Ipev9djYIyqc4j32m6sMsqyx1YxjcAPDo6Rnk3qtB+9sMag1rldkddxzJCBGDOLkgX7hQFl7AFRIQhpXLQsUek5IrCfbd0rGW4HpdbUxyGyRz70XnjFPSTGQFhlz7glYKDPeyHN/X3RtVBfrUG1ywFsVzjD6+I8Uc0O9jbG6Rw5S1/dydWeyovBOPcbUVYt1ZF0z7JDt4Tj90hAElD4cTmc/rfAt3eY3pB6pydnGu+nXJ5bKZIY/U7Wec+TwdXPNGU+ia5E4MN6xuL+kVLPNPa1G6h8qetsVTw5UYOkGtPZCxcR6pUKs0ocJTZg== > > ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass > smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; > dkim=pass > header.d=amd.com; arc=none > DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; > s=selector1; > h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; > bh=JkRdepoBhhvZgBl9zd4oG1PeOv+kPWSxKw1ORztFSv4=; > b=4zNaX2CfJHDxjaHlT7C84/jyXuQUhJVYoDhuLfWp/MO0v73QSPzoDc9EiD6G3taNwfNkwRBOMm5VIiF2wOMmVeJmV2JabQp0VPjTYkXDZL9xbtuoXkdCtQFx1+Fz1GJhOnpgaIMZrSQ+DugqAkbmKW5Jp6o8P3GT/ZDzIFBk4xk= > > Authentication-Results: dkim=none (message not signed) > header.d=none;dmarc=none action=none header.from=amd.com; > Received: from MWHPR1201MB0192.namprd12.prod.outlook.com > (2603:10b6:301:5a::14) by MWHPR12MB1837.namprd12.prod.outlook.com > (2603:10b6:300:113::20) with Microsoft SMTP Server (version=TLS1_2, > cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.27; Mon, > 15 Nov > 2021 11:42:20 +0000 > Received: from MWHPR1201MB0192.namprd12.prod.outlook.com > ([fe80::2d02:26e7:a2d0:3769]) by > MWHPR1201MB0192.namprd12.prod.outlook.com > ([fe80::2d02:26e7:a2d0:3769%5]) with mapi id 15.20.4690.027; Mon, 15 > Nov 2021 > 11:42:20 +0000 > Subject: Re: [PATCH] dma-buf: add DMA_BUF_IOCTL_SYNC_PARTIAL support > To: Jianqun Xu <jay.xu@rock-chips.com>, sumit.semwal@linaro.org > References: <20211113062222.3743909-1-jay.xu@rock-chips.com> > From: =?UTF-8?Q?Christian_K=c3=b6nig?= <christian.koenig@amd.com> > Message-ID: <1da5cdf0-ccb8-3740-cf96-794c4d5b2eb4@amd.com> > Date: Mon, 15 Nov 2021 12:42:13 +0100 > User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 > Thunderbird/78.13.0 > In-Reply-To: <20211113062222.3743909-1-jay.xu@rock-chips.com> > Content-Type: text/plain; charset=utf-8; format=flowed > Content-Transfer-Encoding: 7bit > Content-Language: en-US > X-ClientProxiedBy: AS9PR0301CA0041.eurprd03.prod.outlook.com > (2603:10a6:20b:469::32) To MWHPR1201MB0192.namprd12.prod.outlook.com > (2603:10b6:301:5a::14) > MIME-Version: 1.0 > Received: from [IPv6:2a02:908:1252:fb60:bf0c:d52c:6ba0:cfc6] > (2a02:908:1252:fb60:bf0c:d52c:6ba0:cfc6) by > AS9PR0301CA0041.eurprd03.prod.outlook.com (2603:10a6:20b:469::32) with > Microsoft SMTP Server (version=TLS1_2, > cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.26 via > Frontend > Transport; Mon, 15 Nov 2021 11:42:17 +0000 > X-MS-PublicTrafficType: Email > X-MS-Office365-Filtering-Correlation-Id: > 00ebe1d3-562c-44d3-ab7c-08d9a82cfb38 > X-MS-TrafficTypeDiagnostic: MWHPR12MB1837: > X-Microsoft-Antispam-PRVS: > <MWHPR12MB18370021933B2E90497B3E8C83989@MWHPR12MB1837.namprd12.prod.outlook.com> > X-MS-Oob-TLC-OOBClassifiers: OLM:8273; > X-MS-Exchange-SenderADCheck: 1 > X-MS-Exchange-AntiSpam-Relay: 0 > X-Microsoft-Antispam: BCL:0; > X-Microsoft-Antispam-Message-Info: > qnNpT+UDEdrvmTrphgUzQsrIExW/nJQjCEAt6/leQnM/+F75uQ4P/gIEmE2mfi+FLGZoBp+qpesYv6TE414JsgHBjmPsq9wqAxODHs5+tKntVesYVzi2T3a+bor5SPTdHrjOyz4Lv5il0Z00hyIMOsC898lxdXNK3DY8ClRa/X+z05ZLWWI9kbXDjVdrVqmD31Ciy9En6YG1TKIV+epuDLGRKEvYe8NhgoFs6tUkQ/bWmTBdRJgllNrqms9k2nXdSN5hRpvEjPb3R0jF3kat4c9/g+R9ZfNDU0z3Qo2VAfydWQzqA1BIV1A7EDnRTXmW5vnAV79Migw7l8P0CqzM1nBlO5bCjKtHXPj4OXseQUwQWFO5216Sj4yR6FeIQFVrAO7lW3pd3S4bncIRU17nSaQPkQnnNSdXm0OBFoDdrVzhxYO5g7CoHdrAh0S0Y4Q8vQFqy36ujVGByHPPFfX+aaKXQ/BWnlM6tghXuVYUcoYtqlV4AJpRnByfYBQrumA1ouTLedvwpUsQlCItufU36509QJHuQ9oa3NDqXos2SPnUS/F/6HsBJHw63Rq1Jcd0WGmqDrp9wFQaK959C6zotCP8LC+p2pB0gQYgRieAeifspuQuKmSFk46/7OZfmlwmv8i1rhIK65/inlDat2eDtJBEpqk15UW3bMvw1g5dv5Kr9RmOvFfjfRv5uYDkmxM4OcYG/KHnhd59tAKjoVDXcLgv4Z/rf5i8pgCG0D7SWcZI1XNcdbglDuWiigm3ihyx > X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; > SCL:1; SRV:; > IPV:NLI; SFV:NSPM; H:MWHPR1201MB0192.namprd12.prod.outlook.com; PTR:; > CAT:NONE; > SFS:(4636009)(366004)(316002)(7416002)(2616005)(6486002)(8936002)(8676002)(186003)(31686004)(66556008)(66476007)(86362001)(66946007)(83380400001)(31696002)(6666004)(508600001)(38100700002)(5660300002)(2906002)(4326008)(36756003)(43740500002)(45980500001); > > DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 > X-MS-Exchange-AntiSpam-MessageData-0: > =?utf-8?B?VmtQa3NIa1NhVm40N2lmZnBueGVQS3ZuTWpaWm4waU1IQ3kvYlFHSGI1ZllH?= > =?utf-8?B?ek13MElkY3lWUlVuVWxJUkZPR0tlQ01FV0lCUnJrUWRSejg0WjZJWW5CTFdS?= > =?utf-8?B?TDVMZTVHNitXaW9taUpweTFaL2pJS1NZbGJacnlDWVNyMFl3MjlkdGd3YTEr?= > =?utf-8?B?MmRodnF3dnlzd0NKZEtZN1JaVFA2OTBJRGQ1WjZBUHROK0dhMlhMWWZkaUd3?= > =?utf-8?B?RFlQd3NmNGRWZFZydFhXSVJyRmxQMEZDWlhxU3hMcDYzNUtJRGtHVzZtMmIx?= > =?utf-8?B?NU5zT0VvNmI1MUE1WTRmQWRUZkM4aXFtYVBzK3ovM2E3dGFEQ2ZJZ1B5U2Vv?= > =?utf-8?B?eWVQN0tEZUhFQi93ZG8zdFJaTjcwT2dUc3VzdTgzNzZsaVNuUHFOQjRFN2Nq?= > =?utf-8?B?eGZJamhBMDhBbmhsRjhWUDY3dmFhODJKR0UwVWlFcW42TXR6Q2lRV0ZhQnJW?= > =?utf-8?B?SVAvalMxUVpmSVNzWmxpR3Z1cWtYSTlXTHZOMUY4dExKMFJZcXl2UGZ5S2pZ?= > =?utf-8?B?NVI2K0xOaFQ3QlMyYitGMDRxa2JCVHQrQW40VnpPUkJ4SDN2UjRnU29TeHFU?= > =?utf-8?B?cUVVSjEzLzV1ZFFxcndBbkw0T2Q0MHo3YUtoOThVTlgxcm5odjlqVzBYUkV3?= > =?utf-8?B?RzM1dmllc3pTSFIvS0xaNWVoVDNWVXQ3Q1NJc0NpcjAwWUY1VkR0eEFhZnRX?= > =?utf-8?B?R3gyeEIyMjR3SGVDdDhUaGtmZWRJTnkyeWhuWkpIVVg2RHoxQWtrUEJtNjdv?= > =?utf-8?B?YlNmbzI2ME1hQkcrVVBNQ1pFT1FWZFRZZFhyZE9OWWJzRUlDM29pQUJ0V24y?= > =?utf-8?B?NjRQM2g0a0J4NzJVVGw1MDRqMXFndVBJellQazRvUnFVMHFLRlR2Q3lJMlpq?= > =?utf-8?B?V1F3b1BwZFpUM2xyYUpvR0RTcDJEZ1dGZWdMdDVHYzd2eW5ZYnlwTXlrckpD?= > =?utf-8?B?OTdGU0w1My9SUVRkdmk3L1VaWDJseUc3S2tjdFhEZ3dUeDZ1RVIrK2ZNUDkv?= > =?utf-8?B?aU9NbkZqRFpPQzFvVFpOWHYzd2QxS256OTRKaVQrVlR3c29nNHdwcjVjVklD?= > =?utf-8?B?cVp6dFN0TUpNMDd1SlFzRUx2SjlraVczakM3VmFJdExzVGJ5cXdmSGlKTTVx?= > =?utf-8?B?dHNCaUFjVmRPZkRuVFp1RVhWTFB0L1FtNHI1TEZEcTFsQUFMNjdUMnIxaVZr?= > =?utf-8?B?d09MaXhiSFlrMjhPOGxrcGFLVElSR1pOQkdMdG4wa1k1VktnVVRFTXU0QlJk?= > =?utf-8?B?Z09uemlVVHJxUHNoY3d1UXIrOUxCMU85bHM1TlpYRzZGcHRRcndtbERtdU9s?= > =?utf-8?B?VUZRaVY2Z3N2RnlFbk14L1lER2Jib0JSSVNyZkw3Wk1sVExYaDhnMXRDUkhv?= > =?utf-8?B?Z0FyK0NmMDlEKzcxUTdUY3A5SFJBYUhCOEpIbFNTK3Vic2hxcXR5MWZUcFND?= > =?utf-8?B?bDZlRnl0VkxWajFyeDF4SFpoQzJTbTNPU1U2c1c4TlhscWNQNXhRaWMxTG5G?= > =?utf-8?B?emJtUURBZVlqT3cxR2hRdGFVZUh1akxuRHIwYlRPOWZZSnVKeXFvMCtlNTFT?= > =?utf-8?B?Q3BvMGROdlZ2ZFJUNzYya3hvUVlHYmYzaGlSMHMyK1U0Nis1YksrWFZWc1JH?= > =?utf-8?B?VHFoY0phcnNVdHNJN2Y4Z0lxRzhHRng0SWQ2NmJuZENWUE5uMktmZktpeTY2?= > =?utf-8?B?dU15L0FOWDNobkJkN0x6RkdlY1BQalhSK3p0S2ZsTVpwUnFSN0l6S1RMcXJh?= > =?utf-8?B?bnptcHlHc2VDVm50NW52MkRVK0FpbGpNb3JPektpc1pVM3BibGRhNklaMjVN?= > =?utf-8?B?MTZxNFNOd2lTbDBhSk5XcFk0UTdZbXdsaW5BYm1kRzlGeThJOU4rMWNyL09l?= > =?utf-8?B?N3ZTM1NSeUFraVMvVnJYcWhNRjFPOVZYNUhTRFUyWHo5QVpKZlhia05HQy9S?= > =?utf-8?B?Uit6VG51RCtqWGJsNU4vRGlFVXhJdjh4Y1RhdWhEVVpVTUNpcGdMQUY2L005?= > =?utf-8?B?WG9wejVLbEZjampPYVcxNDMySXNQelVEZEFGQWROZ2h4ZjFNOWR3c084SjFN?= > =?utf-8?B?b2lMbThOZmdXQW84YWg4ekJyQW9mWStyZnMvV1JWd3lMajVEM2hTbFVUczNv?= > =?utf-8?B?QmhyeVpQVVUrOUtyRWNjUXp2a1JhQUpsSnk0ZVlrSDdnaFFYaFVTdHpjM01O?= > =?utf-8?Q?BO9RKUEVN4uMTDc9B3JQWSk=3D?= > X-OriginatorOrg: amd.com > X-MS-Exchange-CrossTenant-Network-Message-Id: > 00ebe1d3-562c-44d3-ab7c-08d9a82cfb38 > X-MS-Exchange-CrossTenant-AuthSource: > MWHPR1201MB0192.namprd12.prod.outlook.com > X-MS-Exchange-CrossTenant-AuthAs: Internal > X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Nov 2021 > 11:42:19.8907 (UTC) > X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted > X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d > X-MS-Exchange-CrossTenant-MailboxType: HOSTED > X-MS-Exchange-CrossTenant-UserPrincipalName: > cPSQhRvD4Dau5vTrINquy4Yo1A5DbJm3yOORz6qQDOx+umrhjPgdp0FqKASMDEeu > X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1837 > X-BeenThere: dri-devel@lists.freedesktop.org > X-Mailman-Version: 2.1.29 > Precedence: list > List-Id: Direct Rendering Infrastructure - Development > <dri-devel.lists.freedesktop.org> > List-Unsubscribe: > <https://lists.freedesktop.org/mailman/options/dri-devel>, > <mailto:dri-devel-request@lists.freedesktop.org?subject=unsubscribe> > List-Archive: <https://lists.freedesktop.org/archives/dri-devel> > List-Post: <mailto:dri-devel@lists.freedesktop.org> > List-Help: <mailto:dri-devel-request@lists.freedesktop.org?subject=help> > List-Subscribe: > <https://lists.freedesktop.org/mailman/listinfo/dri-devel>, > <mailto:dri-devel-request@lists.freedesktop.org?subject=subscribe> > Cc: pekka.paalanen@collabora.com, daniel.vetter@ffwll.ch, > linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, > linaro-mm-sig@lists.linaro.org, linux-rockchip@lists.infradead.org, > jason@jlekstrand.net, linux-media@vger.kernel.org > Errors-To: dri-devel-bounces@lists.freedesktop.org > Sender: "dri-devel" <dri-devel-bounces@lists.freedesktop.org> > > Am 13.11.21 um 07:22 schrieb Jianqun Xu: >> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >> offset and len. > > You have not given an use case for this so it is a bit hard to review. > And from the existing use cases I don't see why this should be necessary. > > Even worse from the existing backend implementation I don't even see > how drivers should be able to fulfill this semantics. > > Please explain further, > Christian. > >> >> Change-Id: I03d2d2e10e48d32aa83c31abade57e0931e1be49 >> Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> >> --- >> drivers/dma-buf/dma-buf.c | 42 ++++++++++++++++++++++++++++++++++++ >> include/uapi/linux/dma-buf.h | 8 +++++++ >> 2 files changed, 50 insertions(+) >> >> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c >> index d9948d58b3f4..78f37f7c3462 100644 >> --- a/drivers/dma-buf/dma-buf.c >> +++ b/drivers/dma-buf/dma-buf.c >> @@ -392,6 +392,7 @@ static long dma_buf_ioctl(struct file *file, >> { >> struct dma_buf *dmabuf; >> struct dma_buf_sync sync; >> + struct dma_buf_sync_partial sync_p; >> enum dma_data_direction direction; >> int ret; >> @@ -430,6 +431,47 @@ static long dma_buf_ioctl(struct file *file, >> case DMA_BUF_SET_NAME_B: >> return dma_buf_set_name(dmabuf, (const char __user *)arg); >> + case DMA_BUF_IOCTL_SYNC_PARTIAL: >> + if (copy_from_user(&sync_p, (void __user *) arg, >> sizeof(sync_p))) >> + return -EFAULT; >> + >> + if (sync_p.len == 0) >> + return 0; >> + >> + if ((sync_p.offset % cache_line_size()) || (sync_p.len % >> cache_line_size())) >> + return -EINVAL; >> + >> + if (sync_p.len > dmabuf->size || sync_p.offset > >> dmabuf->size - sync_p.len) >> + return -EINVAL; >> + >> + if (sync_p.flags & ~DMA_BUF_SYNC_VALID_FLAGS_MASK) >> + return -EINVAL; >> + >> + switch (sync_p.flags & DMA_BUF_SYNC_RW) { >> + case DMA_BUF_SYNC_READ: >> + direction = DMA_FROM_DEVICE; >> + break; >> + case DMA_BUF_SYNC_WRITE: >> + direction = DMA_TO_DEVICE; >> + break; >> + case DMA_BUF_SYNC_RW: >> + direction = DMA_BIDIRECTIONAL; >> + break; >> + default: >> + return -EINVAL; >> + } >> + >> + if (sync_p.flags & DMA_BUF_SYNC_END) >> + ret = dma_buf_end_cpu_access_partial(dmabuf, direction, >> + sync_p.offset, >> + sync_p.len); >> + else >> + ret = dma_buf_begin_cpu_access_partial(dmabuf, direction, >> + sync_p.offset, >> + sync_p.len); >> + >> + return ret; >> + >> default: >> return -ENOTTY; >> } >> diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h >> index 7f30393b92c3..6236c644624d 100644 >> --- a/include/uapi/linux/dma-buf.h >> +++ b/include/uapi/linux/dma-buf.h >> @@ -47,4 +47,12 @@ struct dma_buf_sync { >> #define DMA_BUF_SET_NAME_A _IOW(DMA_BUF_BASE, 1, u32) >> #define DMA_BUF_SET_NAME_B _IOW(DMA_BUF_BASE, 1, u64) >> +struct dma_buf_sync_partial { >> + __u64 flags; >> + __u32 offset; >> + __u32 len; >> +}; >> + >> +#define DMA_BUF_IOCTL_SYNC_PARTIAL _IOW(DMA_BUF_BASE, 2, struct >> dma_buf_sync_partial) >> + >> #endif > > > From mboxrd@z Thu Jan 1 00:00:00 1970 > Return-Path: > <SRS0=bc75=QC=lists.infradead.org=linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@kernel.org> > X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on > aws-us-west-2-korg-lkml-1.web.codeaurora.org > Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) > by smtp.lore.kernel.org (Postfix) with ESMTP id 1DF63C433F5 > for <linux-rockchip@archiver.kernel.org>; Mon, 15 Nov 2021 > 11:42:39 +0000 (UTC) > Received: from bombadil.infradead.org (bombadil.infradead.org > [198.137.202.133]) > (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 > bits)) > (No client certificate requested) > by mail.kernel.org (Postfix) with ESMTPS id D939A61175 > for <linux-rockchip@archiver.kernel.org>; Mon, 15 Nov 2021 > 11:42:38 +0000 (UTC) > DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org D939A61175 > Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine > dis=none) header.from=amd.com > Authentication-Results: mail.kernel.org; spf=none > smtp.mailfrom=lists.infradead.org > DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; > d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: > Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: > > List-Unsubscribe:List-Id:MIME-Version:In-Reply-To:Date:Message-ID:From: > > References:Cc:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: > > Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; > > bh=YynYeIAZi+K+m2naIfrKtqrQanTeUDG2hfxK0scEY+M=; > b=JLVk0WfVJXF3my3DZsIyB8zoBQ > XDDOsW4/MgUPrPvBnKH0xH2UztD/Tzxw3KkYpeUAxb8mx+buAB+V5wJH40hRMgTKSQFKUvsZMZOdS > > /HgFcaxhD1Zgm/DZDUctpGlg85qHL3T6NVS6HTVmNnyckiGeiW51pgCbPFZl/3FyFiMSABxukwdQm > > tD3yDWBz1d9BkxA48UHC/k+LbeyyldyHxkuR1c2/CoHk0X9kwxWx78BI94DfyUNE1A4V8Lnvtae07 > > aUnHLtVfWLo5nobyfoep93NHxihd+/nZSJ88ZYGYOg7rsaTeh68YZXKzk7WvuepjMfXYZlzUCS7OX > > dg1rskUg==; > Received: from localhost ([::1] helo=bombadil.infradead.org) > by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) > id 1mmaNd-00FR0i-Oq; Mon, 15 Nov 2021 11:42:33 +0000 > Received: from mail-mw2nam10on2065.outbound.protection.outlook.com > ([40.107.94.65] helo=NAM10-MW2-obe.outbound.protection.outlook.com) > by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) > id 1mmaNZ-00FQyX-9A > for linux-rockchip@lists.infradead.org; Mon, 15 Nov 2021 11:42:32 +0000 > ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; > b=ZYSFfhU+N5Fq39gpw5NCsolRnyvMmfKTA5cWgJx3l903N5tP6BK6x7pUqmtcQZvyCwwzQwonnQGCZqIx/M4qourfwzBBS0SVUSHvvU6Vn4nZRrd/wffjMaX24XwtUxIdQAQntPFWRi0SjIWpG+72E2TIxwcuyY3/5+qkQiF8s3iNnNXmY4zdZ9fx48I5MHFePTx+VAyZvxzedsyfjjAxGaaaPl2uZagHTH9TDFFaAg/rHvH6O2vq0RwQIaMOGxhA8DgCmsj9dMlSloko0iLt+p2s/WUQShbSQrZq13R3POIyU6aCBx32Zz+biTbwpcXQyXxwfQIi+2nIruJQvuvwSw== > > ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; > d=microsoft.com; s=arcselector9901; > h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; > > bh=JkRdepoBhhvZgBl9zd4oG1PeOv+kPWSxKw1ORztFSv4=; > b=hYGlnailNdl4CzgRcFMK/ZTAFR1Ipev9djYIyqc4j32m6sMsqyx1YxjcAPDo6Rnk3qtB+9sMag1rldkddxzJCBGDOLkgX7hQFl7AFRIQhpXLQsUek5IrCfbd0rGW4HpdbUxyGyRz70XnjFPSTGQFhlz7glYKDPeyHN/X3RtVBfrUG1ywFsVzjD6+I8Uc0O9jbG6Rw5S1/dydWeyovBOPcbUVYt1ZF0z7JDt4Tj90hAElD4cTmc/rfAt3eY3pB6pydnGu+nXJ5bKZIY/U7Wec+TwdXPNGU+ia5E4MN6xuL+kVLPNPa1G6h8qetsVTw5UYOkGtPZCxcR6pUKs0ocJTZg== > > ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass > smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; > dkim=pass > header.d=amd.com; arc=none > DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; > s=selector1; > h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; > bh=JkRdepoBhhvZgBl9zd4oG1PeOv+kPWSxKw1ORztFSv4=; > b=4zNaX2CfJHDxjaHlT7C84/jyXuQUhJVYoDhuLfWp/MO0v73QSPzoDc9EiD6G3taNwfNkwRBOMm5VIiF2wOMmVeJmV2JabQp0VPjTYkXDZL9xbtuoXkdCtQFx1+Fz1GJhOnpgaIMZrSQ+DugqAkbmKW5Jp6o8P3GT/ZDzIFBk4xk= > > Authentication-Results: dkim=none (message not signed) > header.d=none;dmarc=none action=none header.from=amd.com; > Received: from MWHPR1201MB0192.namprd12.prod.outlook.com > (2603:10b6:301:5a::14) by MWHPR12MB1837.namprd12.prod.outlook.com > (2603:10b6:300:113::20) with Microsoft SMTP Server (version=TLS1_2, > cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.27; Mon, > 15 Nov > 2021 11:42:20 +0000 > Received: from MWHPR1201MB0192.namprd12.prod.outlook.com > ([fe80::2d02:26e7:a2d0:3769]) by > MWHPR1201MB0192.namprd12.prod.outlook.com > ([fe80::2d02:26e7:a2d0:3769%5]) with mapi id 15.20.4690.027; Mon, 15 > Nov 2021 > 11:42:20 +0000 > Subject: Re: [PATCH] dma-buf: add DMA_BUF_IOCTL_SYNC_PARTIAL support > To: Jianqun Xu <jay.xu@rock-chips.com>, sumit.semwal@linaro.org > Cc: pekka.paalanen@collabora.com, daniel.vetter@ffwll.ch, > jason@jlekstrand.net, linux-media@vger.kernel.org, > dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, > linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org > References: <20211113062222.3743909-1-jay.xu@rock-chips.com> > From: =?UTF-8?Q?Christian_K=c3=b6nig?= <christian.koenig@amd.com> > Message-ID: <1da5cdf0-ccb8-3740-cf96-794c4d5b2eb4@amd.com> > Date: Mon, 15 Nov 2021 12:42:13 +0100 > User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 > Thunderbird/78.13.0 > In-Reply-To: <20211113062222.3743909-1-jay.xu@rock-chips.com> > Content-Language: en-US > X-ClientProxiedBy: AS9PR0301CA0041.eurprd03.prod.outlook.com > (2603:10a6:20b:469::32) To MWHPR1201MB0192.namprd12.prod.outlook.com > (2603:10b6:301:5a::14) > MIME-Version: 1.0 > Received: from [IPv6:2a02:908:1252:fb60:bf0c:d52c:6ba0:cfc6] > (2a02:908:1252:fb60:bf0c:d52c:6ba0:cfc6) by > AS9PR0301CA0041.eurprd03.prod.outlook.com (2603:10a6:20b:469::32) with > Microsoft SMTP Server (version=TLS1_2, > cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.26 via > Frontend > Transport; Mon, 15 Nov 2021 11:42:17 +0000 > X-MS-PublicTrafficType: Email > X-MS-Office365-Filtering-Correlation-Id: > 00ebe1d3-562c-44d3-ab7c-08d9a82cfb38 > X-MS-TrafficTypeDiagnostic: MWHPR12MB1837: > X-Microsoft-Antispam-PRVS: > <MWHPR12MB18370021933B2E90497B3E8C83989@MWHPR12MB1837.namprd12.prod.outlook.com> > X-MS-Oob-TLC-OOBClassifiers: OLM:8273; > X-MS-Exchange-SenderADCheck: 1 > X-MS-Exchange-AntiSpam-Relay: 0 > X-Microsoft-Antispam: BCL:0; > X-Microsoft-Antispam-Message-Info: > qnNpT+UDEdrvmTrphgUzQsrIExW/nJQjCEAt6/leQnM/+F75uQ4P/gIEmE2mfi+FLGZoBp+qpesYv6TE414JsgHBjmPsq9wqAxODHs5+tKntVesYVzi2T3a+bor5SPTdHrjOyz4Lv5il0Z00hyIMOsC898lxdXNK3DY8ClRa/X+z05ZLWWI9kbXDjVdrVqmD31Ciy9En6YG1TKIV+epuDLGRKEvYe8NhgoFs6tUkQ/bWmTBdRJgllNrqms9k2nXdSN5hRpvEjPb3R0jF3kat4c9/g+R9ZfNDU0z3Qo2VAfydWQzqA1BIV1A7EDnRTXmW5vnAV79Migw7l8P0CqzM1nBlO5bCjKtHXPj4OXseQUwQWFO5216Sj4yR6FeIQFVrAO7lW3pd3S4bncIRU17nSaQPkQnnNSdXm0OBFoDdrVzhxYO5g7CoHdrAh0S0Y4Q8vQFqy36ujVGByHPPFfX+aaKXQ/BWnlM6tghXuVYUcoYtqlV4AJpRnByfYBQrumA1ouTLedvwpUsQlCItufU36509QJHuQ9oa3NDqXos2SPnUS/F/6HsBJHw63Rq1Jcd0WGmqDrp9wFQaK959C6zotCP8LC+p2pB0gQYgRieAeifspuQuKmSFk46/7OZfmlwmv8i1rhIK65/inlDat2eDtJBEpqk15UW3bMvw1g5dv5Kr9RmOvFfjfRv5uYDkmxM4OcYG/KHnhd59tAKjoVDXcLgv4Z/rf5i8pgCG0D7SWcZI1XNcdbglDuWiigm3ihyx > X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; > SCL:1; SRV:; > IPV:NLI; SFV:NSPM; H:MWHPR1201MB0192.namprd12.prod.outlook.com; PTR:; > CAT:NONE; > SFS:(4636009)(366004)(316002)(7416002)(2616005)(6486002)(8936002)(8676002)(186003)(31686004)(66556008)(66476007)(86362001)(66946007)(83380400001)(31696002)(6666004)(508600001)(38100700002)(5660300002)(2906002)(4326008)(36756003)(43740500002)(45980500001); > > DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 > X-MS-Exchange-AntiSpam-MessageData-0: > =?utf-8?B?VmtQa3NIa1NhVm40N2lmZnBueGVQS3ZuTWpaWm4waU1IQ3kvYlFHSGI1ZllH?= > =?utf-8?B?ek13MElkY3lWUlVuVWxJUkZPR0tlQ01FV0lCUnJrUWRSejg0WjZJWW5CTFdS?= > =?utf-8?B?TDVMZTVHNitXaW9taUpweTFaL2pJS1NZbGJacnlDWVNyMFl3MjlkdGd3YTEr?= > =?utf-8?B?MmRodnF3dnlzd0NKZEtZN1JaVFA2OTBJRGQ1WjZBUHROK0dhMlhMWWZkaUd3?= > =?utf-8?B?RFlQd3NmNGRWZFZydFhXSVJyRmxQMEZDWlhxU3hMcDYzNUtJRGtHVzZtMmIx?= > =?utf-8?B?NU5zT0VvNmI1MUE1WTRmQWRUZkM4aXFtYVBzK3ovM2E3dGFEQ2ZJZ1B5U2Vv?= > =?utf-8?B?eWVQN0tEZUhFQi93ZG8zdFJaTjcwT2dUc3VzdTgzNzZsaVNuUHFOQjRFN2Nq?= > =?utf-8?B?eGZJamhBMDhBbmhsRjhWUDY3dmFhODJKR0UwVWlFcW42TXR6Q2lRV0ZhQnJW?= > =?utf-8?B?SVAvalMxUVpmSVNzWmxpR3Z1cWtYSTlXTHZOMUY4dExKMFJZcXl2UGZ5S2pZ?= > =?utf-8?B?NVI2K0xOaFQ3QlMyYitGMDRxa2JCVHQrQW40VnpPUkJ4SDN2UjRnU29TeHFU?= > =?utf-8?B?cUVVSjEzLzV1ZFFxcndBbkw0T2Q0MHo3YUtoOThVTlgxcm5odjlqVzBYUkV3?= > =?utf-8?B?RzM1dmllc3pTSFIvS0xaNWVoVDNWVXQ3Q1NJc0NpcjAwWUY1VkR0eEFhZnRX?= > =?utf-8?B?R3gyeEIyMjR3SGVDdDhUaGtmZWRJTnkyeWhuWkpIVVg2RHoxQWtrUEJtNjdv?= > =?utf-8?B?YlNmbzI2ME1hQkcrVVBNQ1pFT1FWZFRZZFhyZE9OWWJzRUlDM29pQUJ0V24y?= > =?utf-8?B?NjRQM2g0a0J4NzJVVGw1MDRqMXFndVBJellQazRvUnFVMHFLRlR2Q3lJMlpq?= > =?utf-8?B?V1F3b1BwZFpUM2xyYUpvR0RTcDJEZ1dGZWdMdDVHYzd2eW5ZYnlwTXlrckpD?= > =?utf-8?B?OTdGU0w1My9SUVRkdmk3L1VaWDJseUc3S2tjdFhEZ3dUeDZ1RVIrK2ZNUDkv?= > =?utf-8?B?aU9NbkZqRFpPQzFvVFpOWHYzd2QxS256OTRKaVQrVlR3c29nNHdwcjVjVklD?= > =?utf-8?B?cVp6dFN0TUpNMDd1SlFzRUx2SjlraVczakM3VmFJdExzVGJ5cXdmSGlKTTVx?= > =?utf-8?B?dHNCaUFjVmRPZkRuVFp1RVhWTFB0L1FtNHI1TEZEcTFsQUFMNjdUMnIxaVZr?= > =?utf-8?B?d09MaXhiSFlrMjhPOGxrcGFLVElSR1pOQkdMdG4wa1k1VktnVVRFTXU0QlJk?= > =?utf-8?B?Z09uemlVVHJxUHNoY3d1UXIrOUxCMU85bHM1TlpYRzZGcHRRcndtbERtdU9s?= > =?utf-8?B?VUZRaVY2Z3N2RnlFbk14L1lER2Jib0JSSVNyZkw3Wk1sVExYaDhnMXRDUkhv?= > =?utf-8?B?Z0FyK0NmMDlEKzcxUTdUY3A5SFJBYUhCOEpIbFNTK3Vic2hxcXR5MWZUcFND?= > =?utf-8?B?bDZlRnl0VkxWajFyeDF4SFpoQzJTbTNPU1U2c1c4TlhscWNQNXhRaWMxTG5G?= > =?utf-8?B?emJtUURBZVlqT3cxR2hRdGFVZUh1akxuRHIwYlRPOWZZSnVKeXFvMCtlNTFT?= > =?utf-8?B?Q3BvMGROdlZ2ZFJUNzYya3hvUVlHYmYzaGlSMHMyK1U0Nis1YksrWFZWc1JH?= > =?utf-8?B?VHFoY0phcnNVdHNJN2Y4Z0lxRzhHRng0SWQ2NmJuZENWUE5uMktmZktpeTY2?= > =?utf-8?B?dU15L0FOWDNobkJkN0x6RkdlY1BQalhSK3p0S2ZsTVpwUnFSN0l6S1RMcXJh?= > =?utf-8?B?bnptcHlHc2VDVm50NW52MkRVK0FpbGpNb3JPektpc1pVM3BibGRhNklaMjVN?= > =?utf-8?B?MTZxNFNOd2lTbDBhSk5XcFk0UTdZbXdsaW5BYm1kRzlGeThJOU4rMWNyL09l?= > =?utf-8?B?N3ZTM1NSeUFraVMvVnJYcWhNRjFPOVZYNUhTRFUyWHo5QVpKZlhia05HQy9S?= > =?utf-8?B?Uit6VG51RCtqWGJsNU4vRGlFVXhJdjh4Y1RhdWhEVVpVTUNpcGdMQUY2L005?= > =?utf-8?B?WG9wejVLbEZjampPYVcxNDMySXNQelVEZEFGQWROZ2h4ZjFNOWR3c084SjFN?= > =?utf-8?B?b2lMbThOZmdXQW84YWg4ekJyQW9mWStyZnMvV1JWd3lMajVEM2hTbFVUczNv?= > =?utf-8?B?QmhyeVpQVVUrOUtyRWNjUXp2a1JhQUpsSnk0ZVlrSDdnaFFYaFVTdHpjM01O?= > =?utf-8?Q?BO9RKUEVN4uMTDc9B3JQWSk=3D?= > X-OriginatorOrg: amd.com > X-MS-Exchange-CrossTenant-Network-Message-Id: > 00ebe1d3-562c-44d3-ab7c-08d9a82cfb38 > X-MS-Exchange-CrossTenant-AuthSource: > MWHPR1201MB0192.namprd12.prod.outlook.com > X-MS-Exchange-CrossTenant-AuthAs: Internal > X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Nov 2021 > 11:42:19.8907 (UTC) > X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted > X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d > X-MS-Exchange-CrossTenant-MailboxType: HOSTED > X-MS-Exchange-CrossTenant-UserPrincipalName: > cPSQhRvD4Dau5vTrINquy4Yo1A5DbJm3yOORz6qQDOx+umrhjPgdp0FqKASMDEeu > X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1837 > X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) > MR-646709E3 X-CRM114-CacheID: sfid-20211115_034229_353755_F892CB5A > X-CRM114-Status: GOOD ( 21.17 ) > X-BeenThere: linux-rockchip@lists.infradead.org > X-Mailman-Version: 2.1.34 > Precedence: list > List-Id: Upstream kernel work for Rockchip platforms > <linux-rockchip.lists.infradead.org> > List-Unsubscribe: > <http://lists.infradead.org/mailman/options/linux-rockchip>, > <mailto:linux-rockchip-request@lists.infradead.org?subject=unsubscribe> > List-Archive: <http://lists.infradead.org/pipermail/linux-rockchip/> > List-Post: <mailto:linux-rockchip@lists.infradead.org> > List-Help: > <mailto:linux-rockchip-request@lists.infradead.org?subject=help> > List-Subscribe: > <http://lists.infradead.org/mailman/listinfo/linux-rockchip>, > <mailto:linux-rockchip-request@lists.infradead.org?subject=subscribe> > Content-Transfer-Encoding: 7bit > Content-Type: text/plain; charset="us-ascii"; Format="flowed" > Sender: "Linux-rockchip" <linux-rockchip-bounces@lists.infradead.org> > Errors-To: > linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org > > Am 13.11.21 um 07:22 schrieb Jianqun Xu: >> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >> offset and len. > > You have not given an use case for this so it is a bit hard to review. > And from the existing use cases I don't see why this should be necessary. > > Even worse from the existing backend implementation I don't even see > how drivers should be able to fulfill this semantics. > > Please explain further, > Christian. Here is a practical case: The user space can allocate a large chunk of dma-buf for self-management, used as a shared memory pool. Small dma-buf can be allocated from this shared memory pool and released back to it after use, thus improving the speed of dma-buf allocation and release. Additionally, custom functionalities such as memory statistics and boundary checking can be implemented in the user space. Of course, the above-mentioned functionalities require the implementation of a partial cache sync interface. Thanks Rong Qianfeng. > >> >> Change-Id: I03d2d2e10e48d32aa83c31abade57e0931e1be49 >> Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> >> --- >> drivers/dma-buf/dma-buf.c | 42 ++++++++++++++++++++++++++++++++++++ >> include/uapi/linux/dma-buf.h | 8 +++++++ >> 2 files changed, 50 insertions(+) >> >> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c >> index d9948d58b3f4..78f37f7c3462 100644 >> --- a/drivers/dma-buf/dma-buf.c >> +++ b/drivers/dma-buf/dma-buf.c >> @@ -392,6 +392,7 @@ static long dma_buf_ioctl(struct file *file, >> { >> struct dma_buf *dmabuf; >> struct dma_buf_sync sync; >> + struct dma_buf_sync_partial sync_p; >> enum dma_data_direction direction; >> int ret; >> @@ -430,6 +431,47 @@ static long dma_buf_ioctl(struct file *file, >> case DMA_BUF_SET_NAME_B: >> return dma_buf_set_name(dmabuf, (const char __user *)arg); >> + case DMA_BUF_IOCTL_SYNC_PARTIAL: >> + if (copy_from_user(&sync_p, (void __user *) arg, >> sizeof(sync_p))) >> + return -EFAULT; >> + >> + if (sync_p.len == 0) >> + return 0; >> + >> + if ((sync_p.offset % cache_line_size()) || (sync_p.len % >> cache_line_size())) >> + return -EINVAL; >> + >> + if (sync_p.len > dmabuf->size || sync_p.offset > >> dmabuf->size - sync_p.len) >> + return -EINVAL; >> + >> + if (sync_p.flags & ~DMA_BUF_SYNC_VALID_FLAGS_MASK) >> + return -EINVAL; >> + >> + switch (sync_p.flags & DMA_BUF_SYNC_RW) { >> + case DMA_BUF_SYNC_READ: >> + direction = DMA_FROM_DEVICE; >> + break; >> + case DMA_BUF_SYNC_WRITE: >> + direction = DMA_TO_DEVICE; >> + break; >> + case DMA_BUF_SYNC_RW: >> + direction = DMA_BIDIRECTIONAL; >> + break; >> + default: >> + return -EINVAL; >> + } >> + >> + if (sync_p.flags & DMA_BUF_SYNC_END) >> + ret = dma_buf_end_cpu_access_partial(dmabuf, direction, >> + sync_p.offset, >> + sync_p.len); >> + else >> + ret = dma_buf_begin_cpu_access_partial(dmabuf, direction, >> + sync_p.offset, >> + sync_p.len); >> + >> + return ret; >> + >> default: >> return -ENOTTY; >> } >> diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h >> index 7f30393b92c3..6236c644624d 100644 >> --- a/include/uapi/linux/dma-buf.h >> +++ b/include/uapi/linux/dma-buf.h >> @@ -47,4 +47,12 @@ struct dma_buf_sync { >> #define DMA_BUF_SET_NAME_A _IOW(DMA_BUF_BASE, 1, u32) >> #define DMA_BUF_SET_NAME_B _IOW(DMA_BUF_BASE, 1, u64) >> +struct dma_buf_sync_partial { >> + __u64 flags; >> + __u32 offset; >> + __u32 len; >> +}; >> + >> +#define DMA_BUF_IOCTL_SYNC_PARTIAL _IOW(DMA_BUF_BASE, 2, struct >> dma_buf_sync_partial) >> + >> #endif > > > _______________________________________________ > Linux-rockchip mailing list > Linux-rockchip@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-rockchip >
Am 07.04.24 um 09:50 schrieb Rong Qianfeng: > [SNIP] >> Am 13.11.21 um 07:22 schrieb Jianqun Xu: >>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >>> offset and len. >> >> You have not given an use case for this so it is a bit hard to >> review. And from the existing use cases I don't see why this should >> be necessary. >> >> Even worse from the existing backend implementation I don't even see >> how drivers should be able to fulfill this semantics. >> >> Please explain further, >> Christian. > Here is a practical case: > The user space can allocate a large chunk of dma-buf for > self-management, used as a shared memory pool. > Small dma-buf can be allocated from this shared memory pool and > released back to it after use, thus improving the speed of dma-buf > allocation and release. > Additionally, custom functionalities such as memory statistics and > boundary checking can be implemented in the user space. > Of course, the above-mentioned functionalities require the > implementation of a partial cache sync interface. Well that is obvious, but where is the code doing that? You can't send out code without an actual user of it. That will obviously be rejected. Regards, Christian. > > Thanks > Rong Qianfeng.
在 2024/4/8 15:58, Christian König 写道: > Am 07.04.24 um 09:50 schrieb Rong Qianfeng: >> [SNIP] >>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: >>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >>>> offset and len. >>> >>> You have not given an use case for this so it is a bit hard to >>> review. And from the existing use cases I don't see why this should >>> be necessary. >>> >>> Even worse from the existing backend implementation I don't even see >>> how drivers should be able to fulfill this semantics. >>> >>> Please explain further, >>> Christian. >> Here is a practical case: >> The user space can allocate a large chunk of dma-buf for >> self-management, used as a shared memory pool. >> Small dma-buf can be allocated from this shared memory pool and >> released back to it after use, thus improving the speed of dma-buf >> allocation and release. >> Additionally, custom functionalities such as memory statistics and >> boundary checking can be implemented in the user space. >> Of course, the above-mentioned functionalities require the >> implementation of a partial cache sync interface. > > Well that is obvious, but where is the code doing that? > > You can't send out code without an actual user of it. That will > obviously be rejected. > > Regards, > Christian. In fact, we have already used the user-level dma-buf memory pool in the camera shooting scenario on the phone. From the test results, The execution time of the photo shooting algorithm has been reduced from 3.8s to 3s. To be honest, I didn't understand your concern "...how drivers should be able to fulfill this semantics." Can you please help explain it in more detail? Thanks, Rong Qianfeng. > >> >> Thanks >> Rong Qianfeng. >
Am 09.04.24 um 09:32 schrieb Rong Qianfeng: > > 在 2024/4/8 15:58, Christian König 写道: >> Am 07.04.24 um 09:50 schrieb Rong Qianfeng: >>> [SNIP] >>>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: >>>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >>>>> offset and len. >>>> >>>> You have not given an use case for this so it is a bit hard to >>>> review. And from the existing use cases I don't see why this should >>>> be necessary. >>>> >>>> Even worse from the existing backend implementation I don't even >>>> see how drivers should be able to fulfill this semantics. >>>> >>>> Please explain further, >>>> Christian. >>> Here is a practical case: >>> The user space can allocate a large chunk of dma-buf for >>> self-management, used as a shared memory pool. >>> Small dma-buf can be allocated from this shared memory pool and >>> released back to it after use, thus improving the speed of dma-buf >>> allocation and release. >>> Additionally, custom functionalities such as memory statistics and >>> boundary checking can be implemented in the user space. >>> Of course, the above-mentioned functionalities require the >>> implementation of a partial cache sync interface. >> >> Well that is obvious, but where is the code doing that? >> >> You can't send out code without an actual user of it. That will >> obviously be rejected. >> >> Regards, >> Christian. > > In fact, we have already used the user-level dma-buf memory pool in > the camera shooting scenario on the phone. > > From the test results, The execution time of the photo shooting > algorithm has been reduced from 3.8s to 3s. > > To be honest, I didn't understand your concern "...how drivers should > be able to fulfill this semantics." Can you please help explain it in > more detail? Well you don't give any upstream driver code which actually uses this interface. If you want to suggest some changes to the core Linux kernel your driver actually needs to be upstream. As long as that isn't the case this approach here is a completely no-go. Regards, Christian. > > Thanks, > > Rong Qianfeng. > >> >>> >>> Thanks >>> Rong Qianfeng. >>
On Tue, Apr 9, 2024 at 12:34 AM Rong Qianfeng <11065417@vivo.com> wrote: > > > 在 2024/4/8 15:58, Christian König 写道: > > Am 07.04.24 um 09:50 schrieb Rong Qianfeng: > >> [SNIP] > >>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: > >>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with > >>>> offset and len. > >>> > >>> You have not given an use case for this so it is a bit hard to > >>> review. And from the existing use cases I don't see why this should > >>> be necessary. > >>> > >>> Even worse from the existing backend implementation I don't even see > >>> how drivers should be able to fulfill this semantics. > >>> > >>> Please explain further, > >>> Christian. > >> Here is a practical case: > >> The user space can allocate a large chunk of dma-buf for > >> self-management, used as a shared memory pool. > >> Small dma-buf can be allocated from this shared memory pool and > >> released back to it after use, thus improving the speed of dma-buf > >> allocation and release. > >> Additionally, custom functionalities such as memory statistics and > >> boundary checking can be implemented in the user space. > >> Of course, the above-mentioned functionalities require the > >> implementation of a partial cache sync interface. > > > > Well that is obvious, but where is the code doing that? > > > > You can't send out code without an actual user of it. That will > > obviously be rejected. > > > > Regards, > > Christian. > > In fact, we have already used the user-level dma-buf memory pool in the > camera shooting scenario on the phone. > > From the test results, The execution time of the photo shooting > algorithm has been reduced from 3.8s to 3s. > For phones, the (out of tree) Android version of the system heap has a page pool connected to a shrinker. That allows you to skip page allocation without fully pinning the memory like you get when allocating a dma-buf that's way larger than necessary. If it's for a camera maybe you need physically contiguous memory, but it's also possible to set that up. https://android.googlesource.com/kernel/common/+/refs/heads/android14-6.1/drivers/dma-buf/heaps/system_heap.c#377 > To be honest, I didn't understand your concern "...how drivers should be > able to fulfill this semantics." Can you please help explain it in more > detail? > > Thanks, > > Rong Qianfeng. > > > > >> > >> Thanks > >> Rong Qianfeng. > > >
在 2024/4/9 23:34, Christian König 写道: > Am 09.04.24 um 09:32 schrieb Rong Qianfeng: >> >> 在 2024/4/8 15:58, Christian König 写道: >>> Am 07.04.24 um 09:50 schrieb Rong Qianfeng: >>>> [SNIP] >>>>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: >>>>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >>>>>> offset and len. >>>>> >>>>> You have not given an use case for this so it is a bit hard to >>>>> review. And from the existing use cases I don't see why this >>>>> should be necessary. >>>>> >>>>> Even worse from the existing backend implementation I don't even >>>>> see how drivers should be able to fulfill this semantics. >>>>> >>>>> Please explain further, >>>>> Christian. >>>> Here is a practical case: >>>> The user space can allocate a large chunk of dma-buf for >>>> self-management, used as a shared memory pool. >>>> Small dma-buf can be allocated from this shared memory pool and >>>> released back to it after use, thus improving the speed of dma-buf >>>> allocation and release. >>>> Additionally, custom functionalities such as memory statistics and >>>> boundary checking can be implemented in the user space. >>>> Of course, the above-mentioned functionalities require the >>>> implementation of a partial cache sync interface. >>> >>> Well that is obvious, but where is the code doing that? >>> >>> You can't send out code without an actual user of it. That will >>> obviously be rejected. >>> >>> Regards, >>> Christian. >> >> In fact, we have already used the user-level dma-buf memory pool in >> the camera shooting scenario on the phone. >> >> From the test results, The execution time of the photo shooting >> algorithm has been reduced from 3.8s to 3s. >> >> To be honest, I didn't understand your concern "...how drivers should >> be able to fulfill this semantics." Can you please help explain it in >> more detail? > > Well you don't give any upstream driver code which actually uses this > interface. > > If you want to suggest some changes to the core Linux kernel your > driver actually needs to be upstream. > > As long as that isn't the case this approach here is a completely no-go. Ok, I get it now, thanks! Regards, Rong Qianfeng. > > Regards, > Christian. > >> >> Thanks, >> >> Rong Qianfeng. >> >>> >>>> >>>> Thanks >>>> Rong Qianfeng. >>> >
Am 09.04.24 um 18:37 schrieb T.J. Mercier: > On Tue, Apr 9, 2024 at 12:34 AM Rong Qianfeng <11065417@vivo.com> wrote: >> >> 在 2024/4/8 15:58, Christian König 写道: >>> Am 07.04.24 um 09:50 schrieb Rong Qianfeng: >>>> [SNIP] >>>>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: >>>>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >>>>>> offset and len. >>>>> You have not given an use case for this so it is a bit hard to >>>>> review. And from the existing use cases I don't see why this should >>>>> be necessary. >>>>> >>>>> Even worse from the existing backend implementation I don't even see >>>>> how drivers should be able to fulfill this semantics. >>>>> >>>>> Please explain further, >>>>> Christian. >>>> Here is a practical case: >>>> The user space can allocate a large chunk of dma-buf for >>>> self-management, used as a shared memory pool. >>>> Small dma-buf can be allocated from this shared memory pool and >>>> released back to it after use, thus improving the speed of dma-buf >>>> allocation and release. >>>> Additionally, custom functionalities such as memory statistics and >>>> boundary checking can be implemented in the user space. >>>> Of course, the above-mentioned functionalities require the >>>> implementation of a partial cache sync interface. >>> Well that is obvious, but where is the code doing that? >>> >>> You can't send out code without an actual user of it. That will >>> obviously be rejected. >>> >>> Regards, >>> Christian. >> In fact, we have already used the user-level dma-buf memory pool in the >> camera shooting scenario on the phone. >> >> From the test results, The execution time of the photo shooting >> algorithm has been reduced from 3.8s to 3s. >> > For phones, the (out of tree) Android version of the system heap has a > page pool connected to a shrinker. Well, it should be obvious but I'm going to repeat it here: Submitting kernel patches for our of tree code is a rather *extreme* no-go. That in kernel code *must* have an in kernel user is a number one rule. When somebody violates this rule he pretty much disqualifying himself as reliable source of patches since maintainers then have to assume that this person tries to submit code which doesn't have a justification to be upstream. So while this actually looks useful from the technical side as long as nobody does an implementation based on an upstream driver I absolutely have to reject it from the organizational side. Regards, Christian. > That allows you to skip page > allocation without fully pinning the memory like you get when > allocating a dma-buf that's way larger than necessary. If it's for a > camera maybe you need physically contiguous memory, but it's also > possible to set that up. > > https://android.googlesource.com/kernel/common/+/refs/heads/android14-6.1/drivers/dma-buf/heaps/system_heap.c#377 > > >> To be honest, I didn't understand your concern "...how drivers should be >> able to fulfill this semantics." Can you please help explain it in more >> detail? >> >> Thanks, >> >> Rong Qianfeng. >> >>>> Thanks >>>> Rong Qianfeng.
On Wed, Apr 10, 2024 at 7:22 AM Christian König <christian.koenig@amd.com> wrote: > > Am 09.04.24 um 18:37 schrieb T.J. Mercier: > > On Tue, Apr 9, 2024 at 12:34 AM Rong Qianfeng <11065417@vivo.com> wrote: > >> > >> 在 2024/4/8 15:58, Christian König 写道: > >>> Am 07.04.24 um 09:50 schrieb Rong Qianfeng: > >>>> [SNIP] > >>>>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: > >>>>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with > >>>>>> offset and len. > >>>>> You have not given an use case for this so it is a bit hard to > >>>>> review. And from the existing use cases I don't see why this should > >>>>> be necessary. > >>>>> > >>>>> Even worse from the existing backend implementation I don't even see > >>>>> how drivers should be able to fulfill this semantics. > >>>>> > >>>>> Please explain further, > >>>>> Christian. > >>>> Here is a practical case: > >>>> The user space can allocate a large chunk of dma-buf for > >>>> self-management, used as a shared memory pool. > >>>> Small dma-buf can be allocated from this shared memory pool and > >>>> released back to it after use, thus improving the speed of dma-buf > >>>> allocation and release. > >>>> Additionally, custom functionalities such as memory statistics and > >>>> boundary checking can be implemented in the user space. > >>>> Of course, the above-mentioned functionalities require the > >>>> implementation of a partial cache sync interface. > >>> Well that is obvious, but where is the code doing that? > >>> > >>> You can't send out code without an actual user of it. That will > >>> obviously be rejected. > >>> > >>> Regards, > >>> Christian. > >> In fact, we have already used the user-level dma-buf memory pool in the > >> camera shooting scenario on the phone. > >> > >> From the test results, The execution time of the photo shooting > >> algorithm has been reduced from 3.8s to 3s. > >> > > For phones, the (out of tree) Android version of the system heap has a > > page pool connected to a shrinker. > > Well, it should be obvious but I'm going to repeat it here: Submitting > kernel patches for our of tree code is a rather *extreme* no-go. > Sorry I think my comment led to some confusion. I wasn't suggesting you should take the patch; it's clearly incomplete. I was pointing out another option to Rong. It appears Rong is creating a single oversized dma-buf, and subdividing it in userspace to avoid multiple allocations for multiple buffers. That would lead to a need for a partial sync of the buffer from userspace. Instead of that, using a heap with a page pool gets you kind of the same thing with a lot less headache in userspace, and no need for partial sync. So I wanted to share that option, and that can go in just Android if necessary without this patch. > That in kernel code *must* have an in kernel user is a number one rule. > > When somebody violates this rule he pretty much disqualifying himself as > reliable source of patches since maintainers then have to assume that > this person tries to submit code which doesn't have a justification to > be upstream. > > So while this actually looks useful from the technical side as long as > nobody does an implementation based on an upstream driver I absolutely > have to reject it from the organizational side. > > Regards, > Christian. > > > That allows you to skip page > > allocation without fully pinning the memory like you get when > > allocating a dma-buf that's way larger than necessary. If it's for a > > camera maybe you need physically contiguous memory, but it's also > > possible to set that up. > > > > https://android.googlesource.com/kernel/common/+/refs/heads/android14-6.1/drivers/dma-buf/heaps/system_heap.c#377 > > > > > >> To be honest, I didn't understand your concern "...how drivers should be > >> able to fulfill this semantics." Can you please help explain it in more > >> detail? > >> > >> Thanks, > >> > >> Rong Qianfeng. > >> > >>>> Thanks > >>>> Rong Qianfeng. >
在 2024/4/10 0:37, T.J. Mercier 写道: > [You don't often get email from tjmercier@google.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ] > > On Tue, Apr 9, 2024 at 12:34 AM Rong Qianfeng <11065417@vivo.com> wrote: >> >> 在 2024/4/8 15:58, Christian König 写道: >>> Am 07.04.24 um 09:50 schrieb Rong Qianfeng: >>>> [SNIP] >>>>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: >>>>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >>>>>> offset and len. >>>>> You have not given an use case for this so it is a bit hard to >>>>> review. And from the existing use cases I don't see why this should >>>>> be necessary. >>>>> >>>>> Even worse from the existing backend implementation I don't even see >>>>> how drivers should be able to fulfill this semantics. >>>>> >>>>> Please explain further, >>>>> Christian. >>>> Here is a practical case: >>>> The user space can allocate a large chunk of dma-buf for >>>> self-management, used as a shared memory pool. >>>> Small dma-buf can be allocated from this shared memory pool and >>>> released back to it after use, thus improving the speed of dma-buf >>>> allocation and release. >>>> Additionally, custom functionalities such as memory statistics and >>>> boundary checking can be implemented in the user space. >>>> Of course, the above-mentioned functionalities require the >>>> implementation of a partial cache sync interface. >>> Well that is obvious, but where is the code doing that? >>> >>> You can't send out code without an actual user of it. That will >>> obviously be rejected. >>> >>> Regards, >>> Christian. >> In fact, we have already used the user-level dma-buf memory pool in the >> camera shooting scenario on the phone. >> >> From the test results, The execution time of the photo shooting >> algorithm has been reduced from 3.8s to 3s. >> > For phones, the (out of tree) Android version of the system heap has a > page pool connected to a shrinker. That allows you to skip page > allocation without fully pinning the memory like you get when > allocating a dma-buf that's way larger than necessary. If it's for a > camera maybe you need physically contiguous memory, but it's also > possible to set that up. > > https://android.googlesource.com/kernel/common/+/refs/heads/android14-6.1/drivers/dma-buf/heaps/system_heap.c#377 > Thank you for the reminder. The page pool of the system heap can meet the needs of most scenarios, but the camera shooting scenario is quite special. Why the camera shooting scenario needs to have a dma-buf memory pool in the user-level? (1) The memory demand is extremely high and time requirements are stringent. (2) The memory in the page pool(system heap) is easily reclaimed or used by other apps. (3) High concurrent allocation and release (with deferred-free) lead to high memory usage peaks. Additionally, after the camera exits, the shared memory pool can be released, with minimal impact. Thanks Rong Qianfeng >> To be honest, I didn't understand your concern "...how drivers should be >> able to fulfill this semantics." Can you please help explain it in more >> detail? >> >> Thanks, >> >> Rong Qianfeng. >> >>>> Thanks >>>> Rong Qianfeng.
在 2024/4/10 23:07, T.J. Mercier 写道: > [You don't often get email from tjmercier@google.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ] > > On Wed, Apr 10, 2024 at 7:22 AM Christian König > <christian.koenig@amd.com> wrote: >> Am 09.04.24 um 18:37 schrieb T.J. Mercier: >>> On Tue, Apr 9, 2024 at 12:34 AM Rong Qianfeng <11065417@vivo.com> wrote: >>>> 在 2024/4/8 15:58, Christian König 写道: >>>>> Am 07.04.24 um 09:50 schrieb Rong Qianfeng: >>>>>> [SNIP] >>>>>>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: >>>>>>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >>>>>>>> offset and len. >>>>>>> You have not given an use case for this so it is a bit hard to >>>>>>> review. And from the existing use cases I don't see why this should >>>>>>> be necessary. >>>>>>> >>>>>>> Even worse from the existing backend implementation I don't even see >>>>>>> how drivers should be able to fulfill this semantics. >>>>>>> >>>>>>> Please explain further, >>>>>>> Christian. >>>>>> Here is a practical case: >>>>>> The user space can allocate a large chunk of dma-buf for >>>>>> self-management, used as a shared memory pool. >>>>>> Small dma-buf can be allocated from this shared memory pool and >>>>>> released back to it after use, thus improving the speed of dma-buf >>>>>> allocation and release. >>>>>> Additionally, custom functionalities such as memory statistics and >>>>>> boundary checking can be implemented in the user space. >>>>>> Of course, the above-mentioned functionalities require the >>>>>> implementation of a partial cache sync interface. >>>>> Well that is obvious, but where is the code doing that? >>>>> >>>>> You can't send out code without an actual user of it. That will >>>>> obviously be rejected. >>>>> >>>>> Regards, >>>>> Christian. >>>> In fact, we have already used the user-level dma-buf memory pool in the >>>> camera shooting scenario on the phone. >>>> >>>> From the test results, The execution time of the photo shooting >>>> algorithm has been reduced from 3.8s to 3s. >>>> >>> For phones, the (out of tree) Android version of the system heap has a >>> page pool connected to a shrinker. >> Well, it should be obvious but I'm going to repeat it here: Submitting >> kernel patches for our of tree code is a rather *extreme* no-go. >> > Sorry I think my comment led to some confusion. I wasn't suggesting > you should take the patch; it's clearly incomplete. I was pointing out > another option to Rong. It appears Rong is creating a single oversized > dma-buf, and subdividing it in userspace to avoid multiple allocations > for multiple buffers. That would lead to a need for a partial sync of > the buffer from userspace. Instead of that, using a heap with a page > pool gets you kind of the same thing with a lot less headache in > userspace, and no need for partial sync. So I wanted to share that > option, and that can go in just Android if necessary without this > patch. Hi T.J. If there is a chance to use this patch on Android, I can explain to you in detail why the user layer needs the dma-buf memory pool. Thanks Rong Qianfeng > >> That in kernel code *must* have an in kernel user is a number one rule. >> >> When somebody violates this rule he pretty much disqualifying himself as >> reliable source of patches since maintainers then have to assume that >> this person tries to submit code which doesn't have a justification to >> be upstream. >> >> So while this actually looks useful from the technical side as long as >> nobody does an implementation based on an upstream driver I absolutely >> have to reject it from the organizational side. >> >> Regards, >> Christian. >> >>> That allows you to skip page >>> allocation without fully pinning the memory like you get when >>> allocating a dma-buf that's way larger than necessary. If it's for a >>> camera maybe you need physically contiguous memory, but it's also >>> possible to set that up. >>> >>> https://android.googlesource.com/kernel/common/+/refs/heads/android14-6.1/drivers/dma-buf/heaps/system_heap.c#377 >>> >>> >>>> To be honest, I didn't understand your concern "...how drivers should be >>>> able to fulfill this semantics." Can you please help explain it in more >>>> detail? >>>> >>>> Thanks, >>>> >>>> Rong Qianfeng. >>>> >>>>>> Thanks >>>>>> Rong Qianfeng.
Am 10.04.24 um 17:07 schrieb T.J. Mercier: > On Wed, Apr 10, 2024 at 7:22 AM Christian König > <christian.koenig@amd.com> wrote: >> Am 09.04.24 um 18:37 schrieb T.J. Mercier: >>> On Tue, Apr 9, 2024 at 12:34 AM Rong Qianfeng <11065417@vivo.com> wrote: >>>> 在 2024/4/8 15:58, Christian König 写道: >>>>> Am 07.04.24 um 09:50 schrieb Rong Qianfeng: >>>>>> [SNIP] >>>>>>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: >>>>>>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >>>>>>>> offset and len. >>>>>>> You have not given an use case for this so it is a bit hard to >>>>>>> review. And from the existing use cases I don't see why this should >>>>>>> be necessary. >>>>>>> >>>>>>> Even worse from the existing backend implementation I don't even see >>>>>>> how drivers should be able to fulfill this semantics. >>>>>>> >>>>>>> Please explain further, >>>>>>> Christian. >>>>>> Here is a practical case: >>>>>> The user space can allocate a large chunk of dma-buf for >>>>>> self-management, used as a shared memory pool. >>>>>> Small dma-buf can be allocated from this shared memory pool and >>>>>> released back to it after use, thus improving the speed of dma-buf >>>>>> allocation and release. >>>>>> Additionally, custom functionalities such as memory statistics and >>>>>> boundary checking can be implemented in the user space. >>>>>> Of course, the above-mentioned functionalities require the >>>>>> implementation of a partial cache sync interface. >>>>> Well that is obvious, but where is the code doing that? >>>>> >>>>> You can't send out code without an actual user of it. That will >>>>> obviously be rejected. >>>>> >>>>> Regards, >>>>> Christian. >>>> In fact, we have already used the user-level dma-buf memory pool in the >>>> camera shooting scenario on the phone. >>>> >>>> From the test results, The execution time of the photo shooting >>>> algorithm has been reduced from 3.8s to 3s. >>>> >>> For phones, the (out of tree) Android version of the system heap has a >>> page pool connected to a shrinker. >> Well, it should be obvious but I'm going to repeat it here: Submitting >> kernel patches for our of tree code is a rather *extreme* no-go. >> > Sorry I think my comment led to some confusion. I wasn't suggesting > you should take the patch; it's clearly incomplete. I was pointing out > another option to Rong. It appears Rong is creating a single oversized > dma-buf, and subdividing it in userspace to avoid multiple allocations > for multiple buffers. That would lead to a need for a partial sync of > the buffer from userspace. Instead of that, using a heap with a page > pool gets you kind of the same thing with a lot less headache in > userspace, and no need for partial sync. So I wanted to share that > option, and that can go in just Android if necessary without this > patch. Ah! Thanks for the clarification and sorry for any noise I created. I mean from the technical side the patch doesn't looks invalid or anything, but there is simply no upstream use case. Regards, Christian. > >> That in kernel code *must* have an in kernel user is a number one rule. >> >> When somebody violates this rule he pretty much disqualifying himself as >> reliable source of patches since maintainers then have to assume that >> this person tries to submit code which doesn't have a justification to >> be upstream. >> >> So while this actually looks useful from the technical side as long as >> nobody does an implementation based on an upstream driver I absolutely >> have to reject it from the organizational side. >> >> Regards, >> Christian. >> >>> That allows you to skip page >>> allocation without fully pinning the memory like you get when >>> allocating a dma-buf that's way larger than necessary. If it's for a >>> camera maybe you need physically contiguous memory, but it's also >>> possible to set that up. >>> >>> https://android.googlesource.com/kernel/common/+/refs/heads/android14-6.1/drivers/dma-buf/heaps/system_heap.c#377 >>> >>> >>>> To be honest, I didn't understand your concern "...how drivers should be >>>> able to fulfill this semantics." Can you please help explain it in more >>>> detail? >>>> >>>> Thanks, >>>> >>>> Rong Qianfeng. >>>> >>>>>> Thanks >>>>>> Rong Qianfeng.
On Thu, Apr 11, 2024 at 1:21 AM Rong Qianfeng <11065417@vivo.com> wrote: > > > 在 2024/4/10 0:37, T.J. Mercier 写道: > > [You don't often get email from tjmercier@google.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ] > > > > On Tue, Apr 9, 2024 at 12:34 AM Rong Qianfeng <11065417@vivo.com> wrote: > >> > >> 在 2024/4/8 15:58, Christian König 写道: > >>> Am 07.04.24 um 09:50 schrieb Rong Qianfeng: > >>>> [SNIP] > >>>>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: > >>>>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with > >>>>>> offset and len. > >>>>> You have not given an use case for this so it is a bit hard to > >>>>> review. And from the existing use cases I don't see why this should > >>>>> be necessary. > >>>>> > >>>>> Even worse from the existing backend implementation I don't even see > >>>>> how drivers should be able to fulfill this semantics. > >>>>> > >>>>> Please explain further, > >>>>> Christian. > >>>> Here is a practical case: > >>>> The user space can allocate a large chunk of dma-buf for > >>>> self-management, used as a shared memory pool. > >>>> Small dma-buf can be allocated from this shared memory pool and > >>>> released back to it after use, thus improving the speed of dma-buf > >>>> allocation and release. > >>>> Additionally, custom functionalities such as memory statistics and > >>>> boundary checking can be implemented in the user space. > >>>> Of course, the above-mentioned functionalities require the > >>>> implementation of a partial cache sync interface. > >>> Well that is obvious, but where is the code doing that? > >>> > >>> You can't send out code without an actual user of it. That will > >>> obviously be rejected. > >>> > >>> Regards, > >>> Christian. > >> In fact, we have already used the user-level dma-buf memory pool in the > >> camera shooting scenario on the phone. > >> > >> From the test results, The execution time of the photo shooting > >> algorithm has been reduced from 3.8s to 3s. > >> > > For phones, the (out of tree) Android version of the system heap has a > > page pool connected to a shrinker. That allows you to skip page > > allocation without fully pinning the memory like you get when > > allocating a dma-buf that's way larger than necessary. If it's for a > > camera maybe you need physically contiguous memory, but it's also > > possible to set that up. > > > > https://android.googlesource.com/kernel/common/+/refs/heads/android14-6.1/drivers/dma-buf/heaps/system_heap.c#377 > > > Thank you for the reminder. > > The page pool of the system heap can meet the needs of most scenarios, > but the camera shooting scenario is quite special. > > Why the camera shooting scenario needs to have a dma-buf memory pool in > the user-level? > > (1) The memory demand is extremely high and time requirements are > stringent. Preallocating for this makes sense to me, whether it is individual buffers or one large one. > (2) The memory in the page pool(system heap) is easily reclaimed or used > by other apps. Yeah, by design I guess. I have seen an implementation where the page pool is proactively refilled after it has been empty for some time which would help in scenarios where the pool is often reclaimed and low/empty. You could add that in a vendor heap. > (3) High concurrent allocation and release (with deferred-free) lead to > high memory usage peaks. Hopefully this is not every frame? I saw enough complaints about the deferred free of pool pages that it hasn't been carried forward since Android 13, so this should be less of a problem on recent kernels. > Additionally, after the camera exits, the shared memory pool can be > released, with minimal impact. Why do you care about the difference here? In one case it's when the buffer refcount goes to 0 and memory is freed immediately, and in the other it's the next time reclaim runs the shrinker. I don't want to add UAPI for DMA_BUF_IOCTL_SYNC_PARTIAL to Android without it being in the upstream kernel. I don't think we can get that without an in-kernel user of dma_buf_begin_cpu_access_partial first, even though your use case wouldn't rely on that in-kernel usage. :\ So if you want to add this to phones for your camera app, then I think your best option is to add a vendor driver which implements this IOCTL and calls the dma_buf_begin_cpu_access_partial functions which are already exported. Best, T.J.
在 2024/4/12 0:52, T.J. Mercier 写道: > On Thu, Apr 11, 2024 at 1:21 AM Rong Qianfeng <11065417@vivo.com> wrote: >> >> 在 2024/4/10 0:37, T.J. Mercier 写道: >>> [You don't often get email from tjmercier@google.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ] >>> >>> On Tue, Apr 9, 2024 at 12:34 AM Rong Qianfeng <11065417@vivo.com> wrote: >>>> 在 2024/4/8 15:58, Christian König 写道: >>>>> Am 07.04.24 um 09:50 schrieb Rong Qianfeng: >>>>>> [SNIP] >>>>>>> Am 13.11.21 um 07:22 schrieb Jianqun Xu: >>>>>>>> Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with >>>>>>>> offset and len. >>>>>>> You have not given an use case for this so it is a bit hard to >>>>>>> review. And from the existing use cases I don't see why this should >>>>>>> be necessary. >>>>>>> >>>>>>> Even worse from the existing backend implementation I don't even see >>>>>>> how drivers should be able to fulfill this semantics. >>>>>>> >>>>>>> Please explain further, >>>>>>> Christian. >>>>>> Here is a practical case: >>>>>> The user space can allocate a large chunk of dma-buf for >>>>>> self-management, used as a shared memory pool. >>>>>> Small dma-buf can be allocated from this shared memory pool and >>>>>> released back to it after use, thus improving the speed of dma-buf >>>>>> allocation and release. >>>>>> Additionally, custom functionalities such as memory statistics and >>>>>> boundary checking can be implemented in the user space. >>>>>> Of course, the above-mentioned functionalities require the >>>>>> implementation of a partial cache sync interface. >>>>> Well that is obvious, but where is the code doing that? >>>>> >>>>> You can't send out code without an actual user of it. That will >>>>> obviously be rejected. >>>>> >>>>> Regards, >>>>> Christian. >>>> In fact, we have already used the user-level dma-buf memory pool in the >>>> camera shooting scenario on the phone. >>>> >>>> From the test results, The execution time of the photo shooting >>>> algorithm has been reduced from 3.8s to 3s. >>>> >>> For phones, the (out of tree) Android version of the system heap has a >>> page pool connected to a shrinker. That allows you to skip page >>> allocation without fully pinning the memory like you get when >>> allocating a dma-buf that's way larger than necessary. If it's for a >>> camera maybe you need physically contiguous memory, but it's also >>> possible to set that up. >>> >>> https://android.googlesource.com/kernel/common/+/refs/heads/android14-6.1/drivers/dma-buf/heaps/system_heap.c#377 >>> >> Thank you for the reminder. >> >> The page pool of the system heap can meet the needs of most scenarios, >> but the camera shooting scenario is quite special. >> >> Why the camera shooting scenario needs to have a dma-buf memory pool in >> the user-level? >> >> (1) The memory demand is extremely high and time requirements are >> stringent. > Preallocating for this makes sense to me, whether it is individual > buffers or one large one. > >> (2) The memory in the page pool(system heap) is easily reclaimed or used >> by other apps. > Yeah, by design I guess. I have seen an implementation where the page > pool is proactively refilled after it has been empty for some time > which would help in scenarios where the pool is often reclaimed and > low/empty. You could add that in a vendor heap. Yeah, a similar feature has already been implemented by vendor. > >> (3) High concurrent allocation and release (with deferred-free) lead to >> high memory usage peaks. > Hopefully this is not every frame? I saw enough complaints about the > deferred free of pool pages that it hasn't been carried forward since > Android 13, so this should be less of a problem on recent kernels. > >> Additionally, after the camera exits, the shared memory pool can be >> released, with minimal impact. > Why do you care about the difference here? In one case it's when the > buffer refcount goes to 0 and memory is freed immediately, and in the > other it's the next time reclaim runs the shrinker. I'm sorry, my description wasn't clear enough. What I meant to explain is that the user-level dma-buf memory pool does not use reserved memory (physically contiguous memory), and the memoryoccupation time is not too long, resulting in a minimal impact on the system. > > > I don't want to add UAPI for DMA_BUF_IOCTL_SYNC_PARTIAL to Android > without it being in the upstream kernel. I don't think we can get that > without an in-kernel user of dma_buf_begin_cpu_access_partial first, > even though your use case wouldn't rely on that in-kernel usage. :\ So > if you want to add this to phones for your camera app, then I think > your best option is to add a vendor driver which implements this IOCTL > and calls the dma_buf_begin_cpu_access_partial functions which are > already exported. Ok, thank you very much for your suggestion. I will definitely take it into consideration. > > Best, > T.J.
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index d9948d58b3f4..78f37f7c3462 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -392,6 +392,7 @@ static long dma_buf_ioctl(struct file *file, { struct dma_buf *dmabuf; struct dma_buf_sync sync; + struct dma_buf_sync_partial sync_p; enum dma_data_direction direction; int ret; @@ -430,6 +431,47 @@ static long dma_buf_ioctl(struct file *file, case DMA_BUF_SET_NAME_B: return dma_buf_set_name(dmabuf, (const char __user *)arg); + case DMA_BUF_IOCTL_SYNC_PARTIAL: + if (copy_from_user(&sync_p, (void __user *) arg, sizeof(sync_p))) + return -EFAULT; + + if (sync_p.len == 0) + return 0; + + if ((sync_p.offset % cache_line_size()) || (sync_p.len % cache_line_size())) + return -EINVAL; + + if (sync_p.len > dmabuf->size || sync_p.offset > dmabuf->size - sync_p.len) + return -EINVAL; + + if (sync_p.flags & ~DMA_BUF_SYNC_VALID_FLAGS_MASK) + return -EINVAL; + + switch (sync_p.flags & DMA_BUF_SYNC_RW) { + case DMA_BUF_SYNC_READ: + direction = DMA_FROM_DEVICE; + break; + case DMA_BUF_SYNC_WRITE: + direction = DMA_TO_DEVICE; + break; + case DMA_BUF_SYNC_RW: + direction = DMA_BIDIRECTIONAL; + break; + default: + return -EINVAL; + } + + if (sync_p.flags & DMA_BUF_SYNC_END) + ret = dma_buf_end_cpu_access_partial(dmabuf, direction, + sync_p.offset, + sync_p.len); + else + ret = dma_buf_begin_cpu_access_partial(dmabuf, direction, + sync_p.offset, + sync_p.len); + + return ret; + default: return -ENOTTY; } diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h index 7f30393b92c3..6236c644624d 100644 --- a/include/uapi/linux/dma-buf.h +++ b/include/uapi/linux/dma-buf.h @@ -47,4 +47,12 @@ struct dma_buf_sync { #define DMA_BUF_SET_NAME_A _IOW(DMA_BUF_BASE, 1, u32) #define DMA_BUF_SET_NAME_B _IOW(DMA_BUF_BASE, 1, u64) +struct dma_buf_sync_partial { + __u64 flags; + __u32 offset; + __u32 len; +}; + +#define DMA_BUF_IOCTL_SYNC_PARTIAL _IOW(DMA_BUF_BASE, 2, struct dma_buf_sync_partial) + #endif
Add DMA_BUF_IOCTL_SYNC_PARTIAL support for user to sync dma-buf with offset and len. Change-Id: I03d2d2e10e48d32aa83c31abade57e0931e1be49 Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> --- drivers/dma-buf/dma-buf.c | 42 ++++++++++++++++++++++++++++++++++++ include/uapi/linux/dma-buf.h | 8 +++++++ 2 files changed, 50 insertions(+)