From nobody Tue Dec 16 07:27:10 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1EB6BA33 for ; Wed, 7 May 2025 00:10:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746576647; cv=none; b=pEw1rbnS4SA1uk/EXD4EUgOVZOQI1nFYUoRlMuLR7Q/PvlfRrDCWlY9U1eERvYnk+n+jjM1ycgusNShWoMFB2uDcUpRqUM8v0c97AIHMepAb5GjVvmaH+xRV5KxIAZY/HUM20d6wpeOL1JycmM+xM/RmoKTKHc1Xv3zzXoWm1hs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746576647; c=relaxed/simple; bh=ENt9bNqDrtAazaMY+B4/iaikxMlx71ALLPLjwDEqI+c=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=JAw8FjMC9woYVqsQoF7lXVv+A1mck/2AZx3tGTNwf/ubU6OxQY+5BT4xntm+2bqBYROwguzUwumdgXKziVXd7vJeM6x6BWcrkuIBRZlZPeqKCsCRfBoRQnGX8itGsTU2SWqnQqEf2MnEcdtIZBjJFXb5Ure/5IaXEymTZNqRw8c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tjmercier.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=sAmHL/F/; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tjmercier.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="sAmHL/F/" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b0f807421c9so3491122a12.0 for ; Tue, 06 May 2025 17:10:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1746576645; x=1747181445; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=3AT/BLkjp9kSyaWDX07QeDnXSY64MOvBoRMn6GL7z2E=; b=sAmHL/F/3ckILytdC4hjDMZHP14weZK2Dz9p8Wd4lUx+uvPhzJCMGV/BCtzukuYO3D hosfkplEQSEdYt5kVrFzKhNhKB3h6jJgHb+DFl4RP/jULDWPJW9oNWSJ7u0I7xCsdW7r dOI74COjC/BCdH/KD3MWSrnHnakhiB9+m6ydJKJdTRteJ20TtO1XH/8QPCtoIgo6dKfQ qAPz8n6KZQjLgGKnkCkfkwm7fVmCigVr+TrAirlefTtcKBqGL/g2pN9xmnyoLrIE9qyQ 2Ug/AUbsohR/Wy3HTfER5XMVF5OJRcVm+M0dVoeflN27bKJcHCHYHsIVW+SDQowHcY8v Y+vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746576645; x=1747181445; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=3AT/BLkjp9kSyaWDX07QeDnXSY64MOvBoRMn6GL7z2E=; b=v6pJMMzWp6Feml2rmIJ/Q3wExI2mqeN57nFE5WNMVj1+t1YRA8IAWkux+zzFUQLfE7 aq1ERssN6zKmu9zPptRBHhNsdxA7ASbZFxIQaAZDm4VdIDBkdvoRna+qFjUbRU4AtmEB OUNpIyGrQ5RSOieaj71FwZYnE72lBQ9+E7R7OPJzIqM9FXeZZsDKZjSQiqHMzizcYJml yW/VWh9amigGl50rVvtn4qWllK33FkB3PkhNWGoxkMJibDuo9swf2PUj8FfSn+WTdpD/ LITNlhVq52tCVyvifE9hACzAoP32lAaJDGr0kSAu32t6/4LFbTUDWPaN6M1DEI4UXaSW Iwzw== X-Gm-Message-State: AOJu0YxrbGitXGgMM4WtkBpYQLORCWtU3cPJbV1m126axlJThMCjX45m DMvUwpqm0+ZjKUGlicBqA8FYwW7n5Cz09QCxzWyMVhEsYSGbIgXmpw+i1RZ3GiNrwy3neBNKnth nZ580OwO9D/0Mdw== X-Google-Smtp-Source: AGHT+IGjv/c2fzF3ZsIcOt5Mn1/YxqtlksyqIqxhrRJxhS2Uqg6AkhPc6dULFKkD5F2xqt9stbeixjUXT9WMVA0= X-Received: from pji12.prod.google.com ([2002:a17:90b:3fcc:b0:2fc:c98:ea47]) (user=tjmercier job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:e7d1:b0:2fc:3264:3666 with SMTP id 98e67ed59e1d1-30aac29bfd7mr1774601a91.30.1746576645059; Tue, 06 May 2025 17:10:45 -0700 (PDT) Date: Wed, 7 May 2025 00:10:32 +0000 In-Reply-To: <20250507001036.2278781-1-tjmercier@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250507001036.2278781-1-tjmercier@google.com> X-Mailer: git-send-email 2.49.0.1045.g170613ef41-goog Message-ID: <20250507001036.2278781-2-tjmercier@google.com> Subject: [PATCH bpf-next v3 1/5] dma-buf: Rename debugfs symbols From: "T.J. Mercier" To: sumit.semwal@linaro.org, christian.koenig@amd.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, skhan@linuxfoundation.org, alexei.starovoitov@gmail.com, song@kernel.org Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, android-mm@google.com, simona@ffwll.ch, eddyz87@gmail.com, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, jolsa@kernel.org, mykolal@fb.com, "T.J. Mercier" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename the debugfs list and mutex so it's clear they are now usable without the need for CONFIG_DEBUG_FS. The list will always be populated to support the creation of a BPF iterator for dmabufs. Signed-off-by: T.J. Mercier Reviewed-by: Christian K=C3=B6nig --- drivers/dma-buf/dma-buf.c | 40 +++++++++++++++------------------------ include/linux/dma-buf.h | 2 -- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index 5baa83b85515..8d151784e302 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -35,35 +35,25 @@ =20 static inline int is_dma_buf_file(struct file *); =20 -#if IS_ENABLED(CONFIG_DEBUG_FS) -static DEFINE_MUTEX(debugfs_list_mutex); -static LIST_HEAD(debugfs_list); +static DEFINE_MUTEX(dmabuf_list_mutex); +static LIST_HEAD(dmabuf_list); =20 -static void __dma_buf_debugfs_list_add(struct dma_buf *dmabuf) +static void __dma_buf_list_add(struct dma_buf *dmabuf) { - mutex_lock(&debugfs_list_mutex); - list_add(&dmabuf->list_node, &debugfs_list); - mutex_unlock(&debugfs_list_mutex); + mutex_lock(&dmabuf_list_mutex); + list_add(&dmabuf->list_node, &dmabuf_list); + mutex_unlock(&dmabuf_list_mutex); } =20 -static void __dma_buf_debugfs_list_del(struct dma_buf *dmabuf) +static void __dma_buf_list_del(struct dma_buf *dmabuf) { if (!dmabuf) return; =20 - mutex_lock(&debugfs_list_mutex); + mutex_lock(&dmabuf_list_mutex); list_del(&dmabuf->list_node); - mutex_unlock(&debugfs_list_mutex); + mutex_unlock(&dmabuf_list_mutex); } -#else -static void __dma_buf_debugfs_list_add(struct dma_buf *dmabuf) -{ -} - -static void __dma_buf_debugfs_list_del(struct dma_buf *dmabuf) -{ -} -#endif =20 static char *dmabuffs_dname(struct dentry *dentry, char *buffer, int bufle= n) { @@ -115,7 +105,7 @@ static int dma_buf_file_release(struct inode *inode, st= ruct file *file) if (!is_dma_buf_file(file)) return -EINVAL; =20 - __dma_buf_debugfs_list_del(file->private_data); + __dma_buf_list_del(file->private_data); =20 return 0; } @@ -689,7 +679,7 @@ struct dma_buf *dma_buf_export(const struct dma_buf_exp= ort_info *exp_info) file->f_path.dentry->d_fsdata =3D dmabuf; dmabuf->file =3D file; =20 - __dma_buf_debugfs_list_add(dmabuf); + __dma_buf_list_add(dmabuf); =20 return dmabuf; =20 @@ -1630,7 +1620,7 @@ static int dma_buf_debug_show(struct seq_file *s, voi= d *unused) size_t size =3D 0; int ret; =20 - ret =3D mutex_lock_interruptible(&debugfs_list_mutex); + ret =3D mutex_lock_interruptible(&dmabuf_list_mutex); =20 if (ret) return ret; @@ -1639,7 +1629,7 @@ static int dma_buf_debug_show(struct seq_file *s, voi= d *unused) seq_printf(s, "%-8s\t%-8s\t%-8s\t%-8s\texp_name\t%-8s\tname\n", "size", "flags", "mode", "count", "ino"); =20 - list_for_each_entry(buf_obj, &debugfs_list, list_node) { + list_for_each_entry(buf_obj, &dmabuf_list, list_node) { =20 ret =3D dma_resv_lock_interruptible(buf_obj->resv, NULL); if (ret) @@ -1676,11 +1666,11 @@ static int dma_buf_debug_show(struct seq_file *s, v= oid *unused) =20 seq_printf(s, "\nTotal %d objects, %zu bytes\n", count, size); =20 - mutex_unlock(&debugfs_list_mutex); + mutex_unlock(&dmabuf_list_mutex); return 0; =20 error_unlock: - mutex_unlock(&debugfs_list_mutex); + mutex_unlock(&dmabuf_list_mutex); return ret; } =20 diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index 36216d28d8bd..8ff4add71f88 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h @@ -370,10 +370,8 @@ struct dma_buf { */ struct module *owner; =20 -#if IS_ENABLED(CONFIG_DEBUG_FS) /** @list_node: node for dma_buf accounting and debugging. */ struct list_head list_node; -#endif =20 /** @priv: exporter specific private data for this buffer object. */ void *priv; --=20 2.49.0.1045.g170613ef41-goog From nobody Tue Dec 16 07:27:10 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 21F6DBE4E for ; Wed, 7 May 2025 00:10:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746576649; cv=none; b=A9/qHf4XUvssu5vuXtEHxZJKx9gnKQPSoomjdMtfXvl2+Gf+ZGaQrHMb3Q/0KxOS87opwEXChbaVZBLVNf/AkxaHUly/zmdLFNIqz1EinK1H9SKEoqQPD1KGYrf42FZxtgKtcJ8yeWoaoM175T3k4avA5dk2Sum7lB8ZU8ihDqw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746576649; c=relaxed/simple; bh=GtprxiIp9QPv7QUqV5NZztK4owcRpS325n/d3dKhKjY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=GbDfNznbxGiOTJAjcTn0sNM6tnCEO5GuGqDBhSIhY+EcaWgQSOX2N7I3ldhKUfdAeWi3Kzasktp12HeVvlxif/6cXJDVUIu1IrItsii0Ma2c73X6eN3htsfa56TCridGet7aOnSkuixXBOsDxtjvtVPkwPtdy6j0SHzmSq3fmQs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tjmercier.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=iFe53FlM; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tjmercier.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="iFe53FlM" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ff6167e9ccso7099905a91.1 for ; Tue, 06 May 2025 17:10:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1746576647; x=1747181447; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=J2Exutn/ZWXBPWobLv3f+bgAg3/+JyztWu0aq/wV+8U=; b=iFe53FlMKniurYy9wOmqsNlyeDKz2Um1/Ulxy/p/dXqSmLb1kDenB+4z0H4FP8KEv0 r+meGJJBQnd71umHwS4iS8hRDw2oEEH6VaxVsDGbPqb0CHyRDv+TlAtmc2vB4eewSn8R hXpqVK/gn4bxmWSQv6+lZNuVJpY1w7u61DFFnY+WEiL/Xiq264wqWHan8c/6hQ5zxG0Y B6lViwg2Hua+DTRo6Mlg0R3JPZxsQX9t13ip263i5QSmHuA5HC2k6y9vd2ZneOQLWTqS xSbLQP37wUAH4/nzWUIMBpp6Ahoidw9QC28TnIAeRm1PTCoxcFjuAbT3meHemAedVn3t TL1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746576647; x=1747181447; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=J2Exutn/ZWXBPWobLv3f+bgAg3/+JyztWu0aq/wV+8U=; b=OhBBcdtoCrOFy8wqUrOQ/Ux9jyKHWUETkkmFDf3HW4nFb/4vrYxaubnN594XBQlJGn jgj18r9ZzCaCveMTXTHZ3cRB2A4zBYImfbgoJ/YFyRNFOwg7XONTcppWAOnOU4CzKAHD PPY2Y5DeoLBeaxjBklesXk6DFNLmQJl3M9t8hvjL+ZC5GBc4k9vSfYfX+mqVmkMeljCk qpVPQooQKb7EWMXEd1VUf1yVZe7tBBDUxDS/nxfdzUZD8ajtWOL8UAMxTnZkR3pHntoj 0lCVMoc7M92XN/kDFCKAcQBVJIJ0znPUb+ezS/6kqRDalVlGro7qnpysaP2bjjJ/7J0k dYMQ== X-Gm-Message-State: AOJu0YyqZBef+0ylAE2O0Sez7WuqJsH+biID0XbjVqvWbG6JI0uWHatH W9bA3ZlH8rVmssvuqmgcT1ZVQUQnuhuuQmvVW4E3EPziTEprjkPq7OYDgRWVBwZzWzRkU337RjG U7kP+tkny2I9KSA== X-Google-Smtp-Source: AGHT+IFL0AeKYJWX5uQDx4vtlik1jrjuYKA2AIFKy1hdyB/rg+TpkzIfgKkb1XNyAaj5vjstqCOldZHytqVX2N0= X-Received: from pjf8.prod.google.com ([2002:a17:90b:3f08:b0:30a:8830:9f6b]) (user=tjmercier job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2249:b0:2ee:c291:765a with SMTP id 98e67ed59e1d1-30aac179571mr2222024a91.8.1746576647544; Tue, 06 May 2025 17:10:47 -0700 (PDT) Date: Wed, 7 May 2025 00:10:33 +0000 In-Reply-To: <20250507001036.2278781-1-tjmercier@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250507001036.2278781-1-tjmercier@google.com> X-Mailer: git-send-email 2.49.0.1045.g170613ef41-goog Message-ID: <20250507001036.2278781-3-tjmercier@google.com> Subject: [PATCH bpf-next v3 2/5] bpf: Add dmabuf iterator From: "T.J. Mercier" To: sumit.semwal@linaro.org, christian.koenig@amd.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, skhan@linuxfoundation.org, alexei.starovoitov@gmail.com, song@kernel.org Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, android-mm@google.com, simona@ffwll.ch, eddyz87@gmail.com, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, jolsa@kernel.org, mykolal@fb.com, "T.J. Mercier" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The dmabuf iterator traverses the list of all DMA buffers. DMA buffers are refcounted through their associated struct file. A reference is taken on each buffer as the list is iterated to ensure each buffer persists for the duration of the bpf program execution without holding the list mutex. Signed-off-by: T.J. Mercier --- drivers/dma-buf/dma-buf.c | 64 ++++++++++++++++++++++++ include/linux/dma-buf.h | 3 ++ kernel/bpf/Makefile | 3 ++ kernel/bpf/dmabuf_iter.c | 102 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 kernel/bpf/dmabuf_iter.c diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index 8d151784e302..9fee2788924e 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -19,7 +19,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -55,6 +57,68 @@ static void __dma_buf_list_del(struct dma_buf *dmabuf) mutex_unlock(&dmabuf_list_mutex); } =20 +/** + * get_first_dmabuf - begin iteration through global list of DMA-bufs + * + * Returns the first buffer in the global list of DMA-bufs that's not in t= he + * process of being destroyed. Increments that buffer's reference count to + * prevent buffer destruction. Callers must release the reference, either = by + * continuing iteration with get_next_dmabuf(), or with dma_buf_put(). + * + * Returns NULL If no active buffers are present. + */ +struct dma_buf *get_first_dmabuf(void) +{ + struct dma_buf *ret =3D NULL, *dmabuf; + + /* + * The list mutex does not protect a dmabuf's refcount, so it can be + * zeroed while we are iterating. We cannot call get_dma_buf() since the + * caller may not already own a reference to the buffer. + */ + mutex_lock(&dmabuf_list_mutex); + list_for_each_entry(dmabuf, &dmabuf_list, list_node) { + if (file_ref_get(&dmabuf->file->f_ref)) { + ret =3D dmabuf; + break; + } + } + mutex_unlock(&dmabuf_list_mutex); + return ret; +} + +/** + * get_next_dmabuf - continue iteration through global list of DMA-bufs + * @dmabuf: [in] pointer to dma_buf + * + * Decrements the reference count on the provided buffer. Returns the next + * buffer from the remainder of the global list of DMA-bufs with its refer= ence + * count incremented. Callers must release the reference, either by contin= uing + * iteration with get_next_dmabuf(), or with dma_buf_put(). + * + * Returns NULL If no additional active buffers are present. + */ +struct dma_buf *get_next_dmabuf(struct dma_buf *dmabuf) +{ + struct dma_buf *ret =3D NULL; + + /* + * The list mutex does not protect a dmabuf's refcount, so it can be + * zeroed while we are iterating. We cannot call get_dma_buf() since the + * caller may not already own a reference to the buffer. + */ + mutex_lock(&dmabuf_list_mutex); + dma_buf_put(dmabuf); + list_for_each_entry_continue(dmabuf, &dmabuf_list, list_node) { + if (file_ref_get(&dmabuf->file->f_ref)) { + ret =3D dmabuf; + break; + } + } + mutex_unlock(&dmabuf_list_mutex); + return ret; +} + static char *dmabuffs_dname(struct dentry *dentry, char *buffer, int bufle= n) { struct dma_buf *dmabuf; diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index 8ff4add71f88..1820f6db6e58 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h @@ -568,6 +568,9 @@ static inline void get_dma_buf(struct dma_buf *dmabuf) get_file(dmabuf->file); } =20 +struct dma_buf *get_first_dmabuf(void); +struct dma_buf *get_next_dmabuf(struct dma_buf *dmbuf); + /** * dma_buf_is_dynamic - check if a DMA-buf uses dynamic mappings. * @dmabuf: the DMA-buf to check diff --git a/kernel/bpf/Makefile b/kernel/bpf/Makefile index 70502f038b92..3a335c50e6e3 100644 --- a/kernel/bpf/Makefile +++ b/kernel/bpf/Makefile @@ -53,6 +53,9 @@ obj-$(CONFIG_BPF_SYSCALL) +=3D relo_core.o obj-$(CONFIG_BPF_SYSCALL) +=3D btf_iter.o obj-$(CONFIG_BPF_SYSCALL) +=3D btf_relocate.o obj-$(CONFIG_BPF_SYSCALL) +=3D kmem_cache_iter.o +ifeq ($(CONFIG_DMA_SHARED_BUFFER),y) +obj-$(CONFIG_BPF_SYSCALL) +=3D dmabuf_iter.o +endif =20 CFLAGS_REMOVE_percpu_freelist.o =3D $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_bpf_lru_list.o =3D $(CC_FLAGS_FTRACE) diff --git a/kernel/bpf/dmabuf_iter.c b/kernel/bpf/dmabuf_iter.c new file mode 100644 index 000000000000..80bca8239c6d --- /dev/null +++ b/kernel/bpf/dmabuf_iter.c @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright (c) 2025 Google LLC */ +#include +#include +#include +#include +#include + +BTF_ID_LIST_SINGLE(bpf_dmabuf_btf_id, struct, dma_buf) +DEFINE_BPF_ITER_FUNC(dmabuf, struct bpf_iter_meta *meta, struct dma_buf *d= mabuf) + +static void *dmabuf_iter_seq_start(struct seq_file *seq, loff_t *pos) +{ + if (*pos) + return NULL; + + return get_first_dmabuf(); +} + +static void *dmabuf_iter_seq_next(struct seq_file *seq, void *v, loff_t *p= os) +{ + struct dma_buf *dmabuf =3D v; + + ++*pos; + + return get_next_dmabuf(dmabuf); +} + +struct bpf_iter__dmabuf { + __bpf_md_ptr(struct bpf_iter_meta *, meta); + __bpf_md_ptr(struct dma_buf *, dmabuf); +}; + +static int __dmabuf_seq_show(struct seq_file *seq, void *v, bool in_stop) +{ + struct bpf_iter_meta meta =3D { + .seq =3D seq, + }; + struct bpf_iter__dmabuf ctx =3D { + .meta =3D &meta, + .dmabuf =3D v, + }; + struct bpf_prog *prog =3D bpf_iter_get_info(&meta, in_stop); + + if (prog) + return bpf_iter_run_prog(prog, &ctx); + + return 0; +} + +static int dmabuf_iter_seq_show(struct seq_file *seq, void *v) +{ + return __dmabuf_seq_show(seq, v, false); +} + +static void dmabuf_iter_seq_stop(struct seq_file *seq, void *v) +{ + struct dma_buf *dmabuf =3D v; + + if (dmabuf) + dma_buf_put(dmabuf); +} + +static const struct seq_operations dmabuf_iter_seq_ops =3D { + .start =3D dmabuf_iter_seq_start, + .next =3D dmabuf_iter_seq_next, + .stop =3D dmabuf_iter_seq_stop, + .show =3D dmabuf_iter_seq_show, +}; + +static void bpf_iter_dmabuf_show_fdinfo(const struct bpf_iter_aux_info *au= x, + struct seq_file *seq) +{ + seq_puts(seq, "dmabuf iter\n"); +} + +static const struct bpf_iter_seq_info dmabuf_iter_seq_info =3D { + .seq_ops =3D &dmabuf_iter_seq_ops, + .init_seq_private =3D NULL, + .fini_seq_private =3D NULL, + .seq_priv_size =3D 0, +}; + +static struct bpf_iter_reg bpf_dmabuf_reg_info =3D { + .target =3D "dmabuf", + .feature =3D BPF_ITER_RESCHED, + .show_fdinfo =3D bpf_iter_dmabuf_show_fdinfo, + .ctx_arg_info_size =3D 1, + .ctx_arg_info =3D { + { offsetof(struct bpf_iter__dmabuf, dmabuf), + PTR_TO_BTF_ID_OR_NULL }, + }, + .seq_info =3D &dmabuf_iter_seq_info, +}; + +static int __init dmabuf_iter_init(void) +{ + bpf_dmabuf_reg_info.ctx_arg_info[0].btf_id =3D bpf_dmabuf_btf_id[0]; + return bpf_iter_reg_target(&bpf_dmabuf_reg_info); +} + +late_initcall(dmabuf_iter_init); --=20 2.49.0.1045.g170613ef41-goog From nobody Tue Dec 16 07:27:10 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A90182AE8D for ; Wed, 7 May 2025 00:10:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746576652; cv=none; b=FoT5Va3mMZtWKH/rluVpZD84YbqWa79gPOoB20puRBz2jk8rcrlRhZMzPZlm06sLi3t5HawsmfUVzbD24NdfqU9CXg9eMLomNQdSiRLtl88TQRKjzW1nHTU5Vl+ILCgqr2KFzd4HaFSMeq1K99Zl1dBJC6bfKoRpOuzmjjnbd+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746576652; c=relaxed/simple; bh=pyse2+fm36nrb8svFIqyM73W2uIjgmXGZFlVg/8fUik=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jJ+ZkHT5yGBgOJJHnz5p9/XnRbdBwC2lvGUGBfvqYKd9E0BRI7wXF/Q3Y2uCxlAPZawrFQDwXyKfQ1vZz/5+Y4BPmcSMojlZMH0BJFMN1OAuII7jPR8sEEvgbMqsoIj+Vq2qpNHG0I5YsQyR9foV0Og8laP9xLIRx4TpMu6smb0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tjmercier.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=TmPVv/Ix; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tjmercier.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="TmPVv/Ix" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-22651aca434so51274465ad.1 for ; Tue, 06 May 2025 17:10:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1746576650; x=1747181450; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=SkxID+WP7mb4sg4ZUV6PaZg3RytzLGPGnjFriQZ17Hk=; b=TmPVv/IxE+dGkeNFkVIjRbpAcx+Lb38uM2KaL3fYaffMXCOO7Jm7WjXYSKxVf+gTEz mwLP84RgxcpuATRe6ave9DGu/lkNCGUoqnyxm1tX1pr1KTSsnXgFZmcb09IYI1lWvjWU S2kniz9scC3wOqg4RfStqBNbSCEo5IvOQwVeAgM4yZBT4WF8n67ivVojYNidD3xvGYQh LA6TVHDRZQl8Os5dFVKf1rhEbZfuv3mTCM24WkJDJALDNJhUwAiqSDzqU3rN8fWL/3Gs BypoGKT9Ts2B06hGw6gmqHnFmwW54U8VHbyG0mWAWsMOErBe+G9VtpiTUmguADjaODf+ lhyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746576650; x=1747181450; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=SkxID+WP7mb4sg4ZUV6PaZg3RytzLGPGnjFriQZ17Hk=; b=NBNHed84funJW1akksPJmaAcM4hqahXVyVJENQ6x4Wc1M32jv0SgPEZasW53byYtZv s8Uffeh+/+2ztFu0zOpyJL1fHsspMotIUGUBBK6wxVMjwI9A6ApiavXm5W2N9hHdN+RE D6MNvp9S5dhE01x9FtPM1IJJ0i+rGXCcDzDNBoRVCMbL4DBSiBy7vZqyjTI4rgUzwDP/ pDCl0M1XaEZ8CPDc5HW/K1EjcNQNI+D3nP93ANe1zOxGw5PrrTko8y+WBILM4Ow5IOiD nE6OfGjmRIhlqqUs0cTJg/m4+t2J1A2oO/2fAzqdaZvFcChczCAkGaR8/nAFrwL0Lvrv iFMg== X-Gm-Message-State: AOJu0Yz1VqkCqgXZ7QjP4wY4trnfAY2z7sWn8MzVOAq8UVAytkULu9R8 JG0LfFjxG0Q5dWTRbYyCqX+CeBnMQDJISmYuMZo1FJawwwmFjSnOtcky6zCPG1RqnUn9QzTvOVe NZPLzPjwAOKv9ug== X-Google-Smtp-Source: AGHT+IEx7hDcQzk8ELF2Wf/YDX+04BAayFsjqz8ketxueOqk4IMFJhrgD4+bT2AOspb/6AKarjrhAJ8dHZy5bPA= X-Received: from pjbsi7.prod.google.com ([2002:a17:90b:5287:b0:2fb:fa85:1678]) (user=tjmercier job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ecc6:b0:22e:1740:e561 with SMTP id d9443c01a7336-22e5ea501ccmr19570925ad.19.1746576649869; Tue, 06 May 2025 17:10:49 -0700 (PDT) Date: Wed, 7 May 2025 00:10:34 +0000 In-Reply-To: <20250507001036.2278781-1-tjmercier@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250507001036.2278781-1-tjmercier@google.com> X-Mailer: git-send-email 2.49.0.1045.g170613ef41-goog Message-ID: <20250507001036.2278781-4-tjmercier@google.com> Subject: [PATCH bpf-next v3 3/5] bpf: Add open coded dmabuf iterator From: "T.J. Mercier" To: sumit.semwal@linaro.org, christian.koenig@amd.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, skhan@linuxfoundation.org, alexei.starovoitov@gmail.com, song@kernel.org Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, android-mm@google.com, simona@ffwll.ch, eddyz87@gmail.com, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, jolsa@kernel.org, mykolal@fb.com, "T.J. Mercier" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This open coded iterator allows for more flexibility when creating BPF programs. It can support output in formats other than text. With an open coded iterator, a single BPF program can traverse multiple kernel data structures (now including dmabufs), allowing for more efficient analysis of kernel data compared to multiple reads from procfs, sysfs, or multiple traditional BPF iterator invocations. Signed-off-by: T.J. Mercier --- kernel/bpf/dmabuf_iter.c | 47 ++++++++++++++++++++++++++++++++++++++++ kernel/bpf/helpers.c | 5 +++++ 2 files changed, 52 insertions(+) diff --git a/kernel/bpf/dmabuf_iter.c b/kernel/bpf/dmabuf_iter.c index 80bca8239c6d..b0478b4875ed 100644 --- a/kernel/bpf/dmabuf_iter.c +++ b/kernel/bpf/dmabuf_iter.c @@ -100,3 +100,50 @@ static int __init dmabuf_iter_init(void) } =20 late_initcall(dmabuf_iter_init); + +struct bpf_iter_dmabuf { + /* opaque iterator state; having __u64 here allows to preserve correct + * alignment requirements in vmlinux.h, generated from BTF + */ + __u64 __opaque[1]; +} __aligned(8); + +/* Non-opaque version of bpf_iter_dmabuf */ +struct bpf_iter_dmabuf_kern { + struct dma_buf *dmabuf; +} __aligned(8); + +__bpf_kfunc_start_defs(); + +__bpf_kfunc int bpf_iter_dmabuf_new(struct bpf_iter_dmabuf *it) +{ + struct bpf_iter_dmabuf_kern *kit =3D (void *)it; + + BUILD_BUG_ON(sizeof(*kit) > sizeof(*it)); + BUILD_BUG_ON(__alignof__(*kit) !=3D __alignof__(*it)); + + kit->dmabuf =3D NULL; + return 0; +} + +__bpf_kfunc struct dma_buf *bpf_iter_dmabuf_next(struct bpf_iter_dmabuf *i= t) +{ + struct bpf_iter_dmabuf_kern *kit =3D (void *)it; + + if (kit->dmabuf) + kit->dmabuf =3D get_next_dmabuf(kit->dmabuf); + else + kit->dmabuf =3D get_first_dmabuf(); + + return kit->dmabuf; +} + +__bpf_kfunc void bpf_iter_dmabuf_destroy(struct bpf_iter_dmabuf *it) +{ + struct bpf_iter_dmabuf_kern *kit =3D (void *)it; + + if (kit->dmabuf) + dma_buf_put(kit->dmabuf); +} + +__bpf_kfunc_end_defs(); diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index 78cefb41266a..39fe63016868 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -3346,6 +3346,11 @@ BTF_ID_FLAGS(func, bpf_iter_kmem_cache_next, KF_ITER= _NEXT | KF_RET_NULL | KF_SLE BTF_ID_FLAGS(func, bpf_iter_kmem_cache_destroy, KF_ITER_DESTROY | KF_SLEEP= ABLE) BTF_ID_FLAGS(func, bpf_local_irq_save) BTF_ID_FLAGS(func, bpf_local_irq_restore) +#ifdef CONFIG_DMA_SHARED_BUFFER +BTF_ID_FLAGS(func, bpf_iter_dmabuf_new, KF_ITER_NEW | KF_SLEEPABLE) +BTF_ID_FLAGS(func, bpf_iter_dmabuf_next, KF_ITER_NEXT | KF_RET_NULL | KF_S= LEEPABLE) +BTF_ID_FLAGS(func, bpf_iter_dmabuf_destroy, KF_ITER_DESTROY | KF_SLEEPABLE) +#endif BTF_KFUNCS_END(common_btf_ids) =20 static const struct btf_kfunc_id_set common_kfunc_set =3D { --=20 2.49.0.1045.g170613ef41-goog From nobody Tue Dec 16 07:27:10 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F2D6F35976 for ; Wed, 7 May 2025 00:10:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746576654; cv=none; b=MGilMD+4B4tx7OO6mqrpo/jixnimPx0wDIauXzTqmMutEV6DD5puPz4RyAobQ5zmROfBCdxyc2Z1Xy8qFJDzRlotwDcrZnPEazsIYB65NzfuBz2t78vUAcfNSjOgmhTKfMvxMmaWCUoXcJvqYlYVkR1l2z5hZW3qt/eBZpBviXs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746576654; c=relaxed/simple; bh=JqRu074ozUddd8kemDckp4rr15I64ivUzyflAGOFfko=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=oGaxQfy/NyvezbAf2HLfeF1290giSVqj9XW6Nu4teiLxes8mWpR79c7Ds2HrtBBfONJ7akhhneOGw+mof7CEjxgrIYMPvYxuiR+dLgLIFyyVoZ5W77gsOMeHDdrDmlgi+fyNc3f5PRWZEH93yyIY6fSC05LMt1Z3l5sDIlc74ks= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tjmercier.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=gfo4kGs0; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tjmercier.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="gfo4kGs0" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b16837f1874so3631748a12.2 for ; Tue, 06 May 2025 17:10:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1746576652; x=1747181452; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=9aSEG6reue+mhB8A31rxfEwcd9FhIVy9ERXqn2E21Vw=; b=gfo4kGs0E2badJoS5B5Ua5mKUUipOKPpKzzr5DuUQUQWeK2Xj3YEKECYLvYiX2cX3T 4gGuhdsgpRfHXUT9shjSSLQbX3PKZmth1Q7DDWwW7G1Fe+/G/kQY/nFr9cKrq+zDyady gQ41tef4ji3AwchKwHK2/xtHdfx7y/tCYGFwZJTnPhvWbNYY3bvujZ0yc/Mq2O46j21Y Sfuk14YwNCUiMiNFzcsJtohV3Z1CqWAupNy2g/hIT4i/CrGVkPdVU7aDZrHl+CUlbOO+ zrr8x7gQ4xjCwmzN1iGVP93wl0sY/T4Lm9PLKOCSAPxH8U0UdW9NjSguYn3Aetur1ir/ WohA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746576652; x=1747181452; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=9aSEG6reue+mhB8A31rxfEwcd9FhIVy9ERXqn2E21Vw=; b=TcuFIOIRjfsXHtz3WskjFYnavnI5qn6Ju5Z/UBNfXTmZ0TUD8cJtDKCb8+UZtDIygF nqz32PWpiqaLnYkF4+Lr/bEMt23wIR1svTJsoWV9BT6qDTpM6L2oDg0HlJhwUJop426w bNtDCCLA0/GDM0NcdiLcOrQ6PaeqlpHWT3fUsDIqHcWoRA7vsGTjgTZsXX+evgwJVpRU H0qoy06+GjFT96+bPxfSrjsqnw2WFZ1yH2DV2ekztKDH/IOnUkd0MRT5+jAXkhP5jdy7 12MscyyUvbVbQZvIvQZUHVXta704M2Bd2na4e6Gu4GLrmPrJpUZ/fqE1x1pRM8IujUul om5g== X-Gm-Message-State: AOJu0Yy2V2pIuoZ37waCeH0RTNwcXdiOLCwiCG5l4EEaJl3YwHJB13fM iOpJ18j7bb+cPkE4a6mFdfbnl57k6suinVscrDeKfQ9h/1ZfZm1rH8LVamhAvcN2wx1DF9L3Sdy 9DEAgxmXjFYPXAQ== X-Google-Smtp-Source: AGHT+IFFCLXIRuU4DBH/dPfISrZqj5UKsNOljdqhI2H24qPNDHVlFWApcakm1qhmpAiXiOLveDPBfUiXDQZpa0M= X-Received: from pjj15.prod.google.com ([2002:a17:90b:554f:b0:2ff:84e6:b2bd]) (user=tjmercier job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:554e:b0:2ff:6e72:b8e9 with SMTP id 98e67ed59e1d1-30aac2837bcmr2137461a91.25.1746576652176; Tue, 06 May 2025 17:10:52 -0700 (PDT) Date: Wed, 7 May 2025 00:10:35 +0000 In-Reply-To: <20250507001036.2278781-1-tjmercier@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250507001036.2278781-1-tjmercier@google.com> X-Mailer: git-send-email 2.49.0.1045.g170613ef41-goog Message-ID: <20250507001036.2278781-5-tjmercier@google.com> Subject: [PATCH bpf-next v3 4/5] selftests/bpf: Add test for dmabuf_iter From: "T.J. Mercier" To: sumit.semwal@linaro.org, christian.koenig@amd.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, skhan@linuxfoundation.org, alexei.starovoitov@gmail.com, song@kernel.org Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, android-mm@google.com, simona@ffwll.ch, eddyz87@gmail.com, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, jolsa@kernel.org, mykolal@fb.com, "T.J. Mercier" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This test creates a udmabuf, and a dmabuf from the system dmabuf heap, and uses a BPF program that prints dmabuf metadata with the new dmabuf_iter to verify they can be found. Signed-off-by: T.J. Mercier --- tools/testing/selftests/bpf/config | 3 + .../selftests/bpf/prog_tests/dmabuf_iter.c | 224 ++++++++++++++++++ .../testing/selftests/bpf/progs/dmabuf_iter.c | 53 +++++ 3 files changed, 280 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c create mode 100644 tools/testing/selftests/bpf/progs/dmabuf_iter.c diff --git a/tools/testing/selftests/bpf/config b/tools/testing/selftests/b= pf/config index c378d5d07e02..2bdff2f3285f 100644 --- a/tools/testing/selftests/bpf/config +++ b/tools/testing/selftests/bpf/config @@ -22,6 +22,8 @@ CONFIG_CRYPTO_AES=3Dy CONFIG_DEBUG_INFO=3Dy CONFIG_DEBUG_INFO_BTF=3Dy CONFIG_DEBUG_INFO_DWARF4=3Dy +CONFIG_DMABUF_HEAPS=3Dy +CONFIG_DMABUF_HEAPS_SYSTEM=3Dy CONFIG_DUMMY=3Dy CONFIG_DYNAMIC_FTRACE=3Dy CONFIG_FPROBE=3Dy @@ -106,6 +108,7 @@ CONFIG_SECURITY=3Dy CONFIG_SECURITYFS=3Dy CONFIG_SYN_COOKIES=3Dy CONFIG_TEST_BPF=3Dm +CONFIG_UDMABUF=3Dy CONFIG_USERFAULTFD=3Dy CONFIG_VSOCKETS=3Dy CONFIG_VXLAN=3Dy diff --git a/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c b/tools/t= esting/selftests/bpf/prog_tests/dmabuf_iter.c new file mode 100644 index 000000000000..35745f4ce0f8 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c @@ -0,0 +1,224 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2025 Google */ + +#include +#include +#include +#include "dmabuf_iter.skel.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +static int memfd, udmabuf; +static const char udmabuf_test_buffer_name[DMA_BUF_NAME_LEN] =3D "udmabuf_= test_buffer_for_iter"; +static size_t udmabuf_test_buffer_size; +static int sysheap_dmabuf; +static const char sysheap_test_buffer_name[DMA_BUF_NAME_LEN] =3D "sysheap_= test_buffer_for_iter"; +static size_t sysheap_test_buffer_size; + +static int create_udmabuf(void) +{ + struct udmabuf_create create; + int dev_udmabuf; + + udmabuf_test_buffer_size =3D 10 * getpagesize(); + + if (!ASSERT_LE(sizeof(udmabuf_test_buffer_name), DMA_BUF_NAME_LEN, "NAMET= OOLONG")) + return 1; + + memfd =3D memfd_create("memfd_test", MFD_ALLOW_SEALING); + if (!ASSERT_OK_FD(memfd, "memfd_create")) + return 1; + + if (!ASSERT_OK(ftruncate(memfd, udmabuf_test_buffer_size), "ftruncate")) + return 1; + + if (!ASSERT_OK(fcntl(memfd, F_ADD_SEALS, F_SEAL_SHRINK), "seal")) + return 1; + + dev_udmabuf =3D open("/dev/udmabuf", O_RDONLY); + if (!ASSERT_OK_FD(dev_udmabuf, "open udmabuf")) + return 1; + + create.memfd =3D memfd; + create.flags =3D UDMABUF_FLAGS_CLOEXEC; + create.offset =3D 0; + create.size =3D udmabuf_test_buffer_size; + + udmabuf =3D ioctl(dev_udmabuf, UDMABUF_CREATE, &create); + close(dev_udmabuf); + if (!ASSERT_OK_FD(udmabuf, "udmabuf_create")) + return 1; + + if (!ASSERT_OK(ioctl(udmabuf, DMA_BUF_SET_NAME_B, udmabuf_test_buffer_nam= e), "name")) + return 1; + + return 0; +} + +static int create_sys_heap_dmabuf(void) +{ + sysheap_test_buffer_size =3D 20 * getpagesize(); + + struct dma_heap_allocation_data data =3D { + .len =3D sysheap_test_buffer_size, + .fd =3D 0, + .fd_flags =3D O_RDWR | O_CLOEXEC, + .heap_flags =3D 0, + }; + int heap_fd, ret; + + if (!ASSERT_LE(sizeof(sysheap_test_buffer_name), DMA_BUF_NAME_LEN, "NAMET= OOLONG")) + return 1; + + heap_fd =3D open("/dev/dma_heap/system", O_RDONLY); + if (!ASSERT_OK_FD(heap_fd, "open dma heap")) + return 1; + + ret =3D ioctl(heap_fd, DMA_HEAP_IOCTL_ALLOC, &data); + close(heap_fd); + if (!ASSERT_OK(ret, "syheap alloc")) + return 1; + + sysheap_dmabuf =3D data.fd; + + if (!ASSERT_OK(ioctl(sysheap_dmabuf, DMA_BUF_SET_NAME_B, sysheap_test_buf= fer_name), "name")) + return 1; + + return 0; +} + +static int create_test_buffers(void) +{ + int ret; + + ret =3D create_udmabuf(); + if (ret) + return ret; + + return create_sys_heap_dmabuf(); +} + +static void destroy_test_buffers(void) +{ + close(udmabuf); + close(memfd); + close(sysheap_dmabuf); +} + +enum Fields { INODE, SIZE, NAME, EXPORTER, FIELD_COUNT }; +struct DmabufInfo { + unsigned long inode; + unsigned long size; + char name[DMA_BUF_NAME_LEN]; + char exporter[32]; +}; + +static bool check_dmabuf_info(const struct DmabufInfo *bufinfo, + unsigned long size, + const char *name, const char *exporter) +{ + return size =3D=3D bufinfo->size && + !strcmp(name, bufinfo->name) && + !strcmp(exporter, bufinfo->exporter); +} + +static void subtest_dmabuf_iter_check_default_iter(struct dmabuf_iter *ske= l) +{ + bool found_test_sysheap_dmabuf =3D false; + bool found_test_udmabuf =3D false; + struct DmabufInfo bufinfo; + size_t linesize =3D 0; + char *line =3D NULL; + FILE *iter_file; + int iter_fd, f =3D INODE; + + iter_fd =3D bpf_iter_create(bpf_link__fd(skel->links.dmabuf_collector)); + ASSERT_OK_FD(iter_fd, "iter_create"); + + iter_file =3D fdopen(iter_fd, "r"); + ASSERT_OK_PTR(iter_file, "fdopen"); + + while (getline(&line, &linesize, iter_file) !=3D -1) { + if (f % FIELD_COUNT =3D=3D INODE) { + ASSERT_EQ(sscanf(line, "%ld", &bufinfo.inode), 1, + "read inode"); + } else if (f % FIELD_COUNT =3D=3D SIZE) { + ASSERT_EQ(sscanf(line, "%ld", &bufinfo.size), 1, + "read size"); + } else if (f % FIELD_COUNT =3D=3D NAME) { + ASSERT_EQ(sscanf(line, "%s", bufinfo.name), 1, + "read name"); + } else if (f % FIELD_COUNT =3D=3D EXPORTER) { + ASSERT_EQ(sscanf(line, "%31s", bufinfo.exporter), 1, + "read exporter"); + + if (check_dmabuf_info(&bufinfo, + sysheap_test_buffer_size, + sysheap_test_buffer_name, + "system")) + found_test_sysheap_dmabuf =3D true; + else if (check_dmabuf_info(&bufinfo, + udmabuf_test_buffer_size, + udmabuf_test_buffer_name, + "udmabuf")) + found_test_udmabuf =3D true; + } + ++f; + } + + ASSERT_EQ(f % FIELD_COUNT, INODE, "number of fields"); + + ASSERT_TRUE(found_test_sysheap_dmabuf, "found_test_sysheap_dmabuf"); + ASSERT_TRUE(found_test_udmabuf, "found_test_udmabuf"); + + free(line); + fclose(iter_file); + close(iter_fd); +} + +void test_dmabuf_iter(void) +{ + struct dmabuf_iter *skel =3D NULL; + char buf[256]; + int iter_fd; + + skel =3D dmabuf_iter__open_and_load(); + if (!ASSERT_OK_PTR(skel, "dmabuf_iter__open_and_load")) + return; + + if (!ASSERT_OK(create_test_buffers(), "create_buffers")) + goto destroy; + + if (!ASSERT_OK(dmabuf_iter__attach(skel), "skel_attach")) + goto destroy; + + iter_fd =3D bpf_iter_create(bpf_link__fd(skel->links.dmabuf_collector)); + if (!ASSERT_OK_FD(iter_fd, "iter_create")) + goto destroy; + + while (read(iter_fd, buf, sizeof(buf)) > 0) + ; /* Read out all contents */ + + /* Next reads should return 0 */ + ASSERT_EQ(read(iter_fd, buf, sizeof(buf)), 0, "read"); + + if (test__start_subtest("default_iter")) + subtest_dmabuf_iter_check_default_iter(skel); + + close(iter_fd); + +destroy: + destroy_test_buffers(); + dmabuf_iter__destroy(skel); +} diff --git a/tools/testing/selftests/bpf/progs/dmabuf_iter.c b/tools/testin= g/selftests/bpf/progs/dmabuf_iter.c new file mode 100644 index 000000000000..6e80a53c4670 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/dmabuf_iter.c @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2025 Google LLC */ +#include +#include +#include + +/* From uapi/linux/dma-buf.h */ +#define DMA_BUF_NAME_LEN 32 + +char _license[] SEC("license") =3D "GPL"; + +/** + * Fields output by this iterator are delimited by newlines. Convert any + * newlines in user-provided printed strings to spaces. + */ +static void sanitize_string(char *src, size_t size) +{ + for (char *c =3D src; c && (size_t)(c-src) < size; ++c) + if (*c =3D=3D '\n') + *c =3D ' '; +} + +SEC("iter/dmabuf") +int dmabuf_collector(struct bpf_iter__dmabuf *ctx) +{ + const struct dma_buf *dmabuf =3D ctx->dmabuf; + struct seq_file *seq =3D ctx->meta->seq; + unsigned long inode =3D 0; + size_t size; + const char *pname, *exporter; + char name[DMA_BUF_NAME_LEN] =3D {'\0'}; + + if (!dmabuf) + return 0; + + if (BPF_CORE_READ_INTO(&inode, dmabuf, file, f_inode, i_ino) || + bpf_core_read(&size, sizeof(size), &dmabuf->size) || + bpf_core_read(&pname, sizeof(pname), &dmabuf->name) || + bpf_core_read(&exporter, sizeof(exporter), &dmabuf->exp_name)) + return 1; + + /* Buffers are not required to be named */ + if (pname) { + if (bpf_probe_read_kernel(name, sizeof(name), pname)) + return 1; + + /* Name strings can be provided by userspace */ + sanitize_string(name, sizeof(name)); + } + + BPF_SEQ_PRINTF(seq, "%lu\n%llu\n%s\n%s\n", inode, size, name, exporter); + return 0; +} --=20 2.49.0.1045.g170613ef41-goog From nobody Tue Dec 16 07:27:10 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6618378F2F for ; Wed, 7 May 2025 00:10:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746576657; cv=none; b=tjw0te8SbwcjYI8pYUy8+/im49hnJ00pGqn14dJ3s/92/5bn7tu6CY3Qe6bzeRf/g/hfKIJj5PnWW2nn7YSx40MEoAxNrljPNRnua197bzASEu3gINbrmLntDqks/1jhsARPgPk78KlSmc6a9baWBXA6gIdEqKwSxXxsxSgkqhg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746576657; c=relaxed/simple; bh=zjxvDX6hlmnxYe7hUshQ+NFG7w7dCFSkI1aRqCwDSA0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=W9F9PQNpxwlmZKtSbwS3Fa09GycWx6XXYKws1rJIG2TcIcITg+3WgTMdl0u5owFslfNG4tu+euSdekCOHRDuPyb6LCKF+eDmKMqHYktXJAEEAiP3I5BXHfGr8KRr7ecS+V1D6FFxhwmO+cfajsIK4huGrN80/aKR2L2mJvvcXSM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tjmercier.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=RMdodywu; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tjmercier.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="RMdodywu" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-af5156fbe79so7091449a12.1 for ; Tue, 06 May 2025 17:10:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1746576654; x=1747181454; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=6jpVjHCzkmCWbY9yKnMBqEBZlPsFYlEJmH11rX7kflc=; b=RMdodywunXzpUAsf5oDS5KdZXnPhvmVxRojlg50IBC6dkk3xgd7i6VuzCwSq3tqZFG GfDQzmh5HByYTdqvKyBTlhQ9viIpeK/COnzHoBJV8+E4y97GJtBYskU4TMe0UfUgvigb 7HttVAzLd22WhOIat3JgEnIsxYd/BTeCpK4Bs1AWEm7y5OeChBIzJVJmQk/pMDrUQdXZ aMI3tydF2RRs2fNCg3IYJoi8wIAwQkqzFURjOGL30yfHqUHJlyKPojjPKWnKu+Nphi+2 1y5UAckVGG1bSGuXAF/lphWtDB3ddByZsqIwkso2AMARVxQyEWRr0E1TT61miqzISD+p wlXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746576654; x=1747181454; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=6jpVjHCzkmCWbY9yKnMBqEBZlPsFYlEJmH11rX7kflc=; b=cblrHtuAEOpexn+hjhTZgQ29JtsTzhACfnImX1CmWI1aUpRR7WwCa4I7TRAmZI76vR oyqPbe2lpcB4ENlvnaoXG+vyUvUWRyFp9/Xx2s7h5OsdVE8GYSCIoTVSVRZJXAkeOnjP /oydyvvA7b0v8SKuEkoCnCMh9D6yjSK8QjjgoTCUKOYeT3OwcqoX3dWd+F7DHx9Fassf x6j1JvrQmF2BliCmxbHwrqIQSB9Hnx3OCkuv+rgvTLMsvfVIpjF/2onbNLdi/+X869ct aWixs3Vh67NrjSnlDjJEDbSzRIDlmodKUaJoxdOtI9FRqBLnsBS6g912+H9VSgH83WIX /yOA== X-Gm-Message-State: AOJu0YyrEaKucBfqKGB/5olANdcTO2x0M8RuAhXdE2IjcaypUUM9OKwT pDmVPUZHPp4hQ9emtKM22q77zXhAlmUJpbDMkN0FYVtxuTKcGQeVmiEQI8emzkDZ7W2eVTndF3W 1r746SgfxeTfT+A== X-Google-Smtp-Source: AGHT+IE1g6ZISbTEJDgWxmK/h1TRKB//bmXhLy5RaNBy5/H9JIqO4bz4IEDm9/jAN63XigNGeBqNcMqHYx0Wqlo= X-Received: from pgbq20.prod.google.com ([2002:a63:5c14:0:b0:af9:94ca:51b]) (user=tjmercier job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:3950:b0:20b:a75e:fa32 with SMTP id adf61e73a8af0-2148d42d024mr1638788637.40.1746576654550; Tue, 06 May 2025 17:10:54 -0700 (PDT) Date: Wed, 7 May 2025 00:10:36 +0000 In-Reply-To: <20250507001036.2278781-1-tjmercier@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250507001036.2278781-1-tjmercier@google.com> X-Mailer: git-send-email 2.49.0.1045.g170613ef41-goog Message-ID: <20250507001036.2278781-6-tjmercier@google.com> Subject: [PATCH bpf-next v3 5/5] selftests/bpf: Add test for open coded dmabuf_iter From: "T.J. Mercier" To: sumit.semwal@linaro.org, christian.koenig@amd.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, skhan@linuxfoundation.org, alexei.starovoitov@gmail.com, song@kernel.org Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, android-mm@google.com, simona@ffwll.ch, eddyz87@gmail.com, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, jolsa@kernel.org, mykolal@fb.com, "T.J. Mercier" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the same test buffers as the traditional iterator and a new BPF map to verify the test buffers can be found with the open coded dmabuf iterator. Signed-off-by: T.J. Mercier --- .../testing/selftests/bpf/bpf_experimental.h | 5 ++ .../selftests/bpf/prog_tests/dmabuf_iter.c | 52 +++++++++++++++---- .../testing/selftests/bpf/progs/dmabuf_iter.c | 38 ++++++++++++++ 3 files changed, 86 insertions(+), 9 deletions(-) diff --git a/tools/testing/selftests/bpf/bpf_experimental.h b/tools/testing= /selftests/bpf/bpf_experimental.h index 6535c8ae3c46..5e512a1d09d1 100644 --- a/tools/testing/selftests/bpf/bpf_experimental.h +++ b/tools/testing/selftests/bpf/bpf_experimental.h @@ -591,4 +591,9 @@ extern int bpf_iter_kmem_cache_new(struct bpf_iter_kmem= _cache *it) __weak __ksym extern struct kmem_cache *bpf_iter_kmem_cache_next(struct bpf_iter_kmem_ca= che *it) __weak __ksym; extern void bpf_iter_kmem_cache_destroy(struct bpf_iter_kmem_cache *it) __= weak __ksym; =20 +struct bpf_iter_dmabuf; +extern int bpf_iter_dmabuf_new(struct bpf_iter_dmabuf *it) __weak __ksym; +extern struct dma_buf *bpf_iter_dmabuf_next(struct bpf_iter_dmabuf *it) __= weak __ksym; +extern void bpf_iter_dmabuf_destroy(struct bpf_iter_dmabuf *it) __weak __k= sym; + #endif diff --git a/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c b/tools/t= esting/selftests/bpf/prog_tests/dmabuf_iter.c index 35745f4ce0f8..cc02bb555610 100644 --- a/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c +++ b/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c @@ -26,10 +26,11 @@ static int sysheap_dmabuf; static const char sysheap_test_buffer_name[DMA_BUF_NAME_LEN] =3D "sysheap_= test_buffer_for_iter"; static size_t sysheap_test_buffer_size; =20 -static int create_udmabuf(void) +static int create_udmabuf(int map_fd) { struct udmabuf_create create; int dev_udmabuf; + bool f =3D false; =20 udmabuf_test_buffer_size =3D 10 * getpagesize(); =20 @@ -63,10 +64,10 @@ static int create_udmabuf(void) if (!ASSERT_OK(ioctl(udmabuf, DMA_BUF_SET_NAME_B, udmabuf_test_buffer_nam= e), "name")) return 1; =20 - return 0; + return bpf_map_update_elem(map_fd, udmabuf_test_buffer_name, &f, BPF_ANY); } =20 -static int create_sys_heap_dmabuf(void) +static int create_sys_heap_dmabuf(int map_fd) { sysheap_test_buffer_size =3D 20 * getpagesize(); =20 @@ -77,6 +78,7 @@ static int create_sys_heap_dmabuf(void) .heap_flags =3D 0, }; int heap_fd, ret; + bool f =3D false; =20 if (!ASSERT_LE(sizeof(sysheap_test_buffer_name), DMA_BUF_NAME_LEN, "NAMET= OOLONG")) return 1; @@ -95,18 +97,18 @@ static int create_sys_heap_dmabuf(void) if (!ASSERT_OK(ioctl(sysheap_dmabuf, DMA_BUF_SET_NAME_B, sysheap_test_buf= fer_name), "name")) return 1; =20 - return 0; + return bpf_map_update_elem(map_fd, sysheap_test_buffer_name, &f, BPF_ANY); } =20 -static int create_test_buffers(void) +static int create_test_buffers(int map_fd) { int ret; =20 - ret =3D create_udmabuf(); + ret =3D create_udmabuf(map_fd); if (ret) return ret; =20 - return create_sys_heap_dmabuf(); + return create_sys_heap_dmabuf(map_fd); } =20 static void destroy_test_buffers(void) @@ -187,17 +189,46 @@ static void subtest_dmabuf_iter_check_default_iter(st= ruct dmabuf_iter *skel) close(iter_fd); } =20 +static void subtest_dmabuf_iter_check_open_coded(struct dmabuf_iter *skel,= int map_fd) +{ + LIBBPF_OPTS(bpf_test_run_opts, topts); + char key[DMA_BUF_NAME_LEN]; + int err, fd; + bool found; + + /* No need to attach it, just run it directly */ + fd =3D bpf_program__fd(skel->progs.iter_dmabuf_for_each); + + err =3D bpf_prog_test_run_opts(fd, &topts); + if (!ASSERT_OK(err, "test_run_opts err")) + return; + if (!ASSERT_OK(topts.retval, "test_run_opts retval")) + return; + + if (!ASSERT_OK(bpf_map_get_next_key(map_fd, NULL, key), "get next key")) + return; + + do { + ASSERT_OK(bpf_map_lookup_elem(map_fd, key, &found), "lookup elem"); + ASSERT_TRUE(found, "found test buffer"); + } while (bpf_map_get_next_key(map_fd, key, key)); +} + void test_dmabuf_iter(void) { struct dmabuf_iter *skel =3D NULL; + int iter_fd, map_fd; char buf[256]; - int iter_fd; =20 skel =3D dmabuf_iter__open_and_load(); if (!ASSERT_OK_PTR(skel, "dmabuf_iter__open_and_load")) return; =20 - if (!ASSERT_OK(create_test_buffers(), "create_buffers")) + map_fd =3D bpf_map__fd(skel->maps.testbuf_hash); + if (!ASSERT_OK_FD(map_fd, "map_fd")) + goto destroy_skel; + + if (!ASSERT_OK(create_test_buffers(map_fd), "create_buffers")) goto destroy; =20 if (!ASSERT_OK(dmabuf_iter__attach(skel), "skel_attach")) @@ -215,10 +246,13 @@ void test_dmabuf_iter(void) =20 if (test__start_subtest("default_iter")) subtest_dmabuf_iter_check_default_iter(skel); + if (test__start_subtest("open_coded")) + subtest_dmabuf_iter_check_open_coded(skel, map_fd); =20 close(iter_fd); =20 destroy: destroy_test_buffers(); +destroy_skel: dmabuf_iter__destroy(skel); } diff --git a/tools/testing/selftests/bpf/progs/dmabuf_iter.c b/tools/testin= g/selftests/bpf/progs/dmabuf_iter.c index 6e80a53c4670..030654ab5717 100644 --- a/tools/testing/selftests/bpf/progs/dmabuf_iter.c +++ b/tools/testing/selftests/bpf/progs/dmabuf_iter.c @@ -9,6 +9,13 @@ =20 char _license[] SEC("license") =3D "GPL"; =20 +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(key_size, DMA_BUF_NAME_LEN); + __type(value, bool); + __uint(max_entries, 5); +} testbuf_hash SEC(".maps"); + /** * Fields output by this iterator are delimited by newlines. Convert any * newlines in user-provided printed strings to spaces. @@ -51,3 +58,34 @@ int dmabuf_collector(struct bpf_iter__dmabuf *ctx) BPF_SEQ_PRINTF(seq, "%lu\n%llu\n%s\n%s\n", inode, size, name, exporter); return 0; } + +SEC("syscall") +int iter_dmabuf_for_each(const void *ctx) +{ + struct dma_buf *d; + + bpf_for_each(dmabuf, d) { + char name[DMA_BUF_NAME_LEN]; + const char *pname; + bool *found; + + if (bpf_core_read(&pname, sizeof(pname), &d->name)) + return 1; + + /* Buffers are not required to be named */ + if (!pname) + continue; + + if (bpf_probe_read_kernel(name, sizeof(name), pname)) + return 1; + + found =3D bpf_map_lookup_elem(&testbuf_hash, name); + if (found) { + bool t =3D true; + + bpf_map_update_elem(&testbuf_hash, name, &t, BPF_EXIST); + } + } + + return 0; +} --=20 2.49.0.1045.g170613ef41-goog