From patchwork Mon May 12 17:40:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "T.J. Mercier" X-Patchwork-Id: 889555 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 604C5296FA0 for ; Mon, 12 May 2025 17:40:54 +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=1747071656; cv=none; b=NQMcvRF0vhCkMqu46wc7gsLgD2DjhHlJFpzPyReR2CF82yMpkj+82PaW85/81zMAGeN6FGuRFTu7O69r5LaB5wXH0Tfxa+a/BBoKYx4gl5SRNI3Tgy9OM89BvMPIsWj8cHGyX5WF13KWjlmI4cJaOwagudmJXGNtAlf272SGv6Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747071656; c=relaxed/simple; bh=Af5UIWE0qy22f6c2JL3nAMlI/7xnmUsXK/UfA5VmQlA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hZ2BElpAQjAd7+W2HzzApmjQj4KFNzOdEMg3rjkBWgjiKQXS6e4OX+8D1+Z6xHMlLq/hzvd7NbaPocq0cVYFJSg0Oiy7IYgshtBoyEgsw6U7TZzgDICJ+c+gH5Yb3fNOPpdhUObnWGgWmVCKvyOOc6P3lznRUjmEcT4K+9iVURI= 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=xUKH2PtK; 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="xUKH2PtK" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-30ad9303655so7439472a91.2 for ; Mon, 12 May 2025 10:40:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747071654; x=1747676454; 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=SCXgFCr4xFu2oZbXQwI8tdtBERd+L0LdxpvvyzEsoGU=; b=xUKH2PtKVRCbSSxBX3u+LqucX1d7mx5xFxpIkehZB6j1NSkj9Xkox6vxDuTjbeCaRH dpRBNbqvKGHRi2tHcjLUsoicdJTSt+0sQVRPyLhHSl3mohhC9Onf5/BrAoHgLzkRRRhj M8pkxPjxtmHXQTK0y0L5vrHQOqr+pAXqf0ul0gsvt0XdNeubotc5Z3l4KILIWewYBULv OHgEjBoNmcXRN0WhXQ7uPRsGDgZWRRyI3rZXL8cypXAKCnMUvunjtIPa+/Y6pW6gT3U1 19xEjGPSM24XxgHv6FRhC+NMhHy9+VV3zj+yzP9t74oxOKCD4RxDyhkyx0WlvYE6D/9c 6iEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747071654; x=1747676454; 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=SCXgFCr4xFu2oZbXQwI8tdtBERd+L0LdxpvvyzEsoGU=; b=Vq1ANcRgVn8kohPfIQRmZiJsLvI1dTSxRuW0N8+OcRmakC0IWlYWBT8i1xrEPW8HrV GuSQ5YgAvEd+lK7q8jG3dOVZY58eRoVqqAs4eye0ez4NvVykHW32J5DZNWTcqkTDsoxw qmbmLnca7/K67DzyBxwfy167gFUjT/ichjDotXH9B03FRWl/kJXlFfL4H+Je37yu7yv6 5vcqto1nDlZFZ+H6CZTskPMhoR8jB8ri+OhWFyH7WL8k4DJFioJAXnd9iQWUT1z5bQfb /6UAHrbYG+8AX+1p5W0n6hQ2LAMCvyqKaeiHP1wmoXroVsA5hi2NGMU2tU/TnU7wsQPH f0DA== X-Forwarded-Encrypted: i=1; AJvYcCWyAHs0nJxFk/GeoLd31z5flPpV3vLqzjSmmHmK1wzKqNPLaztH7kc+xmKhtGR436R9YJ4sviQYqsHVK//bZkI=@vger.kernel.org X-Gm-Message-State: AOJu0YygM/2TuhIjidqPIW8Ee6BS4oqgqzt5uy3Xbh57i3Z+zpqthspe JkV0dZGzVymIgoxu9Ax27CwbzfRPUnos1Pck+ezC1VlofdrfbUYBcIV4V1+Vj39R71F28V9v61C blgpUr9y9agb4Ng== X-Google-Smtp-Source: AGHT+IF+K6tr0ALF03p76hnqtxjQG6z4jM2ZpShKDCGXLdx2mjPqO4XOd82ZqZJQpw8W2LdE/0X1xEUeMkQ1hsU= X-Received: from pjbpm17.prod.google.com ([2002:a17:90b:3c51:b0:30a:a05c:6e7d]) (user=tjmercier job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4c8e:b0:2fa:1851:a023 with SMTP id 98e67ed59e1d1-30c3d657026mr21415976a91.35.1747071653565; Mon, 12 May 2025 10:40:53 -0700 (PDT) Date: Mon, 12 May 2025 17:40:32 +0000 In-Reply-To: <20250512174036.266796-1-tjmercier@google.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250512174036.266796-1-tjmercier@google.com> X-Mailer: git-send-email 2.49.0.1045.g170613ef41-goog Message-ID: <20250512174036.266796-2-tjmercier@google.com> Subject: [PATCH bpf-next v5 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 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, shuah@kernel.org, song@kernel.org, "T.J. Mercier" 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önig Acked-by: Song Liu --- 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 @@ static inline int is_dma_buf_file(struct file *); -#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); -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); } -static void __dma_buf_debugfs_list_del(struct dma_buf *dmabuf) +static void __dma_buf_list_del(struct dma_buf *dmabuf) { if (!dmabuf) return; - 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 static char *dmabuffs_dname(struct dentry *dentry, char *buffer, int buflen) { @@ -115,7 +105,7 @@ static int dma_buf_file_release(struct inode *inode, struct file *file) if (!is_dma_buf_file(file)) return -EINVAL; - __dma_buf_debugfs_list_del(file->private_data); + __dma_buf_list_del(file->private_data); return 0; } @@ -689,7 +679,7 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info) file->f_path.dentry->d_fsdata = dmabuf; dmabuf->file = file; - __dma_buf_debugfs_list_add(dmabuf); + __dma_buf_list_add(dmabuf); return dmabuf; @@ -1630,7 +1620,7 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused) size_t size = 0; int ret; - ret = mutex_lock_interruptible(&debugfs_list_mutex); + ret = mutex_lock_interruptible(&dmabuf_list_mutex); if (ret) return ret; @@ -1639,7 +1629,7 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused) seq_printf(s, "%-8s\t%-8s\t%-8s\t%-8s\texp_name\t%-8s\tname\n", "size", "flags", "mode", "count", "ino"); - list_for_each_entry(buf_obj, &debugfs_list, list_node) { + list_for_each_entry(buf_obj, &dmabuf_list, list_node) { ret = dma_resv_lock_interruptible(buf_obj->resv, NULL); if (ret) @@ -1676,11 +1666,11 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused) seq_printf(s, "\nTotal %d objects, %zu bytes\n", count, size); - mutex_unlock(&debugfs_list_mutex); + mutex_unlock(&dmabuf_list_mutex); return 0; error_unlock: - mutex_unlock(&debugfs_list_mutex); + mutex_unlock(&dmabuf_list_mutex); return ret; } 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; -#if IS_ENABLED(CONFIG_DEBUG_FS) /** @list_node: node for dma_buf accounting and debugging. */ struct list_head list_node; -#endif /** @priv: exporter specific private data for this buffer object. */ void *priv; From patchwork Mon May 12 17:40:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "T.J. Mercier" X-Patchwork-Id: 889554 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 CA0D4296D3F for ; Mon, 12 May 2025 17:40:59 +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=1747071661; cv=none; b=pCZzNCdWjRnZhlD2b5edDWpo9PSkGgetyjgl0fF81YGHzPKWGs168Ymb+Q/g+Z0q7otKMatlvw5+5TIFDR/cv1oOxxH1ZlffmcIT7t5EuV07E4myedcueuAnsxqki5CJzLZFigctUFNPeQMynsWY3bSFqQM0KeAWQSIUX+MHx30= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747071661; c=relaxed/simple; bh=LoopqmbJs5Vnk3r2GqCH3tKa+epZcqS8UrpFqFIMmhs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jpKYfQMPz0fIHLkRoXM7WAQoj/aFB5IItKu0MFf9Lzr9O/lyaWHT1t9BsExlyYLXSPOIBFIlClvHwvbrvl+0jxrdxJ2Gs3C842CDxfMorohaz9qn6gCimED/+33qfjD78qVQ55CEoQOXlt0ZVy2V/v7ZGIagSZ5USzHgCkGKDUI= 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=tnGPzv2S; 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="tnGPzv2S" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-af5310c1ac1so2734983a12.2 for ; Mon, 12 May 2025 10:40:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747071659; x=1747676459; 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=xt8CAY1hcGS6Lny9EEFatzo77hxl+1XNQzM/j34oESs=; b=tnGPzv2SghvCTAz/6kZdNA6gSGtTYW1Y8VtU1vdkOxn7vr8YZ2I/+HXXHi9x0/ZegM 1r6ZmzUnC5+ZYaM7JvcIZxqZXRexROGALkPZQJ+1nNtZN2jmvvDEvQdN20jekI9g59Dk 16CD7uoKfm6GjcCWsu6uSsqoSGmSmrvFEiWyF8Z5skj6r8rGvM0gea83nImDS+TGkEvZ AbzgxpeKPKjgmby6cZkzlQD0a3JMRueByx2PHrj6oQtoDjqAKuC5Q+YuFBhgMa07ghJZ C2mwrf7FwETCsR8cp/4/NjbtKfrUj2A4ZCtX0KSmGzZDujymTfDlJqtgzuLmON2EQ6js Rcjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747071659; x=1747676459; 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=xt8CAY1hcGS6Lny9EEFatzo77hxl+1XNQzM/j34oESs=; b=nGLamjp/gGUiDD342vE57Omk4moSmo/rxWC3kJ/zNGWbS5k3PdIuBWpU8OlDoAi6DH NTWqZiV74ip+dyQSJxYq6IBKk0WU0AS44PFE0kR86vpZluXxhlC7gV4filFBdZi1CJED PWK4HBjbr/KVnZO9Sud2yPAilSRkjY6qxi1OyjH8pR8SD7BHV+K1Xg3fBp+zjJSisuj7 1eEhLanPIz0W4SBODiykDHrgiDnyksiAMvwoaNrZpsKBQZdO6WjHH4P4UcrGvIAwp1pZ cjJlLPCa710ADdgX5/KzG8oNIWqTk2gvmKZmxiTbbTC97jN5GXy6JIt65uYDTsxsAHK5 dNcg== X-Forwarded-Encrypted: i=1; AJvYcCW2thTteshSsImknx26Rc6ci4zjbt1PSwsUWhoB01+z5Vy1dUd5X+41BhMjrUyGdeA2/i8SSHYZxKXJEjdk4fM=@vger.kernel.org X-Gm-Message-State: AOJu0Yzoov4n9FMjvxn9SImEDkwpJeWgPBwFhqgWNJ/krSqA3sx6eBX0 SrM+6FQej1p3cJdh8rnPYLaUuy1aBIlA8hqSfNT2liyJQXiytNdvV+CgZOHVZZjL6lOn+7Ce2Rv ilfGaKou+eCcXRg== X-Google-Smtp-Source: AGHT+IGSf3qT9YvheOr4I3XzP14hYOrPMaTHP/OGAQDR4qmiHA2sveVJ+nyVBauT4udhHi7fyZ4qbN95CQx57ik= X-Received: from pjbsn16.prod.google.com ([2002:a17:90b:2e90:b0:2fa:15aa:4d2b]) (user=tjmercier job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2413:b0:30c:5617:7475 with SMTP id 98e67ed59e1d1-30c5617928fmr14088307a91.18.1747071658988; Mon, 12 May 2025 10:40:58 -0700 (PDT) Date: Mon, 12 May 2025 17:40:34 +0000 In-Reply-To: <20250512174036.266796-1-tjmercier@google.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250512174036.266796-1-tjmercier@google.com> X-Mailer: git-send-email 2.49.0.1045.g170613ef41-goog Message-ID: <20250512174036.266796-4-tjmercier@google.com> Subject: [PATCH bpf-next v5 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 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, shuah@kernel.org, song@kernel.org, "T.J. Mercier" 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 Acked-by: Christian König Acked-by: Song Liu --- kernel/bpf/dmabuf_iter.c | 48 ++++++++++++++++++++++++++++++++++++++++ kernel/bpf/helpers.c | 5 +++++ 2 files changed, 53 insertions(+) diff --git a/kernel/bpf/dmabuf_iter.c b/kernel/bpf/dmabuf_iter.c index 83ef54d78b62..4dd7ef7c145c 100644 --- a/kernel/bpf/dmabuf_iter.c +++ b/kernel/bpf/dmabuf_iter.c @@ -100,3 +100,51 @@ static int __init dmabuf_iter_init(void) } 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 = (void *)it; + + BUILD_BUG_ON(sizeof(*kit) > sizeof(*it)); + BUILD_BUG_ON(__alignof__(*kit) != __alignof__(*it)); + + kit->dmabuf = NULL; + return 0; +} + +__bpf_kfunc struct dma_buf *bpf_iter_dmabuf_next(struct bpf_iter_dmabuf *it) +{ + struct bpf_iter_dmabuf_kern *kit = (void *)it; + + if (kit->dmabuf) + kit->dmabuf = dma_buf_iter_next(kit->dmabuf); + else + kit->dmabuf = dma_buf_iter_begin(); + + return kit->dmabuf; +} + +__bpf_kfunc void bpf_iter_dmabuf_destroy(struct bpf_iter_dmabuf *it) +{ + struct bpf_iter_dmabuf_kern *kit = (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_SLEEPABLE) 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_SLEEPABLE) +BTF_ID_FLAGS(func, bpf_iter_dmabuf_destroy, KF_ITER_DESTROY | KF_SLEEPABLE) +#endif BTF_KFUNCS_END(common_btf_ids) static const struct btf_kfunc_id_set common_kfunc_set = { From patchwork Mon May 12 17:40:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "T.J. Mercier" X-Patchwork-Id: 889553 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.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 D233F297B61 for ; Mon, 12 May 2025 17:41:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747071666; cv=none; b=UTuIMxDL8JrnkU/+pUbhTekTahugbKhcC9zrfxErsNP18g/uTxdPqQzgJ4jytWPa8VmiD4YgOyseIT0uPREtR8qVQxlrFSxCPtT8dauM2vZZVp19Y9f7+yZvXNVKxdm/jrMGEl+pdqyslkPvze6UjPinIprYy3nmMq/V2b0Stjw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747071666; c=relaxed/simple; bh=Sr4ehi8UyKgOInexUUDXX33RjZQR1+mTrCzUsTP3Xjg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=h2ceE+/7m97/+RhRBbkLgC/m90d8HzJnLLf++YBG/aqzFWRNgrejG1YRaN8+LTp96sfz/21ZuCcpjOW9LriZfNTf0QDdLw20Q21CxyberpsEx4DmZNdUJ3n457Fe4itMvr3SIjf2ojde/dN0KtvHtw/TMFXFxHRZGWOqiw6gpsU= 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=fvaPt+ux; arc=none smtp.client-ip=209.85.210.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="fvaPt+ux" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-74235ee893fso5332655b3a.1 for ; Mon, 12 May 2025 10:41:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747071664; x=1747676464; 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=sCGxx2XfGsewNgZCW3IbIozmrin1Wu5z7ijIKVfw2+I=; b=fvaPt+uxM3zgUeQ5F35YzPtSQtcWC68E/CI8Xig2rtYBIJTZPaHx9RuZeqfLttqdZo D/7Rx/0txwTcMtv+hmeO8xAadmpL61qiKZeYlC2VsHmqBmIjpi9MTJ0P02apn2ig8Z82 vMd8ZNInKBaMM4D/QYH1GAYZzCqFBMt7KAaN8QQGUK8mkj28f3B65ji9fmmnXXaKQiKY 9/RwM427jZkJOaVq6DP4WGTUJYLquCLRD6RDy00JP5hBiIZdF0CTLsOy7JqQEy3x9VcI vT4jJaXXz/lfs/TvnQy4y40vGX5viQ9HfP1nNyGCG1ha3wbccfJ1ln9QVqYU295fYwk5 WsfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747071664; x=1747676464; 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=sCGxx2XfGsewNgZCW3IbIozmrin1Wu5z7ijIKVfw2+I=; b=kUGMlTypBGKVXoSYBORXtOjokHUlspwcY23/dChUoLCXdga5+w5xEnfY/3M7IQuZXb zH5iZ4loo5GUgZVsodHGM3T9nqSmeLUWxL0gVlH4KX92l3HuanveD/N9RFAwwXh8j5fd pfJmTeSa2CGQ6yyXfrEzSBDPs0Fgf3eF4ZoDzEil6hg17cuDBoJIbOg+qAtmWjVec9Pd afqkFG9LUWJFPwm80K47FywGvvtI2r1JdkyAsBX90Ogv9Q9R9UDk9xaTqfpeegFJNh9j wvtAtvAHV1o39yusxHr98XyvsEXmaKWiJfCpLSY+uFhmpvoSkoc6OB+ZQhQ750TepO2p Ss6A== X-Forwarded-Encrypted: i=1; AJvYcCWHsAt8rw8Xu/W5rCSTRFzl535+DOqm4tHMOYC7Rwh0KSNUDmfStz/GjuCyXEn4SGOHlXSzwyFzBL3MrqISueo=@vger.kernel.org X-Gm-Message-State: AOJu0Yxsx27DMs5cEg8n1iAuHZLOboidsTG/3FhLbU8ApmPZW/V+Uzlw zVHZryGHZT4xxZwF3Jy9lB8A4LCtNwe4JCEo8CeHYnXte0rl256Q9gZQ/Jm42XMCNUOPo+FAd8+ disI0R5vLcpZEjA== X-Google-Smtp-Source: AGHT+IFLBGzKFZmsktbIeW8pxhnG9+8Euh8hihVcHszDWEwnIoCPLdtI1rxSOPsP9ipwfFfbMW9NefHkQ4HZoLE= X-Received: from pfoo10.prod.google.com ([2002:a05:6a00:1a0a:b0:732:20df:303c]) (user=tjmercier job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2313:b0:736:692e:129 with SMTP id d2e1a72fcca58-7423c0421e7mr21330789b3a.24.1747071664262; Mon, 12 May 2025 10:41:04 -0700 (PDT) Date: Mon, 12 May 2025 17:40:36 +0000 In-Reply-To: <20250512174036.266796-1-tjmercier@google.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250512174036.266796-1-tjmercier@google.com> X-Mailer: git-send-email 2.49.0.1045.g170613ef41-goog Message-ID: <20250512174036.266796-6-tjmercier@google.com> Subject: [PATCH bpf-next v5 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 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, shuah@kernel.org, song@kernel.org, "T.J. Mercier" 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 Acked-by: Christian König --- .../testing/selftests/bpf/bpf_experimental.h | 5 +++ .../selftests/bpf/prog_tests/dmabuf_iter.c | 42 +++++++++++++++++-- .../testing/selftests/bpf/progs/dmabuf_iter.c | 38 +++++++++++++++++ 3 files changed, 82 insertions(+), 3 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_cache *it) __weak __ksym; extern void bpf_iter_kmem_cache_destroy(struct bpf_iter_kmem_cache *it) __weak __ksym; +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 __ksym; + #endif diff --git a/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c b/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c index 8ae18e4d7238..d9606f3361b9 100644 --- a/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c +++ b/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c @@ -106,15 +106,18 @@ static int create_sys_heap_dmabuf(void) return -1; } -static int create_test_buffers(void) +static int create_test_buffers(int map_fd) { + bool f = false; + udmabuf = create_udmabuf(); sysheap_dmabuf = create_sys_heap_dmabuf(); if (udmabuf < 0 || sysheap_dmabuf < 0) return -1; - return 0; + return bpf_map_update_elem(map_fd, udmabuf_test_buffer_name, &f, BPF_ANY) || + bpf_map_update_elem(map_fd, sysheap_test_buffer_name, &f, BPF_ANY); } static void destroy_test_buffers(void) @@ -215,15 +218,45 @@ static void subtest_dmabuf_iter_check_default_iter(struct dmabuf_iter *skel) close(iter_fd); } +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 = bpf_program__fd(skel->progs.iter_dmabuf_for_each); + + err = 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"); + 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 = NULL; + int map_fd; skel = dmabuf_iter__open_and_load(); if (!ASSERT_OK_PTR(skel, "dmabuf_iter__open_and_load")) return; - if (!ASSERT_OK(create_test_buffers(), "create_test_buffers")) + map_fd = 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_test_buffers")) goto destroy; if (!ASSERT_OK(dmabuf_iter__attach(skel), "skel_attach")) @@ -233,8 +266,11 @@ void test_dmabuf_iter(void) subtest_dmabuf_iter_check_no_infinite_reads(skel); 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); destroy: destroy_test_buffers(); +destroy_skel: dmabuf_iter__destroy(skel); } diff --git a/tools/testing/selftests/bpf/progs/dmabuf_iter.c b/tools/testing/selftests/bpf/progs/dmabuf_iter.c index 900a730a05f6..5f2cc4f3de96 100644 --- a/tools/testing/selftests/bpf/progs/dmabuf_iter.c +++ b/tools/testing/selftests/bpf/progs/dmabuf_iter.c @@ -9,6 +9,13 @@ char _license[] SEC("license") = "GPL"; +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 = bpf_map_lookup_elem(&testbuf_hash, name); + if (found) { + bool t = true; + + bpf_map_update_elem(&testbuf_hash, name, &t, BPF_EXIST); + } + } + + return 0; +}