Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp4020667pxb; Tue, 25 Jan 2022 01:34:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJzCPqNKNBxFM9l6FEOJ7Z1kNWmyz60PH8zkX5Lp2bpktvJ1txgnMuKU8iZLJkFzMNbdK1Mg X-Received: by 2002:aa7:9009:0:b0:4c6:fe2f:6a94 with SMTP id m9-20020aa79009000000b004c6fe2f6a94mr5430138pfo.25.1643103266983; Tue, 25 Jan 2022 01:34:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643103266; cv=none; d=google.com; s=arc-20160816; b=Ph7iOG37TjBBoXmdb1qI3dBTu5y/vu4GFWsJBkPotu6AbMq4UmPm5UBHhGiNMSyncG SMY/bh/yFePd36JiDBgJkyqL9wtvicKsb/qdmNZsSIyCIijBGIBjVXBqMsFFpeYHQn/a oK19ZWyTskePixs0Q+tZaggT5nWmoSbPMwE3bE5rahO0yy7h4TCoejTTKxo7Dtb0oITk Ls39hpPIA9ZqYmfCllDpn/DhT/xXpx/9VVM3knVuB2FfyheZZkkqvSCkQqv5JBW3UvBD Doi0hIMSKeUaoAq8B/fy9bDzyhUvtuSBQQaDtXgBpQVEhygG2HOFb0zsrbcrdBjJkP8Q NDRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=5XzQzliEIx/6wJeVJt8SZCH1fsPNOihb4cNZd4xVT98=; b=sWgYXoIcJKLY8XRH4Adc1suKM89AwPRQDk1n5SrHf+UE5AiyitNilhPQ04urLUWIKu V3cfUYRMJ2Vkt/yvRh+/DDWJ3b+zPaxI57zlZ8ADTOapasoz6u+vgeNrLWYwF5H6U/Ow k8Rj/MErlSYebQIldnyZLu20vnadfGi/kWUFOqND1nWNHKzWL92dsbcVvDAAyGSX9VAh GqvBYMAXjd7dM5TIdFh6bQFtVjr4CLp9GKFjuSzgaoc//d+MBM3bYP5XRBwV1UJU4x7n Jnz/vyoTkLtvuYbKCB0wVoVXZ6zxXKfjtGUmWLVSkftZj/+4u9jNXV8HvGC+OiAEEAu6 +xag== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=O2BCshx+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c15si15971596pgc.606.2022.01.25.01.34.15; Tue, 25 Jan 2022 01:34:26 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=O2BCshx+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1452575AbiAYItp (ORCPT + 99 others); Tue, 25 Jan 2022 03:49:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42814 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1452376AbiAYIql (ORCPT ); Tue, 25 Jan 2022 03:46:41 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 961EDC055A8C; Mon, 24 Jan 2022 23:21:30 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 3FFE161307; Tue, 25 Jan 2022 07:21:30 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A5A75C340E8; Tue, 25 Jan 2022 07:21:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1643095289; bh=/7vav1tP1IFHJLsPaTScBMjyW/1YdDoF34LK07MnAaw=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=O2BCshx+Gvniy0Y60rn1m43b24EsUlYsOT6aMKgW8HlxYziOQZJiE79PEhUYG0ISg pCph+I+WK0BwuVIcqeEODNwzEfgOWgjPdVAqI3kPxC0340goLtbFMAyh8GFGX5c7tb jjEttOxIEKlFt8LZRUWRh6yJaMrMAkD3jLqFUoBekbt8FY7iwye7gNQXe9zmIQwsDS bjnLAS/424xi2N9ry4FETJlYKAsRCoEmHrjs3T2PWZzNIjlYG/EympisqdFXttfH7z Q6nKFMH7wnju6NVVBzuMelO4G/VlXRxiWQuwUIg6ouGrwX2BLtjT59DYRUHMcJPh2F Ld2dDFkb5pLkA== Received: by mail-yb1-f177.google.com with SMTP id k17so3718029ybk.6; Mon, 24 Jan 2022 23:21:29 -0800 (PST) X-Gm-Message-State: AOAM533pIRDiaHX8ID7cV64He8OZZRp5OnPNuiVNYONZN13Vsqr83Oqm xKMBz/rlfLamP1AmA5C5wFQzbvoB+9XjT6tm0M0= X-Received: by 2002:a5b:c01:: with SMTP id f1mr27513023ybq.47.1643095288812; Mon, 24 Jan 2022 23:21:28 -0800 (PST) MIME-Version: 1.0 References: <20220121194926.1970172-1-song@kernel.org> <20220121194926.1970172-7-song@kernel.org> <7393B983-3295-4B14-9528-B7BD04A82709@fb.com> <5407DA0E-C0F8-4DA9-B407-3DE657301BB2@fb.com> <5F4DEFB2-5F5A-4703-B5E5-BBCE05CD3651@fb.com> <5E70BF53-E3FB-4F7A-B55D-199C54A8FDCA@fb.com> <2AAC8B8C-96F1-400F-AFA6-D4AF41EC82F4@fb.com> In-Reply-To: From: Song Liu Date: Mon, 24 Jan 2022 23:21:17 -0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v6 bpf-next 6/7] bpf: introduce bpf_prog_pack allocator To: Alexei Starovoitov Cc: Song Liu , Ilya Leoshkevich , bpf , Network Development , LKML , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Kernel Team , Peter Zijlstra , X86 ML Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Jan 24, 2022 at 9:21 PM Alexei Starovoitov wrote: > > On Mon, Jan 24, 2022 at 10:27 AM Song Liu wrote: > > > > > > Are arches expected to allocate rw buffers in different ways? If not, > > > I would consider putting this into the common code as well. Then > > > arch-specific code would do something like > > > > > > header = bpf_jit_binary_alloc_pack(size, &prg_buf, &prg_addr, ...); > > > ... > > > /* > > > * Generate code into prg_buf, the code should assume that its first > > > * byte is located at prg_addr. > > > */ > > > ... > > > bpf_jit_binary_finalize_pack(header, prg_buf); > > > > > > where bpf_jit_binary_finalize_pack() would copy prg_buf to header and > > > free it. > > It feels right, but bpf_jit_binary_finalize_pack() sounds 100% arch > dependent. The only thing it will do is perform a copy via text_poke. > What else? > > > I think this should work. > > > > We will need an API like: bpf_arch_text_copy, which uses text_poke_copy() > > for x86_64 and s390_kernel_write() for x390. We will use bpf_arch_text_copy > > to > > 1) write header->size; > > 2) do finally copy in bpf_jit_binary_finalize_pack(). > > we can combine all text_poke operations into one. > > Can we add an 'image' pointer into struct bpf_binary_header ? There is a 4-byte hole in bpf_binary_header. How about we put image_offset there? Actually we only need 2 bytes for offset. > Then do: > int bpf_jit_binary_alloc_pack(size, &ro_hdr, &rw_hdr); > > ro_hdr->image would be the address used to compute offsets by JIT. If we only do one text_poke(), we cannot write ro_hdr->image yet. We can use ro_hdr + rw_hdr->image_offset instead. > rw_hdr->image would point to kvmalloc-ed area for emitting insns. > rw_hdr->size would already be populated. > > The JITs would write insns into rw_hdr->image including 'int 3' insns. > At the end the JIT will do text_poke_copy(ro_hdr, rw_hdr, rw_hdr->size); > That would be the only copy that will transfer everything into final > location. > Then kvfree(rw_hdr) The only problem is the asymmetry of allocating rw_hdr from bpf/core.c, and freeing it from arch/bpf_jit_comp.c. But it doesn't bother me too much. Thanks, Song