From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=209.85.215.180 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793659087; b=cXeRis2ZOXZghGJmGsPh+w+vy9X/l6Egb7gdY1zd0/IRvAGt8bvGgiZ4/DmA4SrzIAlm LjTV4Vy1UdU9z0/bvqwKT5MctEimZQdfYhiM0bfWoiXYXjdFCPzgTchaKbCsuBxT4Gz2y uHWu3Sydl70E/WqA1iTFSv3fH2C/E+AV01BXAqTKz6CLEWS2qu1tHmRnJG82fJ9PKTsKg oF0uTBBK5ukV0+6a5cN2+4dLW3apUZ/ts3o4erAtUVvkZUpBpO52cM+8WpO27gX3AAllV CIKhuMaYseKMTkC8CfJ4KyLtJp0y9kHNtRNx06/NPbCk18N2JVqefpo1NiOxVB0RMNw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793659087; h=DMARC-Filter:Received:DKIM-Signature:X-Google-DKIM-Signature: X-Forwarded-Encrypted:X-Gm-Message-State:X-Gm-Gg:X-Received:Received: Content-Type:Date:Message-Id:Cc:Subject:From:To:In-Reply-To: References:Content-Transfer-Encoding:MIME-Version; bh=h+ZF210fax8HjS8szV9XHjrNkBuZH/bj1V8SNZNkYcY=; b=fYw6AmyoLTvMizQ1Vmp15svd9dTyJ5/ikmB6oNm3z6wF1w8eqQ3F2wBb4oFi4Kj6fyuh xe4fvRsk0GD2HYPkpTB7CwZhpPrKz0lQcHIVrZFZ2gAs8Mvypl2Uzcwj0FFvYksCPVjz2 WV7cZA8k8vCp5eEhbLFDbQuCUjthyLzfVMkn45qwnZ1Pjx2LfP3lIj7Uj05ZUEMuPdoyl 77LqrMLG/1ftPytXy6PocH9f7iMegx8yZ8E7mnLsiSIKP/Krrx+j/cBdMjUatny8K0QZJ 8gGEM8D1pYIKuu2XGM3VxhQJ5jyqg1LnD8G4xQGsnBfOcn8ynSxvJgwyKpheyaMOOwg== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20260707 header.b=kvJUmZK9; arc=none smtp.remote-ip=209.85.215.180 Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9EAF2606A324 for ; Mon, 2 Nov 2026 22:38:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 9EAF2606A324 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20260707 header.b=kvJUmZK9 Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-cdb1199bfd8so1051802a12.1 for ; Mon, 02 Nov 2026 14:38:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20260707; t=1793659086; x=1794263886; darn=vger.kernel.org; h=mime-version:content-transfer-encoding:references:in-reply-to:to :from:subject:cc:message-id:date:content-type:from:to:cc:subject :date:message-id:reply-to:content-type; bh=h+ZF210fax8HjS8szV9XHjrNkBuZH/bj1V8SNZNkYcY=; b=kvJUmZK9vmuMJAdL0K4EFwjLGSetSR58lljEn9BsFrCBTRaoiP+Q1QDXZTajenGWBW JC5oooWXUbO2abypveTsQu6paZzBPM0fC4UoUzM82GBbBxtnzIbtPgJsKTpVMfr+Wlp+ Zjks5E32OWXwRfoMX6veCGB9+HBplceJGXbJsdd1Pt7jVsOjmZRYA4QYT4m1JPIdzz27 BqC7LSsHg7jcOG1jNIIaqz8LnYOhtOv5KoMYd9u2gkUPvRcqquk5TfJRT+mqzTbwAU0D hQ+6E+jAwKRaGtpsRaXZZG/JIipaJt7k9BFt5sqsj18xnSIawpZM6gyf5w/WaD+SAtsg Cl3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793659086; x=1794263886; h=mime-version:content-transfer-encoding:references:in-reply-to:to :from:subject:cc:message-id:date:content-type:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=h+ZF210fax8HjS8szV9XHjrNkBuZH/bj1V8SNZNkYcY=; b=taoDn30j2hBggLj4UQrw2LCJBr6h5KRMKHQrBsO+garK3HhqkeXrIsrpIbnckFIc3a sT5XKTzAXDVbDuo3XFpt//7458t5Kdt0phh5niRPFL1g4p/tQ9lgSSBzdEb8A55hTWRk TqTxMvNMYl0WIgfiK8zwKO/r6a6jB6+bNxIeLz82BObEzfW685xIQ0mT9seGzrSuPudG yYXeoVYKXTzvtUmVjxw1vV1tK0CudJ6+KvqXOVRXGzMCA0N0VY2+LpB2jdVXoZnSE3qy oR1j2QHTx3mb3an887uXQyaUssq6JjpYTcFCdjcbLFpjZgUfvREERp/pXRsTRi3LJ7kc 9F8A== X-Forwarded-Encrypted: i=1; AKwUvByAXbQz7L7Vx5VoFMz1HRoXNoprzW8L/1x94qMyrgGm1Be35NN+i1KpemUVGroP8FXDTiYDCJ9kphLVXxI=@vger.kernel.org X-Gm-Message-State: AFq9FYLmbdu6/rVGM8tnvBXayROkqQ3s4LGCeeBRfediNuaIXphkVUnu 07lso0191GVRTitaKD656YmTC9yEAj9hbsUErgRr5Gy5i+C5m8otXI7h X-Gm-Gg: AYBFou2wmSgaUGWFMgE4GN8bD+OgMaXdqChD1hjDdVut93GST52SgHZ8uXRdMy/O5xd h1kYOwWWrNusAyl7DBdx4gVo9r4WFGuHMKwrlQX9j3528OOlnHr8BllhgOx9yYrLbWY/aDHFpKX ylAFqL0l9Y6E2Llp5D8qLhbVwWAg0oY+q75ASiUd3LqqbCHdoPm5OHvJBini6xJEG7i9SJmST3s VPYIwii8b9K6eK/2s2CJuQlACLqyU/WOLgLusUtCKSJ5Tmunc+tLLjoTfL6E9mBe+3qEpXSTDvw /7xCQalyQs0nuvLO0mGDK6OSQ2ayHUXOqqDIg6dfPbA52KhlsoDOMbncehohGICwTzaVoDwjErD Nwz7c9dPvEEb6ir87Ln+CQ91osAhd+TTOoXIawLVRQUA0VPo6e72gRAfDlbwPQOZhqKrRdQzo5+ BXX2I4Fyfjz2whFR8fVYxbWJoRaNZkTDEz09+HLZYVfuX5JkdYW8V52X2/ZgGevsJwfdKZhpIuX CBhlTwW2kp1k+Ypudc1+HvjlOQBYRmy9jdxUvFk93XRKQuFbu5Ts+ZpGb8bea9X8JWI3uhTqseW jA4ak8vgfzsEC5DzB58TRS+zCGIhJ8cl/GrinXZdeIG7llArbCNpk9weG/lPgFFUKkfLFWadgiV XXmWK8se7BV+ACWDR3z/Ar423YfrR6gx0dg== X-Received: by 2002:a05:6a21:39a:b0:3de:b120:bb88 with SMTP id adf61e73a8af0-3e928b88d42mr9530537637.2.1793659085876; Mon, 02 Nov 2026 14:38:05 -0800 (PST) Received: from localhost ([153.61.198.245]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-8aadac9c505sm2511972b3a.53.2026.11.02.14.38.05 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 02 Nov 2026 14:38:05 -0800 (PST) Content-Type: text/plain; charset=UTF-8 Date: Mon, 02 Nov 2026 22:38:05 +0000 Message-Id: Cc: , , , , , , , , , , , , , , , Subject: Re: [PATCH bpf-next v3 4/8] selftests/bpf: make arena_base() opaque to GCC's -Warray-bounds From: "Alexei Starovoitov" To: "Vineet Gupta" , In-Reply-To: <20261102220717.4079739-5-vineet.gupta@linux.dev> References: <20261102220717.4079739-1-vineet.gupta@linux.dev> <20261102220717.4079739-5-vineet.gupta@linux.dev> Content-Transfer-Encoding: 8bit X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 On Mon, Nov 02, 2026 at 02:07 PM Vineet Gupta wrote: > The barrier is behind #ifdef __clang__ so clang keeps the plain macro. > It does not need it, and the barrier is not free: it blocks reuse of > the map address, so each call site reloads it. Across the five progs > and 20 call sites that is +35 instructions under GCC > (2528 -> 2563), about 1.4% on those objects and nothing elsewhere. > Clang output is unchanged, bit for bit. stream.c already has barrier_var() for both compilers. How about this one instead: diff --git a/tools/testing/selftests/bpf/libarena/include/bpf_arena_common.h b/tools/testing/selftests/bpf/libarena/include/bpf_arena_common.h index 82aafe8..0eba529 100644 --- a/tools/testing/selftests/bpf/libarena/include/bpf_arena_common.h +++ b/tools/testing/selftests/bpf/libarena/include/bpf_arena_common.h @@ -49,7 +49,16 @@ void __arena* bpf_arena_alloc_pages(void *map, void __arena *addr, __u32 page_cn int bpf_arena_reserve_pages(void *map, void __arena *addr, __u32 page_cnt) __ksym __weak; void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt) __ksym __weak; -#define arena_base(map) ((void __arena *)((struct bpf_arena *)(map))->user_vm_start) +/* + * The map definition is smaller than struct bpf_arena. + * barrier_var() hides that from -Warray-bounds of GCC. + */ +#define arena_base(map) \ + ({ \ + struct bpf_arena *___arena = (void *)(map); \ + barrier_var(___arena); \ + (void __arena *)___arena->user_vm_start; \ + }) #else /* when compiled as user space code */ diff --git a/tools/testing/selftests/bpf/progs/stream.c b/tools/testing/selftests/bpf/progs/stream.c index 1ae015c..b4d88d0 100644 --- a/tools/testing/selftests/bpf/progs/stream.c +++ b/tools/testing/selftests/bpf/progs/stream.c @@ -178,16 +178,8 @@ __stderr("Call trace:\n" "|[ \t]+[^\n]+\n)*}}") int stream_arena_write_fault(void *ctx) { - struct bpf_arena *ptr = (void *)&arena; - u64 user_vm_start; + u64 user_vm_start = (u64)arena_base(&arena); - /* Prevent GCC bounds warning: casting &arena to struct bpf_arena * - * triggers bounds checking since the map definition is smaller than struct - * bpf_arena. barrier_var() makes the pointer opaque to GCC, preventing the - * bounds analysis - */ - barrier_var(ptr); - user_vm_start = ptr->user_vm_start; fault_addr = user_vm_start + 0x7fff; bpf_addr_space_cast(user_vm_start, 0, 1); asm volatile ( @@ -212,16 +204,8 @@ __stderr("Call trace:\n" "|[ \t]+[^\n]+\n)*}}") int stream_arena_read_fault(void *ctx) { - struct bpf_arena *ptr = (void *)&arena; - u64 user_vm_start; + u64 user_vm_start = (u64)arena_base(&arena); - /* Prevent GCC bounds warning: casting &arena to struct bpf_arena * - * triggers bounds checking since the map definition is smaller than struct - * bpf_arena. barrier_var() makes the pointer opaque to GCC, preventing the - * bounds analysis - */ - barrier_var(ptr); - user_vm_start = ptr->user_vm_start; fault_addr = user_vm_start + 0x7fff; bpf_addr_space_cast(user_vm_start, 0, 1); asm volatile ( @@ -252,17 +236,9 @@ int stream_arena_load_acquire_fault(void *ctx) .off = 0x7fff, .imm = 0x100, /* BPF_LOAD_ACQ */ }; - struct bpf_arena *ptr = (void *)&arena; - u64 user_vm_start, val; + u64 user_vm_start = (u64)arena_base(&arena); + u64 val; - /* - * Prevent GCC bounds warning: casting &arena to struct bpf_arena * - * triggers bounds checking since the map definition is smaller than - * struct bpf_arena. barrier_var() makes the pointer opaque to GCC, - * preventing the bounds analysis. - */ - barrier_var(ptr); - user_vm_start = ptr->user_vm_start; fault_addr = user_vm_start + 0x7fff; bpf_addr_space_cast(user_vm_start, 0, 1); asm volatile ( @@ -296,17 +272,9 @@ int stream_arena_xchg_fault(void *ctx) .off = 0x7fff, .imm = 0xe1, /* BPF_XCHG */ }; - struct bpf_arena *ptr = (void *)&arena; - u64 user_vm_start, val; + u64 user_vm_start = (u64)arena_base(&arena); + u64 val; - /* - * Prevent GCC bounds warning: casting &arena to struct bpf_arena * - * triggers bounds checking since the map definition is smaller than - * struct bpf_arena. barrier_var() makes the pointer opaque to GCC, - * preventing the bounds analysis. - */ - barrier_var(ptr); - user_vm_start = ptr->user_vm_start; fault_addr = user_vm_start + 0x7fff; bpf_addr_space_cast(user_vm_start, 0, 1); /* @@ -346,17 +314,9 @@ int stream_arena_cmpxchg_fault(void *ctx) .off = 0x7fff, .imm = 0xf1, /* BPF_CMPXCHG */ }; - struct bpf_arena *ptr = (void *)&arena; - u64 user_vm_start, val; + u64 user_vm_start = (u64)arena_base(&arena); + u64 val; - /* - * Prevent GCC bounds warning: casting &arena to struct bpf_arena * - * triggers bounds checking since the map definition is smaller than - * struct bpf_arena. barrier_var() makes the pointer opaque to GCC, - * preventing the bounds analysis. - */ - barrier_var(ptr); - user_vm_start = ptr->user_vm_start; fault_addr = user_vm_start + 0x7fff; bpf_addr_space_cast(user_vm_start, 0, 1); /*