Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp6072168pxb; Mon, 14 Feb 2022 14:43:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJx8LXgBn1YEeEcy7j+7cJhANgf23I2MOWvtl86zn4TLmavGUeU21Ma9pKZRi0qDAnqtWZhw X-Received: by 2002:a05:6402:2058:: with SMTP id bc24mr1146309edb.106.1644878598581; Mon, 14 Feb 2022 14:43:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1644878598; cv=none; d=google.com; s=arc-20160816; b=HCIkJtqf5N9oLGO/KmazchhSR0Ylldqwln8SURW5odbC95yUopsLqdqJaM1uLPbNUu 5katraJhsRTwn+HM0jh2mPMvTiBeqC4C4UWB8/j8eFL0tO1LMKkB/XfdkYXB7d3wE5xp okVLeFbFTayWp7lGVTVImLoX1YemYd9xA2yfGOBV1FVUWlUk41avCfHuWTVQkX2dMlbT e+pJhl2zw3tjZWAWxKndJQw/yJQemNgDiMqQrCDiTtkJAyQ3sJ+35EsgvlqmmB4DPZKh EaJaGNMCFieVDXgj/onkuUL2MCXjz+NbkdwyNqFnJfB2gPt5kzotpWJymy4xCVoOQs+k XrPQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=IHISBmUOI/ikE6WItRpq9TFUbX44lb92b2lXd2BONMg=; b=fpvFd+kOsh6jGMzGhUg3OsbYvUlVlDVC8ITdhjhHOdHOBEhwXvSxVl1s9STPe83AsS gHea3sJoJl1U0QQGYrCEl2opOjzAvcolL2Md1KIaEmhDcYOtP1l3lwi37nYALxCQRlEH O1jn6wPpsP1OgvpqCZHGbziqxHQpVksv/p1vFkSdsGX/yIoetHS87vh6pq3t+Hry+FSQ Uj4VU3Q7QbkhkLuo46Z8Ym6Zj7qHjHjwSbbuSUgPBuH+1Xpq8L66xZpl6S3O09N6Myi6 6m3dkXv8eAXECJzThiudN4xbHb34V+K1gAxDSEgOKb6UTT7qCM2elNhMIrk7+/zLKG/8 k6cg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=kXzDIbeo; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id qk19si13601906ejc.103.2022.02.14.14.42.50; Mon, 14 Feb 2022 14:43:18 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=kXzDIbeo; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S231834AbiBNW0K (ORCPT + 99 others); Mon, 14 Feb 2022 17:26:10 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:38972 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231234AbiBNW0J (ORCPT ); Mon, 14 Feb 2022 17:26:09 -0500 Received: from mail-ej1-x635.google.com (mail-ej1-x635.google.com [IPv6:2a00:1450:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0A480145AC6 for ; Mon, 14 Feb 2022 14:26:00 -0800 (PST) Received: by mail-ej1-x635.google.com with SMTP id qk11so19928012ejb.2 for ; Mon, 14 Feb 2022 14:25:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=IHISBmUOI/ikE6WItRpq9TFUbX44lb92b2lXd2BONMg=; b=kXzDIbeon23MHLMt55FkUQMNMzpbUwjF4pGEHQVVR8kxY9f8bNkaLn7jE0kbUtbn3L b9kl4UwC8flsLgF3qVMkSmkvmdF1Jt9Kjef1jBBpf5/Zf+a+E7tm2ei87Qd5NbmIKrOF N82gD75TFZH0mtC5IYIsG8oT11N0ErdMbUQ+vDx4iQdPDduvByEYqq0+N85F+cKyEzjH qAJ9CPKDgzdEdqLPAEum3T8FIlDiMJQUosPgAeySYE6owzXoDc9a5wNuN0Re5wGSB2JK +J/lWvtMVPoSlQn5X6RkXil8/6Lfo9tlft0Vb/pupOfjNdjHeBjWfIslcuL+R2HeH5L/ d/2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=IHISBmUOI/ikE6WItRpq9TFUbX44lb92b2lXd2BONMg=; b=mK3vO3+YsXN6uoLOAQ3PW88VBd94lEkZz9I/A41Yqd7IXnzF8zcZi2MGACNMK9QmVV 2NGybv1zqKkkM0g600K8DqK2AuwHyLvGzNlmnj6J+ratC3cAwlqMHmKTrWvRZN0peUpE 71eksU19EgSVAntXmiMan16d/RFXivdj/+00XCH0uohndd3Q+3mW3D/VkDEas7YeiN2U pAShhXvaH3ftXtguOBpdValrjD9jMsvtAkbBt1nLKsL1gQxZ+Q8nGHBi3WU9fK3Ebqii +mNNqVbDyRUCRFu9MevIZ6/XqsbLOrCK/bLeLxikq0mFQmt+LwEVnkM8V9aKikG51etP GFpQ== X-Gm-Message-State: AOAM531ygtpIp4ABoW7ahUMjV5yAmaOLaVqGC6spRKzpKsgyErTXlX72 H3Crr0Eff/q5tLyNK/ULtZ2aagS1Q71em6kyAromNg== X-Received: by 2002:a17:906:51d6:: with SMTP id v22mr734664ejk.446.1644877558320; Mon, 14 Feb 2022 14:25:58 -0800 (PST) MIME-Version: 1.0 References: <20220211161831.3493782-1-tjmercier@google.com> <20220211161831.3493782-7-tjmercier@google.com> In-Reply-To: From: "T.J. Mercier" Date: Mon, 14 Feb 2022 14:25:47 -0800 Message-ID: Subject: Re: [RFC v2 6/6] android: binder: Add a buffer flag to relinquish ownership of fds To: Greg Kroah-Hartman Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Jonathan Corbet , =?UTF-8?B?QXJ2ZSBIasO4bm5ldsOlZw==?= , Todd Kjos , Martijn Coenen , Joel Fernandes , Christian Brauner , Hridya Valsaraju , Suren Baghdasaryan , Sumit Semwal , =?UTF-8?Q?Christian_K=C3=B6nig?= , Benjamin Gaignard , Liam Mark , Laura Abbott , Brian Starkey , John Stultz , Tejun Heo , Zefan Li , Johannes Weiner , Kalesh Singh , Kenny.Ho@amd.com, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org, cgroups@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-17.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE,USER_IN_DEF_DKIM_WL,USER_IN_DEF_SPF_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Feb 11, 2022 at 11:19 PM Greg Kroah-Hartman wrote: > > On Fri, Feb 11, 2022 at 04:18:29PM +0000, T.J. Mercier wrote: > > This patch introduces a buffer flag BINDER_BUFFER_FLAG_SENDER_NO_NEED > > that a process sending an fd array to another process over binder IPC > > can set to relinquish ownership of the fds being sent for memory > > accounting purposes. If the flag is found to be set during the fd array > > translation and the fd is for a DMA-BUF, the buffer is uncharged from > > the sender's cgroup and charged to the receiving process's cgroup > > instead. > > > > It is up to the sending process to ensure that it closes the fds > > regardless of whether the transfer failed or succeeded. > > > > Most graphics shared memory allocations in Android are done by the > > graphics allocator HAL process. On requests from clients, the HAL proce= ss > > allocates memory and sends the fds to the clients over binder IPC. > > The graphics allocator HAL will not retain any references to the > > buffers. When the HAL sets the BINDER_BUFFER_FLAG_SENDER_NO_NEED for fd > > arrays holding DMA-BUF fds, the gpu cgroup controller will be able to > > correctly charge the buffers to the client processes instead of the > > graphics allocator HAL. > > > > From: Hridya Valsaraju > > Signed-off-by: Hridya Valsaraju > > Co-developed-by: T.J. Mercier > > Signed-off-by: T.J. Mercier > > --- > > changes in v2 > > - Move dma-buf cgroup charge transfer from a dma_buf_op defined by ever= y > > heap to a single dma-buf function for all heaps per Daniel Vetter and > > Christian K=C3=B6nig. > > > > drivers/android/binder.c | 26 ++++++++++++++++++++++++++ > > include/uapi/linux/android/binder.h | 1 + > > 2 files changed, 27 insertions(+) > > > > diff --git a/drivers/android/binder.c b/drivers/android/binder.c > > index 8351c5638880..f50d88ded188 100644 > > --- a/drivers/android/binder.c > > +++ b/drivers/android/binder.c > > @@ -42,6 +42,7 @@ > > > > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > > > +#include > > #include > > #include > > #include > > @@ -2482,8 +2483,10 @@ static int binder_translate_fd_array(struct list= _head *pf_head, > > { > > binder_size_t fdi, fd_buf_size; > > binder_size_t fda_offset; > > + bool transfer_gpu_charge =3D false; > > const void __user *sender_ufda_base; > > struct binder_proc *proc =3D thread->proc; > > + struct binder_proc *target_proc =3D t->to_proc; > > int ret; > > > > fd_buf_size =3D sizeof(u32) * fda->num_fds; > > @@ -2521,8 +2524,15 @@ static int binder_translate_fd_array(struct list= _head *pf_head, > > if (ret) > > return ret; > > > > + if (IS_ENABLED(CONFIG_CGROUP_GPU) && > > + parent->flags & BINDER_BUFFER_FLAG_SENDER_NO_NEED) > > + transfer_gpu_charge =3D true; > > + > > for (fdi =3D 0; fdi < fda->num_fds; fdi++) { > > u32 fd; > > + struct dma_buf *dmabuf; > > + struct gpucg *gpucg; > > + > > binder_size_t offset =3D fda_offset + fdi * sizeof(fd); > > binder_size_t sender_uoffset =3D fdi * sizeof(fd); > > > > @@ -2532,6 +2542,22 @@ static int binder_translate_fd_array(struct list= _head *pf_head, > > in_reply_to); > > if (ret) > > return ret > 0 ? -EINVAL : ret; > > + > > + if (!transfer_gpu_charge) > > + continue; > > + > > + dmabuf =3D dma_buf_get(fd); > > + if (IS_ERR(dmabuf)) > > + continue; > > + > > + gpucg =3D gpucg_get(target_proc->tsk); > > + ret =3D dma_buf_charge_transfer(dmabuf, gpucg); > > + if (ret) { > > + pr_warn("%d:%d Unable to transfer DMA-BUF fd char= ge to %d", > > + proc->pid, thread->pid, target_proc->pid)= ; > > + gpucg_put(gpucg); > > + } > > + dma_buf_put(dmabuf); > > } > > return 0; > > } > > diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/a= ndroid/binder.h > > index 3246f2c74696..169fd5069a1a 100644 > > --- a/include/uapi/linux/android/binder.h > > +++ b/include/uapi/linux/android/binder.h > > @@ -137,6 +137,7 @@ struct binder_buffer_object { > > > > enum { > > BINDER_BUFFER_FLAG_HAS_PARENT =3D 0x01, > > + BINDER_BUFFER_FLAG_SENDER_NO_NEED =3D 0x02, > > }; > > > > /* struct binder_fd_array_object - object describing an array of fds i= n a buffer > > -- > > 2.35.1.265.g69c8d7142f-goog > > > > How does userspace know that binder supports this new flag? Sorry, I don't completely follow even after Todd's comment. Doesn't the presence of BINDER_BUFFER_FLAG_SENDER_NO_NEED in the header do this? So wouldn't userspace need to be compiled against the wrong kernel headers for there to be a problem? In that case the allocation would still succeed, but there would be no charge transfer and unfortunately no error code. > And where is the userspace test for this new feature? I tested this on a Pixel after modifying the gralloc implementation to mark allocated buffers as not used by the sender. This required setting the BINDER_BUFFER_FLAG_SENDER_NO_NEED in libhwbinder. That code can be found here: https://android-review.googlesource.com/c/platform/system/libhwbinder/+/191= 0752/1/Parcel.cpp https://android-review.googlesource.com/c/platform/system/libhidl/+/1910611= / Then by inspecting gpu.memory.current files in sysfs I was able to see the memory attributed to processes other than the graphics allocator service. Before this change, several megabytes of memory were attributed to the graphics allocator service but those buffers are actually used by other processes like surfaceflinger, the camera, etc. After the change, the gpu.memory.current amount for the graphics allocator service was 0 and the charges showed up in the gpu.memory.current files for those other processes like this: PID: 764 Process Name: zygote64 system 8192 system-uncached 23191552 PID: 529 Process Name: /system/bin/surfaceflinger system-uncached 109535232 system 92196864 PID: 530 Process Name: /vendor/bin/hw/android.hardware.graphics.allocator@4.0-service system-uncached 0 system 0 sensor_direct_heap 0 PID: 806 Process Name: /apex/com.google.pixel.camera.hal/bin/hw/android.hardware.camera.provider@2= .7-service-google system 1196032 PID: 4608 Process Name: com.google.android.GoogleCamera system 2408448 system-uncached 38887424 sensor_direct_heap 0 PID: 32102 Process Name: com.google.android.googlequicksearchbox:search system-uncached 91279360 system 20480 PID: 2758 Process Name: com.google.android.youtube system-uncached 1662976 system 8192 PID: 2517 Process Name: com.google.android.apps.nexuslauncher system-uncached 115662848 system 122880 PID: 2066 Process Name: com.android.systemui system 86016 system-uncached 37957632 > Isn't there a binder test framework somewhere? Android has the Vendor Test Suite where automated tests could be added for this. Is that what you're thinking of? > > thanks, > > greg k-h