Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp6146606pxb; Mon, 14 Feb 2022 16:52:34 -0800 (PST) X-Google-Smtp-Source: ABdhPJx6tJJuYNHdL0SxLZvZUujkz6mf7AOEH855hZ2LZr/EO702tiygoflcUh0D5SmPq77qISJ4 X-Received: by 2002:a63:1d4:: with SMTP id 203mr1438784pgb.462.1644886354243; Mon, 14 Feb 2022 16:52:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1644886354; cv=none; d=google.com; s=arc-20160816; b=f+TfEdKhm4vfjpDume0lqKe/6ggVSjDai6IaYVYIoCRmGreTwr/DGSHZfpRgCSdDg/ Oh3ylk9LNZKDJWm0JHae2CJfdvhQUBzuenGnHBEj8hDukZ7NOn3IT9Qhv9C1rskTrhmO bElP/X8y1sMZs9AFNJbk2ocw1TZQp2qO+0WdXSJ11x/s/yFEKKnUgkdZ6lARX8AFVeiq NDEltI4WnVbn5iqYJAS0TLFSGH0fACFCiqnLX+isquffdzSdNf9MIz0xY5Dchx3XlEQj MVbseLcJgMH9vM1rNQDowgDIp/QsOlPbx4ofa9FWzHgGhLnKHz/9uvfVgAMDLmohnEiR j4pg== 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=goL4SDS7AKRornMukk78aUmCRfQsSfNIpL54XKAlePs=; b=uHCjurQ5XhnAGkKl2w9h9HrPFxnmFRt22LY1RhpSyZKghHPDgExIvr0Cvx6BloBBmd rpbeBedwULL1xuxP6fBiVYeR1BaKA8Gm6KjTrF8tsu0syKTmQfqCQZkjTrK7UH7zstTK yxPfGPOqLlfZWHrKuvkDK5qgPkq5HiXjP+Bss0DD3n33Qv5N99rZZbBC9djbh6Wo2CiL A0QZQCI0GWryJLpqVSgtXxqlhJoTSKgj7e4J1pvZaMfk6GRAVCmT12ryXcaA6T2L+xL4 /4P+7XhXlRApSSg2djghrL0zbOitih57iFrtTdIhyNyrGenUdhMUCfxWs+moVwvAX8CL Tc7Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="XzWME/tX"; 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 z17si31981247pfh.116.2022.02.14.16.52.18; Mon, 14 Feb 2022 16:52:34 -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="XzWME/tX"; 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 S229798AbiBOAEC (ORCPT + 99 others); Mon, 14 Feb 2022 19:04:02 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:51940 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230167AbiBOAEA (ORCPT ); Mon, 14 Feb 2022 19:04:00 -0500 Received: from mail-ed1-x532.google.com (mail-ed1-x532.google.com [IPv6:2a00:1450:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 21F9D66CA2 for ; Mon, 14 Feb 2022 16:03:51 -0800 (PST) Received: by mail-ed1-x532.google.com with SMTP id f17so29549903edd.2 for ; Mon, 14 Feb 2022 16:03:51 -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=goL4SDS7AKRornMukk78aUmCRfQsSfNIpL54XKAlePs=; b=XzWME/tX9Pwn10nvDtBLix/JWvTxUWXpra89PLWebeGid3kJF+yJ94sCAp3TEJ2Pb7 KG+sCzgGuo2pIRe0MLD2cGyPkH9DnNc4+Ycb3JPr0uTMGORv8lpEhVpJcM44oxYId87N mtZE6Uf/V6v6acN77V0+9wlwvLosHWzh/Ohh4kdpAKLU/nb4OYpkbF+ZHYTD6xz1sO1C gFbbdJdvLk14r+s/gvut3A9KnLjWkee0MkMQ92QylFULzIK2e64RbU0SODfunYR0uoJL dT8C0AKHleHQkF1jN8kfi3K2yMpxQjflv9wArFKb5HhuIO4KJiqOhHiDExOSjEXWShO0 O3lA== 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=goL4SDS7AKRornMukk78aUmCRfQsSfNIpL54XKAlePs=; b=iunkdEuL56wr+5bl+DOsIuPmO+vxJy2YzkV/8o03kf9nVsbf749jiwmjdRD5aHfbQy YGkVJeC2M6uh0ZiF5g791JD4uo2k4wR6F0vTaLvz8F3x3BMRbrnlEId1q1MyEBjzoFiX BA0cpRBPmaIAoIJMT4t0W571oKvPoS8MTBzt5QGiewh4unvl4W2ZWc5NwXHUUYm/bXFS ufkJRafoDBJZ3+MvVTrxA86V8kGa6UA1xbxqp1JXyUqw7y/JqXMYFxppCTEPiMHkrUyV p2WtrLhvTAa3Lgr/x210XcIQWWuKYlu1Dl/GFVtFHJXn73U2lbtEzTVsktyef+b2Rtlj rEtw== X-Gm-Message-State: AOAM531DE2JlxYSbRzSHya6gZIhNPqSqOcy8eDtgTNQiRzQdFvw1Y6rP 6FmcGsXJCACX3uLUAGwd3XoXc5pb80h1p7mV24UETA== X-Received: by 2002:a05:6402:5c9:: with SMTP id n9mr1308182edx.207.1644883429474; Mon, 14 Feb 2022 16:03:49 -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 16:03:38 -0800 Message-ID: Subject: Re: [RFC v2 6/6] android: binder: Add a buffer flag to relinquish ownership of fds To: Todd Kjos Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Jonathan Corbet , Greg Kroah-Hartman , =?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?= , Liam Mark , 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 Mon, Feb 14, 2022 at 1:26 PM Todd Kjos wrote: > > On Fri, Feb 11, 2022 at 8:19 AM 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, > > Is this only needed for the BINDER_TYPE_FDA case (multiple fds)? This > never needs to be done in the BINDER_TYPE_FD case (single fd)? > Currently this is the case as there is no user who would benefit from the single fd case. The only known user is the gralloc HAL which always uses BINDER_TYPE_FDA to send dmabufs. I guess we could move the code into binder_translate_fd if we were willing to bring back binder_fd_object's flags field. This looks possible, but I think it'd be a more intrusive change. > > { > > 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 ch= arge to %d", > > + proc->pid, thread->pid, target_proc->pi= d); > > + 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 > >