From patchwork Tue Feb 4 18:30:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959557 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 2E61D21771D; Tue, 4 Feb 2025 18:30:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693841; cv=none; b=YWfMM4X9CZi7lnPHL1IvxKQU2mUZyjd9Ezl6SAy1tRjC0k89LgKRz7F9ea1VsWe+WCqRy8r/94262ZrusL+lPfK63w0nJl7oATWkjaDtTAdOCqFQTFYFJ8IVSlJ8E58fVKX5cTAyn3qui9XXPncZGN19FuCDJxpHE4KjIz/dNpk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693841; c=relaxed/simple; bh=O/LtVesONaxr1pxjJg4rCojavnafUIXIpZWNOirrbIg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CSQ5K8EQ9kZs/Mwo95kdgFg3pkOcH1YaKiu1dnThIligzjtHU8yBng8q+Dud3jNFv/W7mz+iyvxq3RNOs6vn6H9T3p9OsWTGrXz10FMaMB/JG3CCg0g3RDqHEFb8/iEJYAF9Iw1s0Z0rhapclkNqt6bKqNWS6VfMdDYCWdBHjAw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=DaL27D67; arc=none smtp.client-ip=209.85.214.170 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) header.d=gmail.com header.i=@gmail.com header.b="DaL27D67" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-21effc750d2so19475485ad.3; Tue, 04 Feb 2025 10:30:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693839; x=1739298639; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=K1wHAm6t1sH0pAL4Ah9aBiIUBjLdmS33qQ+4mCf5Cy4=; b=DaL27D67mmUYL6cNwG3KVjk0uiyzqsscRVl+T/+dIIWLnCsNakbl6hVZdTrGeC55ay HRDrMW5CWOm0IgBSWnyPFfqcKzTtX59KgxhI4fa6Z2xQ0uwT+e1lhSte4Hi/0M1vtgyj j/2Qdk5aCcXwYUm8/TSTAo8UPOB7Deoz8dlWh2fDJglU4IMFjEuGMeDm1hBS0lA+0fxp +k3Ndky35vkGz/Am7YDPOv+bCVUOemiQpZpLwHCwGyNLCE/EaFmsBm+7OBGHbrF/khfr wrKtqoA+8zPggLYWMwiPx+gz3OYIp/+3P1+D61zCG80tTepyRpkRfz9zHga0OKf8uqEN OiUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693839; x=1739298639; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=K1wHAm6t1sH0pAL4Ah9aBiIUBjLdmS33qQ+4mCf5Cy4=; b=vYPwO0egqEr8epLgJlyJP1IMlw24ReVN7jnGEki8Zan/z4dxLy64XG5Ez4pIXFa1+O P1itcgxePTKs3RS+0pjXQM5YlnwNnMcI+S/fJeMfpCNID9u7dpe7/APQSY9uyCOMH91u 7kw6xPuPQQ+7FJlPnofe4sd5BM/Mrz1awnccedz+GwoqNxQlqHebv7orQ5naD/3PA/4l dV9roNQScv0ENonit0BDRz48mvSkonk/hLBv072HFPGugYh8QBXiWjFo2TzSuvt7SOpT s2DGtQUulFgE2BN4BpLRXbu42+w1eJfe3rwnLAuEJlCqdmfE/vj6jVQfmBEk2vI3yBHt ZL0w== X-Forwarded-Encrypted: i=1; AJvYcCX6DwL7kHY1camI6TqbgN+3tB0dqOjG48IAv+Qt2Ib0AHPxyYnGsLxE1ISKcCuwSEVbtAICMm0=@vger.kernel.org X-Gm-Message-State: AOJu0YybEpq5MWULdc3fU7zMO+lmpcoV/4usIswhplGKdVfJeqh39CoD aHUZ3J3Mbp8G0hIFyaHGI/mYHyWxOBMkq5J4JGIuVM+mGaFPJFXY X-Gm-Gg: ASbGncvluwQhANRAoQgXfQgFk+4Clh445tY7ygMKCqYNVVLlrK0yuZKABjU2Hd0k0DY oFOZODngYOOdJAzShNaliwumua1N/HuUWB3MmfUFTqda2bftrMKWq4JwsH5uICEf5XiMFD51Y/O rK2fYXiq2Kyz0NNfT3vlztYQ3XILVJP5mRl/CzzJ7xES84zPBEj6bjgOYMyX0izHuEwDUuLgPiZ 9DPZmfMR6NRJHiodJDPIHET57dJ2eLCss0OvXWhXSecOQcc32UKQtbrqII5chW2sN3s/5jSTIKf GPvn1B/v4ALDjy76GZmKqIFRQlKw1py2GhCVlseRdmirb8HAeify6A== X-Google-Smtp-Source: AGHT+IGdeKbDbqw9Ir+TE0OiPKB0OTr8fWzAFMaMcJOKSEQYkWHehaxcoTRwiwEOV4iOtGwb8tq0zQ== X-Received: by 2002:a17:902:d54d:b0:21f:7bd:57f1 with SMTP id d9443c01a7336-21f07bd59a7mr38340435ad.53.1738693839120; Tue, 04 Feb 2025 10:30:39 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.30.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:30:38 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 01/12] bpf: add support for bpf_setsockopt() Date: Wed, 5 Feb 2025 02:30:13 +0800 Message-Id: <20250204183024.87508-2-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Users can write the following code to enable the bpf extension: int flags = SK_BPF_CB_TX_TIMESTAMPING; int opts = SK_BPF_CB_FLAGS; bpf_setsockopt(skops, SOL_SOCKET, opts, &flags, sizeof(flags)); Signed-off-by: Jason Xing --- include/net/sock.h | 3 +++ include/uapi/linux/bpf.h | 8 ++++++++ net/core/filter.c | 23 +++++++++++++++++++++++ tools/include/uapi/linux/bpf.h | 1 + 4 files changed, 35 insertions(+) diff --git a/include/net/sock.h b/include/net/sock.h index 8036b3b79cd8..7916982343c6 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -303,6 +303,7 @@ struct sk_filter; * @sk_stamp: time stamp of last packet received * @sk_stamp_seq: lock for accessing sk_stamp on 32 bit architectures only * @sk_tsflags: SO_TIMESTAMPING flags + * @sk_bpf_cb_flags: used in bpf_setsockopt() * @sk_use_task_frag: allow sk_page_frag() to use current->task_frag. * Sockets that can be used under memory reclaim should * set this to false. @@ -445,6 +446,8 @@ struct sock { u32 sk_reserved_mem; int sk_forward_alloc; u32 sk_tsflags; +#define SK_BPF_CB_FLAG_TEST(SK, FLAG) ((SK)->sk_bpf_cb_flags & (FLAG)) + u32 sk_bpf_cb_flags; __cacheline_group_end(sock_write_rxtx); __cacheline_group_begin(sock_write_tx); diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 2acf9b336371..6116eb3d1515 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -6913,6 +6913,13 @@ enum { BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7F, }; +/* Definitions for bpf_sk_cb_flags */ +enum { + SK_BPF_CB_TX_TIMESTAMPING = 1<<0, + SK_BPF_CB_MASK = (SK_BPF_CB_TX_TIMESTAMPING - 1) | + SK_BPF_CB_TX_TIMESTAMPING +}; + /* List of known BPF sock_ops operators. * New entries can only be added at the end */ @@ -7091,6 +7098,7 @@ enum { TCP_BPF_SYN_IP = 1006, /* Copy the IP[46] and TCP header */ TCP_BPF_SYN_MAC = 1007, /* Copy the MAC, IP[46], and TCP header */ TCP_BPF_SOCK_OPS_CB_FLAGS = 1008, /* Get or Set TCP sock ops flags */ + SK_BPF_CB_FLAGS = 1009, /* Used to set socket bpf flags */ }; enum { diff --git a/net/core/filter.c b/net/core/filter.c index 2ec162dd83c4..1c6c07507a78 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5222,6 +5222,25 @@ static const struct bpf_func_proto bpf_get_socket_uid_proto = { .arg1_type = ARG_PTR_TO_CTX, }; +static int sk_bpf_set_get_cb_flags(struct sock *sk, char *optval, bool getopt) +{ + u32 sk_bpf_cb_flags; + + if (getopt) { + *(u32 *)optval = sk->sk_bpf_cb_flags; + return 0; + } + + sk_bpf_cb_flags = *(u32 *)optval; + + if (sk_bpf_cb_flags & ~SK_BPF_CB_MASK) + return -EINVAL; + + sk->sk_bpf_cb_flags = sk_bpf_cb_flags; + + return 0; +} + static int sol_socket_sockopt(struct sock *sk, int optname, char *optval, int *optlen, bool getopt) @@ -5238,6 +5257,7 @@ static int sol_socket_sockopt(struct sock *sk, int optname, case SO_MAX_PACING_RATE: case SO_BINDTOIFINDEX: case SO_TXREHASH: + case SK_BPF_CB_FLAGS: if (*optlen != sizeof(int)) return -EINVAL; break; @@ -5247,6 +5267,9 @@ static int sol_socket_sockopt(struct sock *sk, int optname, return -EINVAL; } + if (optname == SK_BPF_CB_FLAGS) + return sk_bpf_set_get_cb_flags(sk, optval, getopt); + if (getopt) { if (optname == SO_BINDTODEVICE) return -EINVAL; diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 2acf9b336371..70366f74ef4e 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -7091,6 +7091,7 @@ enum { TCP_BPF_SYN_IP = 1006, /* Copy the IP[46] and TCP header */ TCP_BPF_SYN_MAC = 1007, /* Copy the MAC, IP[46], and TCP header */ TCP_BPF_SOCK_OPS_CB_FLAGS = 1008, /* Get or Set TCP sock ops flags */ + SK_BPF_CB_FLAGS = 1009, /* Used to set socket bpf flags */ }; enum { From patchwork Tue Feb 4 18:30:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959558 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f44.google.com (mail-pj1-f44.google.com [209.85.216.44]) (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 CE88F21639F; Tue, 4 Feb 2025 18:30:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693847; cv=none; b=J1JzWZO4eW4OGCBzAMZnLKoXM1EaFtdppA2AtoDotkCL1GhvlkEjsWp0JfoCOj1Gby44RgTrCvliyebZ3Jvk3lhmBYpqjb/HK4E7dPN1fkRgqiJo/kOKzQqZn+llL+fu5+aOHVQnYqJFbFbEkIThO44pRCCgXu/jnzWBqk+WD+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693847; c=relaxed/simple; bh=r4VaYJrwHCXDlAcfMr7sr6lS0pk7V2NSw4LKzmX9i5o=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=N2KMy9oOrXkBMg2NDNFu+R0U1fMV+uffKGxVJLMfmAN8nwCNKzaBSyghWKTJjo3xG4VRTlq1pnPYQ41qvqta/oE0bQOixNfzrFXrKx2oTACAehtYlSZHaleCbJ3LrO5YChhUe7ZPHfJnYqtm6Thvs3YyInMntTZaFkYzoe45cQk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XhIenCxa; arc=none smtp.client-ip=209.85.216.44 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) header.d=gmail.com header.i=@gmail.com header.b="XhIenCxa" Received: by mail-pj1-f44.google.com with SMTP id 98e67ed59e1d1-2f9d9ee2ec2so497365a91.1; Tue, 04 Feb 2025 10:30:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693845; x=1739298645; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FM0Dc99ZK+Ah2fMPgdFn/MAVtyk4O2Sk7UtUiTgjHeU=; b=XhIenCxa+x0Fr8heG2zmxUjQB1QVlklyYbQ0CR0Zjf21ZXWBlag3uiIRV7vGg4zABz R/O4XuFbv//ks39ep8K+XuDrgn7TOfkpQyslwvAQkoXoREvGzWAxgThg84rmGD8X8slS ZnEYUYuxxfq8FiCNp6DJ6cQpXbVwSMMDVjikEUDMvhAqU3ZMJUlnq4QXKotEfT4AXwWX Wuoo90qQ4HCdipfmblveOrPmUfDmLBwrz7LA/PT/CmFCNtkGNRiuNOXlJrRJp6buiT+Y ehoG/sHhlrjOOHMqKYyUvi9wGem6ftA4QM7PD+edExgCPXit/RayVdy4Je6pPcwDNocO AAOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693845; x=1739298645; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FM0Dc99ZK+Ah2fMPgdFn/MAVtyk4O2Sk7UtUiTgjHeU=; b=c9jsaaiVZNLNIk64CuFYerW8DFFL9QVsfuUm3dW2i1dYtcMKqouTVckY78DtAG+nYM wGgqHno57Zp5eyKcEqzATf4SJZvaRCpmxzJXBGRB/SmqatnwIpM+s4g8WshZIJvosd+8 3+T1X1fZHQLnS//SUT7Hc5/CS7dTTvYJKU0e2GbmPGaO37+006la5jQKEMlsV5Bp1vob 9lQKagpEyg1QhE2AIykv2czRgTpLe03c487CzUTFRI3euUKbipeL2zGHq0BSXcm9RA07 FT7FZxHmcc1iLisC987aO+XzVe1eDf13DuA1th72lydga6fEA7TAooWn/zhYTiMfukJJ mjWA== X-Forwarded-Encrypted: i=1; AJvYcCXf0nu1enUfeIGyoDaw1b+dIVdJs9pi8MDPSXFWxMqldxNzBRQtkBr9qZeWUHztZrW2BCfgcQA=@vger.kernel.org X-Gm-Message-State: AOJu0YxwRMD+Cc0Re9B2Pni1fGmXIZEattuKV1VbdhcC0kimFigO04LT /3RWNsda/vlim509tlR3YtkalGziVxCeDqMGi00qXaMwTXKpbpiM X-Gm-Gg: ASbGncuNdhINak37nuU/8t22rp8m/AVBdpe+mFdz9Q5xX/76yxXwCE57C01C8aziRbb /7ohZsX1ayPUso0sdgQg2Yj1VcY0tW9TLUHJXcpnL2SUKzww6jG7KU4BIM1G09vgaEntnCOVYpf CHJhuMaNmIow/D4zegH2TwsCNktCiQg4Amq3oQ6thgZPea4iwi95g9fkkc3KQzShiGXdOluh6Ok ZcPkV/ey2u3zOYxpLhfJ3T0G06kEOP3VFY+cO2tYCj7KnwbG2LG4DDbEnx14uOcFpbS5WEPc3o+ uTla23e+oDLh0CsGaNufIW8BuUq1+oYQJvgTDl9p2cYpwqjfloNmWQ== X-Google-Smtp-Source: AGHT+IGW/lfQI8wLtkgL7QxXbTFdNeXgvTYsAxIWS0wlp7Mg/ZIYtiBso7AMQObTsXmQ++fbPqk+dA== X-Received: by 2002:a17:90b:56c4:b0:2ee:d186:fe48 with SMTP id 98e67ed59e1d1-2f83ac73abamr39272578a91.28.1738693844779; Tue, 04 Feb 2025 10:30:44 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.30.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:30:44 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 02/12] bpf: prepare for timestamping callbacks use Date: Wed, 5 Feb 2025 02:30:14 +0800 Message-Id: <20250204183024.87508-3-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Later, four callback points to report information to user space based on this patch will be introduced. As to skb initialization here, users can follow these three steps as below to fetch the shared info from the exported skb in the bpf prog: 1. skops_kern = bpf_cast_to_kern_ctx(skops); 2. skb = skops_kern->skb; 3. shinfo = bpf_core_cast(skb->head + skb->end, struct skb_shared_info); More details can be seen in the last selftest patch of the series. Signed-off-by: Jason Xing --- include/net/sock.h | 7 +++++++ net/core/sock.c | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/include/net/sock.h b/include/net/sock.h index 7916982343c6..6f4d54faba92 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -2923,6 +2923,13 @@ int sock_set_timestamping(struct sock *sk, int optname, struct so_timestamping timestamping); void sock_enable_timestamps(struct sock *sk); +#if defined(CONFIG_CGROUP_BPF) +void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op); +#else +static inline void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op) +{ +} +#endif void sock_no_linger(struct sock *sk); void sock_set_keepalive(struct sock *sk); void sock_set_priority(struct sock *sk, u32 priority); diff --git a/net/core/sock.c b/net/core/sock.c index eae2ae70a2e0..41db6407e360 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -948,6 +948,21 @@ int sock_set_timestamping(struct sock *sk, int optname, return 0; } +#if defined(CONFIG_CGROUP_BPF) +void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op) +{ + struct bpf_sock_ops_kern sock_ops; + + memset(&sock_ops, 0, offsetof(struct bpf_sock_ops_kern, temp)); + sock_ops.op = op; + sock_ops.is_fullsock = 1; + sock_ops.sk = sk; + bpf_skops_init_skb(&sock_ops, skb, 0); + /* Timestamping bpf extension supports only TCP and UDP full socket */ + __cgroup_bpf_run_filter_sock_ops(sk, &sock_ops, CGROUP_SOCK_OPS); +} +#endif + void sock_set_keepalive(struct sock *sk) { lock_sock(sk); From patchwork Tue Feb 4 18:30:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959559 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (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 44A1415252D; Tue, 4 Feb 2025 18:30:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693852; cv=none; b=KsOaGgL7odcs7kckIHA4Ik4hi9dXh82tTT4zPF590spSs0RlTFLocTCzYuZbobNWzjvA3OAOOmUUWqCvjPGNsG3NSOgwbOvzkS53pMym80v0+shUokOwVfwtEuvlylj+RTJndPyMjSAuGJqKE5mu9/izscl0McKEwEJrvm/D5x4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693852; c=relaxed/simple; bh=MLD9T3qwxPtVejKczEo2KAlFAckOD1gc6Qklzlst2CA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=G7wZQmhuZDMw3lx9bsJP/g4Sdw3JKQBUx/jkdMaJwPK689spei4dSbW/1dzmB7xevc83a6pqSVo4+KtXAya+IjIZuCsc/YDzD3HLp7EvpgaTtIb6jvgXWhE3RU8lWnEmyafIedHBs7bbDHX/zmEV4J9cpCMQ2l5VRxJW/frSbO4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=UnEf2Il5; arc=none smtp.client-ip=209.85.216.41 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) header.d=gmail.com header.i=@gmail.com header.b="UnEf2Il5" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-2f9d3d0f55dso845527a91.1; Tue, 04 Feb 2025 10:30:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693850; x=1739298650; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=oWstQy3dCNpqCO9EXUugHvZBlUNMHzyCKni0JRwI1IE=; b=UnEf2Il51sT0IxNTfBjNRk0uI3n0RFQ7VyivD2EqV28PX4+GuyECs1IpzvAlHSPz87 Clxzwijn/zFurz4rydvcdHRWtnOGuMZUC7CO2/tDKJvUu+W83IT2g+5GPlxgA84gwA8d YUrBtJbDb+mL4WJUcQBPjhtbKofZtIV5B7JSzfJ/MgyDWjYsqIOmKS6fS87cDX2qV5oR JAG4orEoS/jrBZVj8B3CrMLHfIxhmZjRR9YO1sdeIvnxejMgof9Y4Cn9/i0Wu1tQbh5O W0PwcL3LzofEzR3vvyFF8xIzN2X3z02V4uruf5vHhGt/erp4d/s93c7a7oIXD77BMLOY UZ7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693850; x=1739298650; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oWstQy3dCNpqCO9EXUugHvZBlUNMHzyCKni0JRwI1IE=; b=nySkdBo+22SVS8JPgsTHd8O0jxqmZM3CdXBaxSTwh9F1lfssRP52vfjLoIqfqehd4Q OTWMUUSaX2czd1IyRfy/pCc4HwkU8S+Bd/cyQ5R4tGS/2X0wqrl4F1T+XwLpnaKoigQy lQL4/WMKSGoHROun1fskGm5QDyN8g3gWhar6Wh7mmH7ysbsxpxKaBh4C9hyxVrvkdmC7 sblZNMX0H5WmYL/HfY93vmsP4z8YAqFRt2PUj95a56YIK17DWi1HMT6yeqgdPjcWRSZH 0KAIn0FDiXihymJym8Pgsq8sOX6j/NsYynYVWeGWfI7VYQPhFCFeEvQ7dwfX8Z2D8zMw noog== X-Forwarded-Encrypted: i=1; AJvYcCX7ZDGoHnC88jGnAWBPJSR2uwQx25UOy5USylg4IPUUz7osLtAa8fLuneiAltvcf6biVBEvCqQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzfLcT35oXYj2XwUaz1SFUhnAjsEnQ2OdxPMUAaEUh3sGO/Rd9n HqEV4ap7m6Pe1BNwQ4PnVVLqVk5TOPghGvzMIl7xlJF8IDT0wudk X-Gm-Gg: ASbGncsSHjLpoSXR2lhRbgFH2xKvop7Hif2Ky5oK8vNsa1p6fUonmSrbYsLI+0d5Lpu Oy/5VSCS/3JjRvgBrwM9bta+lTKkkJZX1yXgdUVJ7VPsmOoKVJ2pokdckhiO5tawiNzNLChtSHy JBm8kIaeIxSk8yun9Frq5fij6TTAi2n7MD6Nx3eQ7WuH3V1UdbldqtY374wugpZh3tiLrAdExSh di+KDOWkBxryosmfim47Cpvqt77dULWJfDpTXEZHSN7ajQxP6e+N4IVK+NYra9FPPY3/tvGLEHf qd/SziC6Qm3T2ss1OtYrlqT1luE73z6jt5js808zl88W3P0DseX1iA== X-Google-Smtp-Source: AGHT+IF9ZZK3TXsoVwWuewKkZZcnV5TTDgRhxYuLjTDzXvZXUaApMvJg7FlTWd5Penkc+fmCq1PGGw== X-Received: by 2002:a17:90a:c2c5:b0:2ef:2d9f:8e55 with SMTP id 98e67ed59e1d1-2f83abdf0fdmr44421512a91.17.1738693850389; Tue, 04 Feb 2025 10:30:50 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.30.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:30:50 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 03/12] bpf: stop unsafely accessing TCP fields in bpf callbacks Date: Wed, 5 Feb 2025 02:30:15 +0800 Message-Id: <20250204183024.87508-4-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net The "allow_tcp_access" flag is added to indicate that the callback site has a tcp_sock locked. Applying the new member allow_tcp_access in the existing callbacks where is_fullsock is set to 1 can stop UDP socket accessing struct tcp_sock and stop TCP socket without sk lock protecting does the similar thing, or else it could be catastrophe leading to panic. To keep it simple, instead of distinguishing between read and write access, users aren't allowed all read/write access to the tcp_sock through the older bpf_sock_ops ctx. The new timestamping callbacks can use newer helpers to read everything from a sk (e.g. bpf_core_cast), so nothing is lost. Signed-off-by: Jason Xing --- include/linux/filter.h | 5 +++++ include/net/tcp.h | 1 + net/core/filter.c | 8 ++++---- net/ipv4/tcp_input.c | 2 ++ net/ipv4/tcp_output.c | 2 ++ 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/include/linux/filter.h b/include/linux/filter.h index a3ea46281595..1569e9f31a8c 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -1508,6 +1508,11 @@ struct bpf_sock_ops_kern { void *skb_data_end; u8 op; u8 is_fullsock; + u8 allow_tcp_access; /* Indicate that the callback site + * has a tcp_sock locked. Then it + * would be safe to access struct + * tcp_sock. + */ u8 remaining_opt_len; u64 temp; /* temp and everything after is not * initialized to 0 before calling diff --git a/include/net/tcp.h b/include/net/tcp.h index 5b2b04835688..293047694710 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -2649,6 +2649,7 @@ static inline int tcp_call_bpf(struct sock *sk, int op, u32 nargs, u32 *args) memset(&sock_ops, 0, offsetof(struct bpf_sock_ops_kern, temp)); if (sk_fullsock(sk)) { sock_ops.is_fullsock = 1; + sock_ops.allow_tcp_access = 1; sock_owned_by_me(sk); } diff --git a/net/core/filter.c b/net/core/filter.c index 1c6c07507a78..dc0e67c5776a 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -10381,10 +10381,10 @@ static u32 sock_ops_convert_ctx_access(enum bpf_access_type type, } \ *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( \ struct bpf_sock_ops_kern, \ - is_fullsock), \ + allow_tcp_access), \ fullsock_reg, si->src_reg, \ offsetof(struct bpf_sock_ops_kern, \ - is_fullsock)); \ + allow_tcp_access)); \ *insn++ = BPF_JMP_IMM(BPF_JEQ, fullsock_reg, 0, jmp); \ if (si->dst_reg == si->src_reg) \ *insn++ = BPF_LDX_MEM(BPF_DW, reg, si->src_reg, \ @@ -10469,10 +10469,10 @@ static u32 sock_ops_convert_ctx_access(enum bpf_access_type type, temp)); \ *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( \ struct bpf_sock_ops_kern, \ - is_fullsock), \ + allow_tcp_access), \ reg, si->dst_reg, \ offsetof(struct bpf_sock_ops_kern, \ - is_fullsock)); \ + allow_tcp_access)); \ *insn++ = BPF_JMP_IMM(BPF_JEQ, reg, 0, 2); \ *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF( \ struct bpf_sock_ops_kern, sk),\ diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index eb82e01da911..77185479ed5e 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -169,6 +169,7 @@ static void bpf_skops_parse_hdr(struct sock *sk, struct sk_buff *skb) memset(&sock_ops, 0, offsetof(struct bpf_sock_ops_kern, temp)); sock_ops.op = BPF_SOCK_OPS_PARSE_HDR_OPT_CB; sock_ops.is_fullsock = 1; + sock_ops.allow_tcp_access = 1; sock_ops.sk = sk; bpf_skops_init_skb(&sock_ops, skb, tcp_hdrlen(skb)); @@ -185,6 +186,7 @@ static void bpf_skops_established(struct sock *sk, int bpf_op, memset(&sock_ops, 0, offsetof(struct bpf_sock_ops_kern, temp)); sock_ops.op = bpf_op; sock_ops.is_fullsock = 1; + sock_ops.allow_tcp_access = 1; sock_ops.sk = sk; /* sk with TCP_REPAIR_ON does not have skb in tcp_finish_connect */ if (skb) diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 0e5b9a654254..695749807c09 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -522,6 +522,7 @@ static void bpf_skops_hdr_opt_len(struct sock *sk, struct sk_buff *skb, sock_owned_by_me(sk); sock_ops.is_fullsock = 1; + sock_ops.allow_tcp_access = 1; sock_ops.sk = sk; } @@ -567,6 +568,7 @@ static void bpf_skops_write_hdr_opt(struct sock *sk, struct sk_buff *skb, sock_owned_by_me(sk); sock_ops.is_fullsock = 1; + sock_ops.allow_tcp_access = 1; sock_ops.sk = sk; } From patchwork Tue Feb 4 18:30:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959560 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (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 C7E1D213E81; Tue, 4 Feb 2025 18:30:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693858; cv=none; b=PtoB3N4Nn8WfWFjVLo8xWdXpA4IFbeD9w13FXv3lgUQAOuWS/bzAIqlkwzB8fFqwAmyaqj8h+vUiVtfrjnECoJIdcqoRXtE+kRhhCKMULU3/r5OAUwa/LLVfDM+u4QP7s303QiqLAV9DZQdqfEdb/MApvY21Q8pJOieP4Df3gGk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693858; c=relaxed/simple; bh=oWTFfmKtbyAyYXnxvSxqnwP/ldGMDUrwHrs6elTSBzQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FEhrWjO8QJ151lIqg71I0IO42wEgRyTs0mYKAVeQ8jzug+aBm13pu3QbdsTxU+fEyAh+naO4viasFxt9gm8JchTGgDuoBtpUUmECLwNkQeVF/gVPt9JzGKqsYa+3TuP65HQIfDsosi2WCcfLzJKTm84gy1veXZf84q5mk5SRcSQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XQXTbaCs; arc=none smtp.client-ip=209.85.216.51 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) header.d=gmail.com header.i=@gmail.com header.b="XQXTbaCs" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-2f9bed1f521so1778786a91.3; Tue, 04 Feb 2025 10:30:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693856; x=1739298656; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uGxPdzXVoeHm3LgeydHUwfPaVQIbeImRWqiQNcBnypA=; b=XQXTbaCsWnAmayjnmsFn9Q28ArDlgVQNwTK9a387STBji9VnwIy2o+wL50Z11yFYTo BlgVrckA4atH/qFK5m/SmPYJ3TOhrRKZiJuwdl8y4r2iaWt3AnDa74hHiV75u3yGMGXV EC0h+3E6LO9BGiD38ERVYqLkgYVfJ0oAHvDkj7Th1gBpwMyoQ4ZutlYHhqFbs08PhBWF slrnQBMdAmA8lEyL7bUxjePBHdAqNJOW54OMjy1K5BHBSSybRToRzaJzg0eH3fXZZXj8 +WVT2VaVmwTMMoPdUjFHEts7f0IsbqZovn1RpbDh1+MSANmcfHTX34fHIyy1P2rirlOw L96A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693856; x=1739298656; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uGxPdzXVoeHm3LgeydHUwfPaVQIbeImRWqiQNcBnypA=; b=gS1U3GPheJBYyAeqOzg6rg6HU3rVvcT4kmsyRot9p5wib57cMITmR6+ib+fvNsDjup XRkX8lppEbc7z5B2a0tlfO9PVhdInCXEui8tXxIxBFtPy1RiXo5a+Fw/7yCH922L0Zzl Y6QZ7Tjc0F/hVzLOx9qcoc/+9OhnFi296sV6qrw/LMhrEVsnbh0YWmUq1/zZN4/N/g97 67yb2kSPSHvc2uaEZL3TO+2RVtNdra2E2f9sPimt3pEwy/IEIwtYs4uMmnRgOzCMBkgJ AH4s9D0x1exNhLUa2XObnRiX44I/thwMKXxJx18Fec6kKOyK+uZRk1VPHoP6ks6wyR63 CEgA== X-Forwarded-Encrypted: i=1; AJvYcCXh0m8oyGjys1c/0Znm3NJeg0dJgJE7AmH/9vKPzKfg7N3mXxdoXdbLGQLJUP49JESWSSyoklo=@vger.kernel.org X-Gm-Message-State: AOJu0YwaUSsNMh/LJogMUO/4RXAfs8N+iIO8L5reTNpjVWa9rdTqAZs8 xyDxBklM4fFnsFXvZxIh3XqgbEftjDPeYkiuODEKpLNUGI5i0fdi X-Gm-Gg: ASbGncsfM+vVrZDCJ98Ghma05Pgoj/3kj5zzuvyu691NvkxiqM1lgeRwLXAn6020l4g TgFmJaVM0dcUIqXZOPnlopg+zwsj3uDgQYnIyOBhg2fRQrWoQG6qdljBr0Mt5wZYKv4awlhbuCy ZtKjoWewPga3R/UK+m1cKBMqtbKgXCA2Evjz0ef0NSwSkGfwnAb4F6bFh9L8oOrdOTjSLkWIfSG QPphj4+oCS4hk7DcWib8HeBgfuTYbTu8a917PESvzlXPYjDLXxqWuSgUt6rByvqzEDx8fDHCccQ xJZLT+llw77OIwy5vMwgT26o8AFCoCjEq/AMe/Sk1aOB45iatfp/mA== X-Google-Smtp-Source: AGHT+IEWZIW6WSrci5N8ZIyiMhnOtrUAg2Ey94ERajOIN5mvRU9aE6Ys5gqDlPqUhFNyBTtD9vsjBw== X-Received: by 2002:a17:90b:5445:b0:2ee:aa28:79aa with SMTP id 98e67ed59e1d1-2f83abc3161mr36795852a91.6.1738693856041; Tue, 04 Feb 2025 10:30:56 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.30.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:30:55 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 04/12] bpf: stop calling some sock_op BPF CALLs in new timestamping callbacks Date: Wed, 5 Feb 2025 02:30:16 +0800 Message-Id: <20250204183024.87508-5-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Simply disallow calling bpf_sock_ops_setsockopt/getsockopt, bpf_sock_ops_cb_flags_set, and the bpf_sock_ops_load_hdr_opt for the new timestamping callbacks for the safety consideration. Besides, In the next round, the UDP proto for SO_TIMESTAMPING bpf extension will be supported, so there should be no safety problem, which is usually caused by UDP socket trying to access TCP fields. Signed-off-by: Jason Xing --- net/core/filter.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/net/core/filter.c b/net/core/filter.c index dc0e67c5776a..d3395ffe058e 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5523,6 +5523,11 @@ static int __bpf_setsockopt(struct sock *sk, int level, int optname, return -EINVAL; } +static bool is_locked_tcp_sock_ops(struct bpf_sock_ops_kern *bpf_sock) +{ + return bpf_sock->op <= BPF_SOCK_OPS_WRITE_HDR_OPT_CB; +} + static int _bpf_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen) { @@ -5673,6 +5678,9 @@ static const struct bpf_func_proto bpf_sock_addr_getsockopt_proto = { BPF_CALL_5(bpf_sock_ops_setsockopt, struct bpf_sock_ops_kern *, bpf_sock, int, level, int, optname, char *, optval, int, optlen) { + if (!is_locked_tcp_sock_ops(bpf_sock)) + return -EOPNOTSUPP; + return _bpf_setsockopt(bpf_sock->sk, level, optname, optval, optlen); } @@ -5758,6 +5766,9 @@ static int bpf_sock_ops_get_syn(struct bpf_sock_ops_kern *bpf_sock, BPF_CALL_5(bpf_sock_ops_getsockopt, struct bpf_sock_ops_kern *, bpf_sock, int, level, int, optname, char *, optval, int, optlen) { + if (!is_locked_tcp_sock_ops(bpf_sock)) + return -EOPNOTSUPP; + if (IS_ENABLED(CONFIG_INET) && level == SOL_TCP && optname >= TCP_BPF_SYN && optname <= TCP_BPF_SYN_MAC) { int ret, copy_len = 0; @@ -5800,6 +5811,9 @@ BPF_CALL_2(bpf_sock_ops_cb_flags_set, struct bpf_sock_ops_kern *, bpf_sock, struct sock *sk = bpf_sock->sk; int val = argval & BPF_SOCK_OPS_ALL_CB_FLAGS; + if (!is_locked_tcp_sock_ops(bpf_sock)) + return -EOPNOTSUPP; + if (!IS_ENABLED(CONFIG_INET) || !sk_fullsock(sk)) return -EINVAL; @@ -7609,6 +7623,9 @@ BPF_CALL_4(bpf_sock_ops_load_hdr_opt, struct bpf_sock_ops_kern *, bpf_sock, u8 search_kind, search_len, copy_len, magic_len; int ret; + if (!is_locked_tcp_sock_ops(bpf_sock)) + return -EOPNOTSUPP; + /* 2 byte is the minimal option len except TCPOPT_NOP and * TCPOPT_EOL which are useless for the bpf prog to learn * and this helper disallow loading them also. From patchwork Tue Feb 4 18:30:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959561 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (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 A922C217711; Tue, 4 Feb 2025 18:31:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693864; cv=none; b=fvIWFseY0htQp72gHeM3YzIfc97BY+hkBeMc7CiZJXpsGwia8Rktpk44X5ekz8EFwHG/pN9d4H+ahMiJomFbgol1xEmdD2IrF83U491/R6yPUUN+c7dSdUh+huUYSfOVMXOi3PXg6GRW+qOOkDyisNWpqFEn1bbzEsTf3/17r0w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693864; c=relaxed/simple; bh=P29bkQwH7Ds8XAKNvbY1nEQ3uSSHQzdQ2g/mJx+hWCU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ss+5PYvNl1jrY1nPcJ9rnRGR7EqSSJJK+KLwx7v7hY1PcWDKVTFeqh1BnsJDZ64PX5W6stdBHZrJFI9PFLQrbLyNOqplZ/YbFWhlWuUxL+/o+0vnCKpWWRYlO/TUCZ/1BCXIaNGFSnyhui1cfa62xn8jptkZSoDa2R1NaXQL7Fw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Us65EOlz; arc=none smtp.client-ip=209.85.216.54 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) header.d=gmail.com header.i=@gmail.com header.b="Us65EOlz" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-2f9da2a7004so404550a91.0; Tue, 04 Feb 2025 10:31:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693862; x=1739298662; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ztGS39EtdCrUg2P/R2l3ObPMe+jhMRGbji2Nk4/+AMI=; b=Us65EOlzJb1qUGn9RHX3w7cYimUJykI2v2sxkx2Zq6Ep5npP40CSqzwL2A+cw+XmFF tHbM+z5hh8H8IE6GMysKTRtpZIUBcKeLTb7UtCpTy6H/qZL1Pcc50aPl6pDY4E5BXsab P0z0azKdQIGDcaH/W9w0t+zcrCKU3K2lrFzG2MVPB9VC1ZJO0RJZBVZUo00WlgMl+SaQ DCbTdDbmlhBl7QtJgCPOOLqCCMofZRmY2ey58TR5cvp7yGOn3uU/W/dQ2hciWwYJX0VP C1kGKVIE/V7MkOWBDdoKVGG5YTWV3NrC9gPPkTgQ0jFhbYhAvygWnTUNrBQaODjMeAeO 36hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693862; x=1739298662; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ztGS39EtdCrUg2P/R2l3ObPMe+jhMRGbji2Nk4/+AMI=; b=jovcqdK7LEfwvzs/lc4+uWWqp6WFLQJ4RhrinTNjejSXHGh/ilWt910PCIH/sDEk4P n9asrCTnGvj0bOv2nM6OzhHkNoHYOb2nC2iagR0K/K+c43QLzJLTwXyT+Iukm9vN+KdV kMbW9Ng0bGs7xNX6izbxZAmkXhMnb8Ul0sWn5V4rFwF0p1f+VGqiskO/UmzWS3dvFd8m yvu21UU4kMpC5CvnJJ7RfYAh6iVEZoeve79HQjnalD5xqJhQQXaczXIGAua62dKaOKaC QcDLoRe/zRBpumDqAcW6wDGBSKngwf9Ud8FZ4P1DQCeIIBKZzBnK7D2xRbegrlPqxUoN +ncg== X-Forwarded-Encrypted: i=1; AJvYcCVpYol0CLFslQWCNnj07BlqEJkhCONiKcVrDvmotqYq7XxIm5es1nfkHQ61igYCNhDkDR0t8hg=@vger.kernel.org X-Gm-Message-State: AOJu0YyNCMr1No4cNJdKuGjxbXTSKeU2zE7HIl8YtGY/JFiMmgnsHBJA a31+y64QGf9cU156G1LEhab+U77NDUtpknBRr2WwjOGkJuUD/Vv9 X-Gm-Gg: ASbGnctFt6dR5GtiNm+6DFYyJveiqcLE7kHwag4iGXrEbTZK0KJjJhXuekQ/cri99ac 45aqVwhIF6tRce5H1jmXS2GkRrxJLD6x98bXmMMnHkS29YwX2W1FqBJVg1SzSLe9KRaLWxb3stZ JvXgr5nFqJgKoqt3t7d3ptNG4VicGcn3IL5Ht63whTeStBUq3u+F4QJZ8joku85s5lTQSBQetWH wnwPOg8kxaFGUAJxgdRSWOyWCEbLauVkXjbIdMeBxTNi5oG2/B/RDktSwV5oJuJvjLeFcsPe6/8 SyskacaLSIj73hI7eNp5doz0m/bDsStig5JqlGBLnjgNWRsFnlbcBw== X-Google-Smtp-Source: AGHT+IEakh3pXT3SabKHMgY+mnV6UfM0/q/YQk9KFpwiLJtsJPy1iBGQUFRTgTsbcO/KGSOA4MBQUA== X-Received: by 2002:a17:90b:1f8c:b0:2ee:94d1:7a89 with SMTP id 98e67ed59e1d1-2f83ab8c371mr36914003a91.1.1738693861691; Tue, 04 Feb 2025 10:31:01 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.30.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:31:01 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 05/12] net-timestamp: prepare for isolating two modes of SO_TIMESTAMPING Date: Wed, 5 Feb 2025 02:30:17 +0800 Message-Id: <20250204183024.87508-6-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net No functional changes here, only add skb_enable_app_tstamp() to test if the orig_skb matches the usage of application SO_TIMESTAMPING or its bpf extension. And it's good to support two modes in parallel later in this series. Also, this patch deliberately distinguish the software and hardware SCM_TSTAMP_SND timestamp by passing 'sw' parameter in order to avoid such a case where hardware may go wrong and pass a NULL hwstamps, which is even though unlikely to happen. If it really happens, bpf prog will finally consider it as a software timestamp. It will be hardly recognized. Let's make the timestamping part more robust. Signed-off-by: Jason Xing --- include/linux/skbuff.h | 13 +++++++------ net/core/dev.c | 2 +- net/core/skbuff.c | 32 ++++++++++++++++++++++++++++++-- net/ipv4/tcp_input.c | 3 ++- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index bb2b751d274a..dfc419281cc9 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -39,6 +39,7 @@ #include #include #include +#include /** * DOC: skb checksums @@ -4533,18 +4534,18 @@ void skb_complete_tx_timestamp(struct sk_buff *skb, void __skb_tstamp_tx(struct sk_buff *orig_skb, const struct sk_buff *ack_skb, struct skb_shared_hwtstamps *hwtstamps, - struct sock *sk, int tstype); + struct sock *sk, bool sw, int tstype); /** - * skb_tstamp_tx - queue clone of skb with send time stamps + * skb_tstamp_tx - queue clone of skb with send HARDWARE timestamps * @orig_skb: the original outgoing packet * @hwtstamps: hardware time stamps, may be NULL if not available * * If the skb has a socket associated, then this function clones the * skb (thus sharing the actual data and optional structures), stores - * the optional hardware time stamping information (if non NULL) or - * generates a software time stamp (otherwise), then queues the clone - * to the error queue of the socket. Errors are silently ignored. + * the optional hardware time stamping information (if non NULL) then + * queues the clone to the error queue of the socket. Errors are + * silently ignored. */ void skb_tstamp_tx(struct sk_buff *orig_skb, struct skb_shared_hwtstamps *hwtstamps); @@ -4565,7 +4566,7 @@ static inline void skb_tx_timestamp(struct sk_buff *skb) { skb_clone_tx_timestamp(skb); if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP) - skb_tstamp_tx(skb, NULL); + __skb_tstamp_tx(skb, NULL, NULL, skb->sk, true, SCM_TSTAMP_SND); } /** diff --git a/net/core/dev.c b/net/core/dev.c index afa2282f2604..d77b8389753e 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4501,7 +4501,7 @@ int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) skb_assert_len(skb); if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP)) - __skb_tstamp_tx(skb, NULL, NULL, skb->sk, SCM_TSTAMP_SCHED); + __skb_tstamp_tx(skb, NULL, NULL, skb->sk, true, SCM_TSTAMP_SCHED); /* Disable soft irqs for various locks below. Also * stops preemption for RCU. diff --git a/net/core/skbuff.c b/net/core/skbuff.c index a441613a1e6c..6042961dfc02 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5539,10 +5539,35 @@ void skb_complete_tx_timestamp(struct sk_buff *skb, } EXPORT_SYMBOL_GPL(skb_complete_tx_timestamp); +static bool skb_enable_app_tstamp(struct sk_buff *skb, int tstype, bool sw) +{ + int flag; + + switch (tstype) { + case SCM_TSTAMP_SCHED: + flag = SKBTX_SCHED_TSTAMP; + break; + case SCM_TSTAMP_SND: + flag = sw ? SKBTX_SW_TSTAMP : SKBTX_HW_TSTAMP; + break; + case SCM_TSTAMP_ACK: + if (TCP_SKB_CB(skb)->txstamp_ack) + return true; + fallthrough; + default: + return false; + } + + if (skb_shinfo(skb)->tx_flags & flag) + return true; + + return false; +} + void __skb_tstamp_tx(struct sk_buff *orig_skb, const struct sk_buff *ack_skb, struct skb_shared_hwtstamps *hwtstamps, - struct sock *sk, int tstype) + struct sock *sk, bool sw, int tstype) { struct sk_buff *skb; bool tsonly, opt_stats = false; @@ -5551,6 +5576,9 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, if (!sk) return; + if (!skb_enable_app_tstamp(orig_skb, tstype, sw)) + return; + tsflags = READ_ONCE(sk->sk_tsflags); if (!hwtstamps && !(tsflags & SOF_TIMESTAMPING_OPT_TX_SWHW) && skb_shinfo(orig_skb)->tx_flags & SKBTX_IN_PROGRESS) @@ -5599,7 +5627,7 @@ EXPORT_SYMBOL_GPL(__skb_tstamp_tx); void skb_tstamp_tx(struct sk_buff *orig_skb, struct skb_shared_hwtstamps *hwtstamps) { - return __skb_tstamp_tx(orig_skb, NULL, hwtstamps, orig_skb->sk, + return __skb_tstamp_tx(orig_skb, NULL, hwtstamps, orig_skb->sk, false, SCM_TSTAMP_SND); } EXPORT_SYMBOL_GPL(skb_tstamp_tx); diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 77185479ed5e..62252702929d 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -3330,7 +3330,8 @@ static void tcp_ack_tstamp(struct sock *sk, struct sk_buff *skb, if (!before(shinfo->tskey, prior_snd_una) && before(shinfo->tskey, tcp_sk(sk)->snd_una)) { tcp_skb_tsorted_save(skb) { - __skb_tstamp_tx(skb, ack_skb, NULL, sk, SCM_TSTAMP_ACK); + __skb_tstamp_tx(skb, ack_skb, NULL, sk, true, + SCM_TSTAMP_ACK); } tcp_skb_tsorted_restore(skb); } } From patchwork Tue Feb 4 18:30:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959562 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (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 5DDCC217711; Tue, 4 Feb 2025 18:31:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693869; cv=none; b=LRDYEztVyKEGpYrqd67S0zmNDveAVauCencu1IeFgfwbuDBagKEeLDiCY/5cMQTabd9LsqS8VEnUUBOz6U+LrY9WEBuxoVfuqCjbMoK87vEcj+M5gVJ3uNl/+DVsIj6NEFRX8x3bEfbWxVvr4afHkpBemML1M+qouBep/xeAjwQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693869; c=relaxed/simple; bh=VwbxkawwbD09JBYUCW67r+SjOufGMep9Bg2p+zSdrH4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ug6PoiY0Wh3fLdBY46FEk1cjkU/Y7JlJlb3f+5ofX7qEFrFQpVcv/m9fN69NmmHGnghftep4rTSYMJzw3BOBO+eXtzGGM7tpE+hG89uE+s+xRL0or3La823TMcqO3i3Rke6oFv3kAiQWViqU1bSNfOne1tvBluAt2EqBqFXSHDE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=erocsO/g; arc=none smtp.client-ip=209.85.216.46 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) header.d=gmail.com header.i=@gmail.com header.b="erocsO/g" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-2f9cb23d22cso1219944a91.1; Tue, 04 Feb 2025 10:31:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693867; x=1739298667; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nJGrKh1xB34s2kAvvKTGY5CjF5n7ybSUoLqRXmIkuF0=; b=erocsO/ggOisiINKWok2Dj3vSmN5R07SvKeSnrBwxjMn/F3kHL/kcNMNrhHOsbyr9h qTCOQ1mDYRiNA0NEXYe+jAjzXCC6Sh4knaK7LOQpTgnhjPOV0tOXfB94RE1oTsb2XiRm hZT7TadQke2Z382c+/Cjzr4VDn2Vzybn8uqgOYIZaBweZrO6GGSfJJziPuLuiYoOCqx4 AjbxJC9hwnlj+vZfp/z/mZRtpDCPhaFKxi5t1RDKsmLsmq97RcUD7FvuhjgwkSrpyhZQ DyxlYzlBhoQDeZIu2Kou8TSARtr8/kpdNbA8fZF4RCfNBImtLWlyoGZR9OP4sWmJHn2T FlCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693867; x=1739298667; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nJGrKh1xB34s2kAvvKTGY5CjF5n7ybSUoLqRXmIkuF0=; b=Ya7atdkga09gpdl9+3Vuqudco4aHd5hvgjRhq026+07+pZTRHKjP7+ZhkclzyEFSji PJo8uTu7U6OnwyRR0Bplqbv9w2HMPdNznxAHQahw75iObmozk0n0ae/yBZ3Gy6d+i8wW hZKFicY5xGkd1D1vhqkx9laYjhgPSvzOMwtfSxaEqSd9Nct7hL4oMqhI5wvX/TUNh8/+ 9AFBed4bGuE+Fx/Lc82pTC5Di16k6tRMxsTk5ziCr4YaIUnyDxKrajk3dAibtDQi3hXz /oA1yb2YS3iDiuGlDj5hHY5EpYLl86ulQWR47MtxTMF3Axph9XJvXF9+51R7mmteT7we p1Kg== X-Forwarded-Encrypted: i=1; AJvYcCV+5i5PkRPr9RlrTBhsrED8x0PWhjKds2SZ5GtMNn/mMdqpx0c6AFkuTcpQK73oybKQxaNNxOc=@vger.kernel.org X-Gm-Message-State: AOJu0YywIE+qGJnwb8AEN/Aoky/jMMNOcamXReuybbK9gFk1nrNk8hE2 ADl60JFg4bcXcfhDkea3sPpoB2SHnY2ff5P8OeqfcPKUJQWKtQhF8DhAWEvJLBA= X-Gm-Gg: ASbGncvpJynLEKrAIt8SxLTY0bS0qk/y/aG4s4wJ9BPQZkW5w8bc2CfJKVgnLb/MQcN GWZK4VOap4RPp2sKvD3Ub8Xg2DU2un+FRyST03PPLmHINKqdbvsQmwDuB/sTLjnl/FidVMrE0Ik fB6TAXeYJ1TxeB/cSj1kq2VRIz4q9UBGqWyLJUN7d4iS51ptHyqEd9Kk4LCN54/oRf+b4iXkOYH 9NSU/Ld58XxEWDOEuZOZzPgSrwwo2L4CnbG8B04hiZ8n3cagb2jfzeWjF68i5mR/0DsQbjOTOTw bbuE9v+Au/CEuyBpx9OP+uQvZN0dvkmzBuTz4mLKn5uM3rRlV31w8g== X-Google-Smtp-Source: AGHT+IGdXsKPBGM9XGi3wrUeqBT+yDGGgDGtvbFKYuIN+Ts61ItYtfzP4CMaDZByfVIi9UsD/FpuoA== X-Received: by 2002:a17:90b:4d06:b0:2ee:ab29:1a57 with SMTP id 98e67ed59e1d1-2f83abb3553mr41520614a91.2.1738693867353; Tue, 04 Feb 2025 10:31:07 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.31.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:31:07 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 06/12] bpf: support SCM_TSTAMP_SCHED of SO_TIMESTAMPING Date: Wed, 5 Feb 2025 02:30:18 +0800 Message-Id: <20250204183024.87508-7-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Introducing SKBTX_BPF is used as an indicator telling us whether the skb should be traced by the bpf prog. Signed-off-by: Jason Xing --- include/linux/skbuff.h | 6 +++++- include/uapi/linux/bpf.h | 4 ++++ net/core/dev.c | 3 ++- net/core/skbuff.c | 20 ++++++++++++++++++++ tools/include/uapi/linux/bpf.h | 4 ++++ 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index dfc419281cc9..35c2e864dd4b 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -490,10 +490,14 @@ enum { /* generate software time stamp when entering packet scheduling */ SKBTX_SCHED_TSTAMP = 1 << 6, + + /* used for bpf extension when a bpf program is loaded */ + SKBTX_BPF = 1 << 7, }; #define SKBTX_ANY_SW_TSTAMP (SKBTX_SW_TSTAMP | \ - SKBTX_SCHED_TSTAMP) + SKBTX_SCHED_TSTAMP | \ + SKBTX_BPF) #define SKBTX_ANY_TSTAMP (SKBTX_HW_TSTAMP | \ SKBTX_HW_TSTAMP_USE_CYCLES | \ SKBTX_ANY_SW_TSTAMP) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 6116eb3d1515..30d2c078966b 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -7032,6 +7032,10 @@ enum { * by the kernel or the * earlier bpf-progs. */ + BPF_SOCK_OPS_TS_SCHED_OPT_CB, /* Called when skb is passing through + * dev layer when SK_BPF_CB_TX_TIMESTAMPING + * feature is on. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect diff --git a/net/core/dev.c b/net/core/dev.c index d77b8389753e..4f291459d6b1 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4500,7 +4500,8 @@ int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) skb_reset_mac_header(skb); skb_assert_len(skb); - if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP)) + if (unlikely(skb_shinfo(skb)->tx_flags & + (SKBTX_SCHED_TSTAMP | SKBTX_BPF))) __skb_tstamp_tx(skb, NULL, NULL, skb->sk, true, SCM_TSTAMP_SCHED); /* Disable soft irqs for various locks below. Also diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 6042961dfc02..b7261e886529 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5564,6 +5564,21 @@ static bool skb_enable_app_tstamp(struct sk_buff *skb, int tstype, bool sw) return false; } +static void skb_tstamp_tx_bpf(struct sk_buff *skb, struct sock *sk, int tstype) +{ + int op; + + switch (tstype) { + case SCM_TSTAMP_SCHED: + op = BPF_SOCK_OPS_TS_SCHED_OPT_CB; + break; + default: + return; + } + + bpf_skops_tx_timestamping(sk, skb, op); +} + void __skb_tstamp_tx(struct sk_buff *orig_skb, const struct sk_buff *ack_skb, struct skb_shared_hwtstamps *hwtstamps, @@ -5576,6 +5591,11 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, if (!sk) return; + /* bpf extension feature entry */ + if (skb_shinfo(orig_skb)->tx_flags & SKBTX_BPF) + skb_tstamp_tx_bpf(orig_skb, sk, tstype); + + /* application feature entry */ if (!skb_enable_app_tstamp(orig_skb, tstype, sw)) return; diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 70366f74ef4e..eed91b7296b7 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -7025,6 +7025,10 @@ enum { * by the kernel or the * earlier bpf-progs. */ + BPF_SOCK_OPS_TS_SCHED_OPT_CB, /* Called when skb is passing through + * dev layer when SK_BPF_CB_TX_TIMESTAMPING + * feature is on. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect From patchwork Tue Feb 4 18:30:19 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959563 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (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 215E321766A; Tue, 4 Feb 2025 18:31:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693875; cv=none; b=RlHhgwJAAc+y0ZOEdLDhMQnpmHkBxgWhFq41utscLZMXWA2tRMzHPW/KbXaR7tV4+1/lex+SYP5jpiZqVNc2EQo/4B8zr+zz4lGb8MKiGIU392oXnTmaNShMwGYw5kUpwmoJ5//K27pyeDFoOxI+Nm2NrFJmjMjrSz/iT23lx08= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693875; c=relaxed/simple; bh=2+Mx6kV1VSAikZ82dxLsxx9efaivsDaqvC2z/QxRAgA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GKhMmy3kf44TyeyfgHhl5sFqRQXbNGjqLO4hMEA4RmixSolFn1r2uJ4TtAmtVgh8ZkLxH/FGHFQc/2csosAmAbRSuaqWWPEXgwHNxp87Wl9qxmafOTD3xnV2Mk0ZjobUOBumh3SSOtKkKl5O8KWEQTZO8koM0mNyLWaSADCWFfQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=lkRqU619; arc=none smtp.client-ip=209.85.216.51 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) header.d=gmail.com header.i=@gmail.com header.b="lkRqU619" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-2f9d17ac130so963596a91.3; Tue, 04 Feb 2025 10:31:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693873; x=1739298673; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=N0Ir8DfOrpNhUdkogqzsydsefm/NSMJd0tTbrurxr8Y=; b=lkRqU619VtHK6vOrkSMTxJYVYkRN3OozjieDJ4jeKnPSUkVbTfkhplXdVsftyBGVeO CYS0JvrNfsc8jNWefV/+692x7tRv0FmXPb+NvJ3FH0NMqe3PXrgvVkCY3I3aRawpCgxX Nzufo08vE/vhWnK3ktgIAyPnIPFqFbFJ1qKWwRXU6Hf5NvWIE1wXYYn7JeQLMGYLaUvO +jCV9ay3M0zfvL6sFJt5ro20MHpthPecd26qPMKjyZu3nubE3s58Mt9UCGsBlzKFv/xi 7DNAX2QPnIvxg1SK9PDz/zWiiB1H8u6Dt09JIDVrRMZU41JaouKstpqwyTbLN6kCK+8o VuHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693873; x=1739298673; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=N0Ir8DfOrpNhUdkogqzsydsefm/NSMJd0tTbrurxr8Y=; b=u9iiWVxJWQDGSUl8AMZEvWuXsw0i1Sx/enV2fD2zf9ZiGJJptf59qj0hTZ8f7lRV3S 6vtBXcRr+4JqNfit4JfXcmamzvBKpt9RepWLuSV3n+KyGatIUEuah7gEujiE6mzji0TA tAdg5wHc/W34fQpkKQWrSuRKdZxma1uyIZY/Mbr/Z8xxKaSFhLrr+vybMmech1Ko9OJr H5rylyWy439drcd87FLYqVoQW782UkyFUhxV7je5KufgTtvRxDUagkn1P7+85K2PW00t 1evE9XBLkvynzkM9Ay6DOuU/8uX92kN0DAcZEtcohzUOUAIn8p9AoJifzytCXQBbssid KZlA== X-Forwarded-Encrypted: i=1; AJvYcCVh5NNBrFK3+QLglkIwl6khFFFLw4CYf8Df+bLMr0IBni6GbpALkUnerfCcXgU+/O95aSAa4Dk=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/LjYlfuI+QMalPMjjoIXSVNqANlceB2XkR40UqqXqNzuCjant aoQTeHwiX9y+GvAmQ0Nd7E5zGmWtrQgiMk48cqzITqZRjVDeiyx7 X-Gm-Gg: ASbGnctHoslV2WiG5q7j+2h7lgXoqCU9aEjUDtORNS7108PY8V6JLniL9AuqCq2iSU8 9xPPcDQfBYy5IjwDFE1hTkGv/GLopdwGN6dqTXsH86+0J+kz81O84ukqPeqyLBuFFr2DCs1D+px p6lTlvqJM+v/Q2x003Sl5AmIZTDJvfgdXVuQQHabchb7S715NM+WBOQ9OaVx5MRG/+Lr32PMA+W /rhFTLz//Dcn2SiojMUH5SqpC1HIGdbgQ5mYw+Usb3726568oaGNuDUxy/QG9uh9tKBT+aCnUx3 4iEJQ65BybqtsbknxPYCASyP7f/yjCmRtKGgcfPRl4GhJsHoqXYJcw== X-Google-Smtp-Source: AGHT+IFRS6/UXgcip4QgTIQRGbwOPZtRW4N0lj99BNDhssScbe1M6N3IUVLf/LTLyLWTIrye25iWvA== X-Received: by 2002:a17:90a:fc44:b0:2ee:b2fe:eeee with SMTP id 98e67ed59e1d1-2f83abfa2f3mr41228826a91.15.1738693872963; Tue, 04 Feb 2025 10:31:12 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.31.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:31:12 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 07/12] bpf: support sw SCM_TSTAMP_SND of SO_TIMESTAMPING Date: Wed, 5 Feb 2025 02:30:19 +0800 Message-Id: <20250204183024.87508-8-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Support sw SCM_TSTAMP_SND case. Then users will get the software timestamp when the driver is about to send the skb. Later, the hardware timestamp will be supported. Signed-off-by: Jason Xing --- include/linux/skbuff.h | 2 +- include/uapi/linux/bpf.h | 4 ++++ net/core/skbuff.c | 10 ++++++++-- tools/include/uapi/linux/bpf.h | 4 ++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 35c2e864dd4b..de8d3bd311f5 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -4569,7 +4569,7 @@ void skb_tstamp_tx(struct sk_buff *orig_skb, static inline void skb_tx_timestamp(struct sk_buff *skb) { skb_clone_tx_timestamp(skb); - if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP) + if (skb_shinfo(skb)->tx_flags & (SKBTX_SW_TSTAMP | SKBTX_BPF)) __skb_tstamp_tx(skb, NULL, NULL, skb->sk, true, SCM_TSTAMP_SND); } diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 30d2c078966b..6a1083bcf779 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -7036,6 +7036,10 @@ enum { * dev layer when SK_BPF_CB_TX_TIMESTAMPING * feature is on. */ + BPF_SOCK_OPS_TS_SW_OPT_CB, /* Called when skb is about to send + * to the nic when SK_BPF_CB_TX_TIMESTAMPING + * feature is on. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect diff --git a/net/core/skbuff.c b/net/core/skbuff.c index b7261e886529..b22d079e7143 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5564,7 +5564,8 @@ static bool skb_enable_app_tstamp(struct sk_buff *skb, int tstype, bool sw) return false; } -static void skb_tstamp_tx_bpf(struct sk_buff *skb, struct sock *sk, int tstype) +static void skb_tstamp_tx_bpf(struct sk_buff *skb, struct sock *sk, + int tstype, bool sw) { int op; @@ -5572,6 +5573,11 @@ static void skb_tstamp_tx_bpf(struct sk_buff *skb, struct sock *sk, int tstype) case SCM_TSTAMP_SCHED: op = BPF_SOCK_OPS_TS_SCHED_OPT_CB; break; + case SCM_TSTAMP_SND: + if (!sw) + return; + op = BPF_SOCK_OPS_TS_SW_OPT_CB; + break; default: return; } @@ -5593,7 +5599,7 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, /* bpf extension feature entry */ if (skb_shinfo(orig_skb)->tx_flags & SKBTX_BPF) - skb_tstamp_tx_bpf(orig_skb, sk, tstype); + skb_tstamp_tx_bpf(orig_skb, sk, tstype, sw); /* application feature entry */ if (!skb_enable_app_tstamp(orig_skb, tstype, sw)) diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index eed91b7296b7..9bd1c7c77b17 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -7029,6 +7029,10 @@ enum { * dev layer when SK_BPF_CB_TX_TIMESTAMPING * feature is on. */ + BPF_SOCK_OPS_TS_SW_OPT_CB, /* Called when skb is about to send + * to the nic when SK_BPF_CB_TX_TIMESTAMPING + * feature is on. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect From patchwork Tue Feb 4 18:30:20 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959564 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (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 8002121773E; Tue, 4 Feb 2025 18:31:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693881; cv=none; b=OIMZh6ZNbFjcusAEE4zpG4zSu0bq7OFbBjfeDJ22043M6klliZOlr13TTqmY24948/gZzSdG0WJME/1GUgc3E540gn2wvCQjdCj4WetoK0H28rzVCyV1je0Ip/GJGNYb6X2WEWhR4kBeCnuotzuTGmJ8aztLacke8kvvQ5Do4h8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693881; c=relaxed/simple; bh=oM7XkVVat4qAlEjVYfEOrLYrMTv3B0NycZ9+FtJuHSY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tikCNCXqBhtugv69qQRdq0ZjTqG7Br7Fna+Fu/vkosljWuLOSk5pnBL/HHOuuFraN+9/VKKQ8T2NEoOYIa8ZXsyeOnx4Zku9VPl6LcbPuiQ1DF/0sozSMPpkyPVtu9C+Ay4XXfBJ1BrAVIWC797gANLjXBIl5fx84qDGAaZibhw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=F56kZcCz; arc=none smtp.client-ip=209.85.214.178 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) header.d=gmail.com header.i=@gmail.com header.b="F56kZcCz" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-21634338cfdso47563635ad.2; Tue, 04 Feb 2025 10:31:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693879; x=1739298679; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wYg/nh4POHwrnpFnyvVBhE9O9tOUTJqQ4AkISCdkSOU=; b=F56kZcCztHSTWna2GptD7jGaeiJUfNAQ94LBXof+G9ZGTsN/kFaohCO/5+9NNk03a4 3F7NW7SATkQNcMaJqm5uX1aid/Tbrmr/hjmhhx1FLQ0fDbHNOYn5DQTFr+7YVl8beJq8 dy8vqeQlHb+RiVHNawcXIJPnJGZlOj61eeBu49Dkpao8HLHX0klvqwL9p/g7uDSIb57/ zUE0XfoOf5pWhDvFX9taHmFTqGfZywm0A7wOnQOOnf8CF/H4s8y12AfaTkZdtD9h9dbL dVllTznzy1V1zEgbu+52MMs/GdCOAV+CF4/0FBT5mNaA7z3H9J9bx2PaA0VuZYnmz+SJ 4WaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693879; x=1739298679; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wYg/nh4POHwrnpFnyvVBhE9O9tOUTJqQ4AkISCdkSOU=; b=GXDS7fpXAcPk/BPRzRKgqDmLCigDhvRGUFVsYixETgSQPrDocTjdtzSET/5bdj3Nv2 LAlglpG1xiKiKzX97gUwfeofM5qljeCclrZBP+pe9Kj3H3eAV1SYFACwsZQboP+jr23Z eOkvXzRz+IfKLpiXYGwKXgZtWm110IjcJU142XbGHlCK6BmKcg9yc/rSl2GgpHuoiYEU fP3s4x8k+/c/u29RxKPaA6FT2dxfm7emGMAIT/wbxIMnZK2aK82tUfDYqPy+0wf68RRa n55YFufGT9t6axXiehV6iPdodTkWzp+1VqVVYUAflRslu9lsCkCka65Si9c5RdjKANAm ahDQ== X-Forwarded-Encrypted: i=1; AJvYcCWdUyOSr8y4EaFwq8HWjn9uYRK79kCtlXBV9NnM2clhn+P6N2xTZaDG9EANz7ZGpJrtid7mlT0=@vger.kernel.org X-Gm-Message-State: AOJu0YzO45R05cGtE2QlE/zcsBCOGaSSiS5SZQ4DT/Gijrjg3MyuYPEU 5aqTMjg/X69y4tNnpBlG737FBRlSCheNjY5jgLOYF6QK3/NR/iQ3 X-Gm-Gg: ASbGncuJilHU+MKPQEHdl8BWSxVLvPL2OfVDP1kIFb/QQxCpZr0RehwuA+1MJ99YLmf k9UKoeIgPh9/ACaapYs313Yoi2O2j/8/g7TTf40feiKuDkBdf0OjEkpXZ9BuGsSp0klv64UggIl 8NZqYR8l8zGdft2x2NC9Ppbygyxg4e8byQRlK5dFix0X+nJdJw25iwZPVbIdaDiehHkfEHnGdb2 iZlqUSezFzlrV8SaauNSd5yQasdlqlbl9DLMVEup7TTs9IV0K9Dkb2ehi6S79HMz0Jp7H+Fcd8B dcScR6TjvLMt1B/Cpw8DlBrlM6PFH8QxZZpHT14XbaO0LxNbtFiNVw== X-Google-Smtp-Source: AGHT+IH427CxnNWIfprunXdRhbzc9MuohuuMP9sV1n817QtpDc8LvRnciRay3+VliUHMHWCrlU9RAA== X-Received: by 2002:a17:903:298f:b0:21f:1549:a55a with SMTP id d9443c01a7336-21f1549a709mr6568825ad.1.1738693878677; Tue, 04 Feb 2025 10:31:18 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.31.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:31:18 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 08/12] bpf: support hw SCM_TSTAMP_SND of SO_TIMESTAMPING Date: Wed, 5 Feb 2025 02:30:20 +0800 Message-Id: <20250204183024.87508-9-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Patch finishes the hardware part. Then bpf program can fetch the hwstamp from skb directly. To avoid changing so many callers using SKBTX_HW_TSTAMP from drivers, use this simple modification like this patch does to support printing hardware timestamp. Signed-off-by: Jason Xing --- include/linux/skbuff.h | 4 +++- include/uapi/linux/bpf.h | 7 +++++++ net/core/skbuff.c | 13 +++++++------ net/dsa/user.c | 2 +- net/socket.c | 2 +- tools/include/uapi/linux/bpf.h | 7 +++++++ 6 files changed, 26 insertions(+), 9 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index de8d3bd311f5..df2d790ae36b 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -471,7 +471,7 @@ struct skb_shared_hwtstamps { /* Definitions for tx_flags in struct skb_shared_info */ enum { /* generate hardware time stamp */ - SKBTX_HW_TSTAMP = 1 << 0, + __SKBTX_HW_TSTAMP = 1 << 0, /* generate software time stamp when queueing packet to NIC */ SKBTX_SW_TSTAMP = 1 << 1, @@ -495,6 +495,8 @@ enum { SKBTX_BPF = 1 << 7, }; +#define SKBTX_HW_TSTAMP (__SKBTX_HW_TSTAMP | SKBTX_BPF) + #define SKBTX_ANY_SW_TSTAMP (SKBTX_SW_TSTAMP | \ SKBTX_SCHED_TSTAMP | \ SKBTX_BPF) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 6a1083bcf779..4c3566f623c2 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -7040,6 +7040,13 @@ enum { * to the nic when SK_BPF_CB_TX_TIMESTAMPING * feature is on. */ + BPF_SOCK_OPS_TS_HW_OPT_CB, /* Called in hardware phase when + * SK_BPF_CB_TX_TIMESTAMPING feature + * is on. At the same time, hwtstamps + * of skb is initialized as the + * timestamp that hardware just + * generates. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect diff --git a/net/core/skbuff.c b/net/core/skbuff.c index b22d079e7143..264435f989ad 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5548,7 +5548,7 @@ static bool skb_enable_app_tstamp(struct sk_buff *skb, int tstype, bool sw) flag = SKBTX_SCHED_TSTAMP; break; case SCM_TSTAMP_SND: - flag = sw ? SKBTX_SW_TSTAMP : SKBTX_HW_TSTAMP; + flag = sw ? SKBTX_SW_TSTAMP : __SKBTX_HW_TSTAMP; break; case SCM_TSTAMP_ACK: if (TCP_SKB_CB(skb)->txstamp_ack) @@ -5565,7 +5565,8 @@ static bool skb_enable_app_tstamp(struct sk_buff *skb, int tstype, bool sw) } static void skb_tstamp_tx_bpf(struct sk_buff *skb, struct sock *sk, - int tstype, bool sw) + int tstype, bool sw, + struct skb_shared_hwtstamps *hwtstamps) { int op; @@ -5574,9 +5575,9 @@ static void skb_tstamp_tx_bpf(struct sk_buff *skb, struct sock *sk, op = BPF_SOCK_OPS_TS_SCHED_OPT_CB; break; case SCM_TSTAMP_SND: - if (!sw) - return; - op = BPF_SOCK_OPS_TS_SW_OPT_CB; + op = sw ? BPF_SOCK_OPS_TS_SW_OPT_CB : BPF_SOCK_OPS_TS_HW_OPT_CB; + if (!sw && hwtstamps) + *skb_hwtstamps(skb) = *hwtstamps; break; default: return; @@ -5599,7 +5600,7 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, /* bpf extension feature entry */ if (skb_shinfo(orig_skb)->tx_flags & SKBTX_BPF) - skb_tstamp_tx_bpf(orig_skb, sk, tstype, sw); + skb_tstamp_tx_bpf(orig_skb, sk, tstype, sw, hwtstamps); /* application feature entry */ if (!skb_enable_app_tstamp(orig_skb, tstype, sw)) diff --git a/net/dsa/user.c b/net/dsa/user.c index 291ab1b4acc4..ae715bf0ae75 100644 --- a/net/dsa/user.c +++ b/net/dsa/user.c @@ -897,7 +897,7 @@ static void dsa_skb_tx_timestamp(struct dsa_user_priv *p, { struct dsa_switch *ds = p->dp->ds; - if (!(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) + if (!(skb_shinfo(skb)->tx_flags & __SKBTX_HW_TSTAMP)) return; if (!ds->ops->port_txtstamp) diff --git a/net/socket.c b/net/socket.c index 262a28b59c7f..70eabb510ce6 100644 --- a/net/socket.c +++ b/net/socket.c @@ -676,7 +676,7 @@ void __sock_tx_timestamp(__u32 tsflags, __u8 *tx_flags) u8 flags = *tx_flags; if (tsflags & SOF_TIMESTAMPING_TX_HARDWARE) { - flags |= SKBTX_HW_TSTAMP; + flags |= __SKBTX_HW_TSTAMP; /* PTP hardware clocks can provide a free running cycle counter * as a time base for virtual clocks. Tell driver to use the diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 9bd1c7c77b17..974b7f61d11f 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -7033,6 +7033,13 @@ enum { * to the nic when SK_BPF_CB_TX_TIMESTAMPING * feature is on. */ + BPF_SOCK_OPS_TS_HW_OPT_CB, /* Called in hardware phase when + * SK_BPF_CB_TX_TIMESTAMPING feature + * is on. At the same time, hwtstamps + * of skb is initialized as the + * timestamp that hardware just + * generates. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect From patchwork Tue Feb 4 18:30:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959565 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (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 24C29216E2C; Tue, 4 Feb 2025 18:31:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693886; cv=none; b=OH1dvi9n0PobpxgOdOZ9OX+uE8jNa7TLFt+ZbyOFz3kRnkmVe0s2TBAZt1a7S+8+jGixe29ETlWyyk7ZLSTaIVSS5YLdtiwdOYGq6D+qmuVgIFhaD4e2UxqMEvwDUxpZJF6A8tPiyKpLRiZacA5LAALnm4wB8LPuQLhpDn4W41s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693886; c=relaxed/simple; bh=GbF9i/NGoOssMZ+z2pMQC8kaLk08sX+9r+6MbyYAkqs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=iaQT6MCLXQx1/yI+LtB1z+LBFPXFgrmiyQC7/+vRMiZREu3UGiUX/sYpy31ZCLBjUUrtpklOZx8/9jkcGJzRufjd9QJIbgGx4yfndpgI/JAUemCwYoKS1plqUX6l4uIbMJSOqHCHsZYNLLVfTP6Pwczs+SiHZISV4DR+P/CXVMc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JE17tjrv; arc=none smtp.client-ip=209.85.216.51 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) header.d=gmail.com header.i=@gmail.com header.b="JE17tjrv" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-2ef87d24c2dso7794004a91.1; Tue, 04 Feb 2025 10:31:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693884; x=1739298684; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MSJKwhBaTBjXSOqUzx7GMH/QTzRAVzoR3hkZEhBsQ34=; b=JE17tjrvN20hTDbmcG6EcjxaM5Uehu5qkEEOXncdItrRCpg57KL1H1bwfmLzMvvImd pCLRUvqmb+3hCJ9BdrtpHtc7GcJdFTi0nAQYMx9RIbDTBF3iv0yvUIiOVGTQmfPchYmE X4v61XTCH2bzaEeaFh5Zww+en2x7NxGblQ/SDL0hNKiH6cCN8WTcXnWlv/RqzEs6fvmu bq6jZCDADJ3gEkQJtkb6j1aRiRQuH7AiuEQw87pwuqEK3l1AaqwVH052DVQWGAFwu/i3 www+yglKv+XOLRg9fkPSVaLedAaLv9Jo8gsh1SEWlNmxOAjoBnaZLk/Tiyv3MXX6ULZ0 qVWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693884; x=1739298684; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MSJKwhBaTBjXSOqUzx7GMH/QTzRAVzoR3hkZEhBsQ34=; b=suCfBd8CJ0VLcYNsvrJFGXdakJhqUH7zklamhftDUmK0Kl7C8/YzsaV+KYvg9HIqy3 3MsmC1R0IB4aGjApOrnJ7Y02pjZToSg21wIof4UC1hVceM/rNfbP/WBbPC8rwqiKV5H7 jKEJHA0MBpOdIy0o+sgqLHSWyKyfRrqsHYgUBOZL2u61jBplrNO8vx8F71+3IDt/A8Xb GL0tQg4AdN0Kle104pR4y3ka5KHLgVXRg/0tMj/SYAd2MidzyohMZYdBtM4GqK3BJ3IW AwixYGQrMihORfkrCZ3uFSGVGPMJp197dHVD/V6DlUsEmauFhIJyNc2mugUW9GxY9p+P qReg== X-Forwarded-Encrypted: i=1; AJvYcCUu7qHkjI3AluakERoF1+Ni0bJmuoe1O5B0sHA6/gWlusOjQ4b5WwqN+L0V0qRBrBSHE2pWxao=@vger.kernel.org X-Gm-Message-State: AOJu0YxILJAIgDLo1Y/RNOZ477L5BwTsYgyo5xh1l5iwD+vutxEALNX+ qwh3wc4wwGp/p3zsr+n3zwhCb+ZRYJkZ0ZN0U4CigjXIFHfXJrL/ X-Gm-Gg: ASbGncspNyAhMqYMclDysQ/TP7336AFukL2CBauSJSes0KwVnLYGEfCNztxF9bX7PL8 pwTgCpMGKY3lsmXZSFJeyLpMNPt4EvXVysVoOw1O4hz4kFEDS3BvELH65aGayfQiBydIWXinzgn Cqzfsk6TL1Yaf7m5dKsIbkqVhScK55RgKjKXC1XJJbQeZffH9VtKU+t1L0WeLB2dlkuPyfeLSL8 Zspj/mbE2N0aj/ENU9hzun4DIVnivGhrV36OVKJ0qqKR7KIFv5un9xeHv0hdocJVt9LE36UYw1O JHtXbYNOwpkqsZ94MgDaM3PsiXjsRP/lWFIYO+39iOgu0hU86yUl+g== X-Google-Smtp-Source: AGHT+IGTb5RZPksSbgur+iLH3+VpLpb1vlkxAluOSPQrrfVOJgeFolAVqRv5XAuM5wbpvvvMvzikTQ== X-Received: by 2002:a17:90b:53c8:b0:2ee:c04a:4281 with SMTP id 98e67ed59e1d1-2f83abb3525mr36340628a91.6.1738693884338; Tue, 04 Feb 2025 10:31:24 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.31.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:31:24 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 09/12] bpf: support SCM_TSTAMP_ACK of SO_TIMESTAMPING Date: Wed, 5 Feb 2025 02:30:21 +0800 Message-Id: <20250204183024.87508-10-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Handle the ACK timestamp case. Actually testing SKBTX_BPF flag can work, but Introducing a new txstamp_ack_bpf to avoid cache line misses in tcp_ack_tstamp() is needed. To be more specific, in most cases, normal flows would not access skb_shinfo as txstamp_ack is zero, so that this function won't appear in the hot spot lists. Introducing a new member txstamp_ack_bpf works similarly. Signed-off-by: Jason Xing --- include/net/tcp.h | 3 ++- include/uapi/linux/bpf.h | 5 +++++ net/core/skbuff.c | 3 +++ net/ipv4/tcp_input.c | 3 ++- net/ipv4/tcp_output.c | 5 +++++ tools/include/uapi/linux/bpf.h | 5 +++++ 6 files changed, 22 insertions(+), 2 deletions(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index 293047694710..88429e422301 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -959,9 +959,10 @@ struct tcp_skb_cb { __u8 sacked; /* State flags for SACK. */ __u8 ip_dsfield; /* IPv4 tos or IPv6 dsfield */ __u8 txstamp_ack:1, /* Record TX timestamp for ack? */ + txstamp_ack_bpf:1, /* ack timestamp for bpf use */ eor:1, /* Is skb MSG_EOR marked? */ has_rxtstamp:1, /* SKB has a RX timestamp */ - unused:5; + unused:4; __u32 ack_seq; /* Sequence number ACK'd */ union { struct { diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 4c3566f623c2..800122a8abe5 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -7047,6 +7047,11 @@ enum { * timestamp that hardware just * generates. */ + BPF_SOCK_OPS_TS_ACK_OPT_CB, /* Called when all the skbs in the + * same sendmsg call are acked + * when SK_BPF_CB_TX_TIMESTAMPING + * feature is on. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 264435f989ad..a8463fef574a 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5579,6 +5579,9 @@ static void skb_tstamp_tx_bpf(struct sk_buff *skb, struct sock *sk, if (!sw && hwtstamps) *skb_hwtstamps(skb) = *hwtstamps; break; + case SCM_TSTAMP_ACK: + op = BPF_SOCK_OPS_TS_ACK_OPT_CB; + break; default: return; } diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 62252702929d..c8945f5be31b 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -3323,7 +3323,8 @@ static void tcp_ack_tstamp(struct sock *sk, struct sk_buff *skb, const struct skb_shared_info *shinfo; /* Avoid cache line misses to get skb_shinfo() and shinfo->tx_flags */ - if (likely(!TCP_SKB_CB(skb)->txstamp_ack)) + if (likely(!TCP_SKB_CB(skb)->txstamp_ack && + !TCP_SKB_CB(skb)->txstamp_ack_bpf)) return; shinfo = skb_shinfo(skb); diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 695749807c09..fc84ca669b76 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -1556,6 +1556,7 @@ static void tcp_adjust_pcount(struct sock *sk, const struct sk_buff *skb, int de static bool tcp_has_tx_tstamp(const struct sk_buff *skb) { return TCP_SKB_CB(skb)->txstamp_ack || + TCP_SKB_CB(skb)->txstamp_ack_bpf || (skb_shinfo(skb)->tx_flags & SKBTX_ANY_TSTAMP); } @@ -1572,7 +1573,9 @@ static void tcp_fragment_tstamp(struct sk_buff *skb, struct sk_buff *skb2) shinfo2->tx_flags |= tsflags; swap(shinfo->tskey, shinfo2->tskey); TCP_SKB_CB(skb2)->txstamp_ack = TCP_SKB_CB(skb)->txstamp_ack; + TCP_SKB_CB(skb2)->txstamp_ack_bpf = TCP_SKB_CB(skb)->txstamp_ack_bpf; TCP_SKB_CB(skb)->txstamp_ack = 0; + TCP_SKB_CB(skb)->txstamp_ack_bpf = 0; } } @@ -3213,6 +3216,8 @@ void tcp_skb_collapse_tstamp(struct sk_buff *skb, shinfo->tskey = next_shinfo->tskey; TCP_SKB_CB(skb)->txstamp_ack |= TCP_SKB_CB(next_skb)->txstamp_ack; + TCP_SKB_CB(skb)->txstamp_ack_bpf |= + TCP_SKB_CB(next_skb)->txstamp_ack_bpf; } } diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 974b7f61d11f..06e68d772989 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -7040,6 +7040,11 @@ enum { * timestamp that hardware just * generates. */ + BPF_SOCK_OPS_TS_ACK_OPT_CB, /* Called when all the skbs in the + * same sendmsg call are acked + * when SK_BPF_CB_TX_TIMESTAMPING + * feature is on. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect From patchwork Tue Feb 4 18:30:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959566 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (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 A30A6217716; Tue, 4 Feb 2025 18:31:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693892; cv=none; b=rRB996qiJMeO6ABumCoANcidhLQar5M4tZQMMcDhgR9WuwMkZvsdynoT7Ei/W2A/17KtR1G9gFALtoUlp7zSO43o52SNUoeAqVJP3+R2e/d2ZuzCNe+fmh9SrY2sJz1KggCK70E14xBO2q6qFKb3CZTmxib4mzQZTtpFPz+uwR0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693892; c=relaxed/simple; bh=Blkp9t5eyElI1bhmb34aOXVqeTPcb3Fa1pZTIdwHEK4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=NJfsu2b+U05ZoXb5WV1aLSsR6aA3ql8NNyDA3390XZV/CZwSR2FxP5ShH83WQKR47BFpFI4x0b5NEdXXGZbsqqFbmwc+EPoh1JdhH193Ch21aMKYNoEpKpD9qUZo2W2bvGDb2rcPwa5Xms94uOooIKxmIwMVIrJBUy3M/n0u2E8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=foRB8yhh; arc=none smtp.client-ip=209.85.216.54 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) header.d=gmail.com header.i=@gmail.com header.b="foRB8yhh" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-2f9cb23d22cso1220520a91.1; Tue, 04 Feb 2025 10:31:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693890; x=1739298690; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hxLtuhE10MEuDrxCFADp/8wzNE83tQvqrbcavGZtRMg=; b=foRB8yhhCRC0AAX2Jrryc6jwnOvTh9m0U8quO1rqNWIHgHo8I4nFXqw+LtgScQC0Hl ta0UM16AJxQMEEPExbBj8cqSNoj03oq114EEEAESrdI6CQjZIsJJpQn4wtqyphSgKqir esjQxKv7Q9n/qGNQeIAqUDnz81H6u53/ZuJsiBGPtVhoxBVCWwVJBOV2HsOrlJWnqopu 1M/En2gUmOUHxfzXQDiNz6hs2vLhkmn12+wuyIKrj8gqxVUaLlEhk59R38UxDA/HhF83 5+5KOPhbIVmc6NxE5zzmUs+XxHep0Q1uu43XxWXZndcpApvFYofpox0yDm6u4Y4Q4e2y Bd5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693890; x=1739298690; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hxLtuhE10MEuDrxCFADp/8wzNE83tQvqrbcavGZtRMg=; b=I53dzmuXkSfJ77Tc/JpgUFPooch/LvPIrO9oTMbTLmuQlcun6Ddob7VW60Q/utrEfI YfG/zTk6XGolRCDiDaDBOXH49l/sZPb5IRMsmFh/OGM4hH2JFHBzAJD4f/39iN4FMBcj Jwb5HMCAyUMwRh9nFbcFoCnMc4uTPLxvzEExnP/WNFeOH43YmG6nsQGy71+XtG9dIGa/ 2wbf5Iz/ql/k9mr8p+S/7/L4KZVajx6yvbLczzqeFU3WHGazOlCkZ0lZeEP2Kz8gIYqq EmUjk61+F5CeXNTIwWof+G9WIFjPyPoqTJLPza/eBRv+LJcpD3BNmxI3WmsXNteHqdYd nDbA== X-Forwarded-Encrypted: i=1; AJvYcCX6BkBbPPof94fwEEHVNb89XK0znwcDK3RZ3FttMn6uZieWilMAHQK7sUVqCtfM23rohfymGqc=@vger.kernel.org X-Gm-Message-State: AOJu0YwLuimob/88Hga8kYBPTfUvxdr3FMAqbPdEKN/zNHFNh93gDE2f WWksrkcsIBU9akMnzH8vBi5Y06Y1AgZYVlP/cxADnwPEXtfWVvVn X-Gm-Gg: ASbGncvNBDQgweRkg8wnzTTyR4DAkTYtauY7PrtKNAwoGW5/uaDsirgQNduC9SJD++E LEZ73jgJFgHBHXqo3FdeG+9rhn/HXpigMGfpIb+GyX1x3qo3tGRS3STf4pPHNTF1VHGyQOczDm4 E/MHLcOCZ0CsdvqI2TZLzeX1093ll9DcDLf3v3gfWeunwPSCVjx94pqzKD8Y0QYBcnODBunYgj9 CBN6uupVPkqGcdM9vU0JR7xEqhsJvDQUWDznE3MpN3oMhrNDrcnWBvQGSwdvMyanqm2qJSH4H8z JZCmlRkcwQJZ23av6luK/P1inKabfAkum3IaixH1PS3o+SIziayeUQ== X-Google-Smtp-Source: AGHT+IFYsio+hsEy6VOpiXQ9YIsCcC/uZIT4OQtvUIez5wR+uUN6hRnoJrUAOs2l+xpg4ZQOQhJNSA== X-Received: by 2002:a17:90b:5445:b0:2ee:a583:e616 with SMTP id 98e67ed59e1d1-2f83abdeb6fmr40850408a91.9.1738693889954; Tue, 04 Feb 2025 10:31:29 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.31.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:31:29 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 10/12] bpf: make TCP tx timestamp bpf extension work Date: Wed, 5 Feb 2025 02:30:22 +0800 Message-Id: <20250204183024.87508-11-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net After this patch, people can fully use the bpf prog to trace the tx path for TCP type. Signed-off-by: Jason Xing --- net/ipv4/tcp.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 0d704bda6c41..3df802410ebf 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -492,6 +492,16 @@ static void tcp_tx_timestamp(struct sock *sk, struct sockcm_cookie *sockc) if (tsflags & SOF_TIMESTAMPING_TX_RECORD_MASK) shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1; } + + if (cgroup_bpf_enabled(CGROUP_SOCK_OPS) && + SK_BPF_CB_FLAG_TEST(sk, SK_BPF_CB_TX_TIMESTAMPING) && skb) { + struct skb_shared_info *shinfo = skb_shinfo(skb); + struct tcp_skb_cb *tcb = TCP_SKB_CB(skb); + + tcb->txstamp_ack_bpf = 1; + shinfo->tx_flags |= SKBTX_BPF; + shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1; + } } static bool tcp_stream_is_readable(struct sock *sk, int target) From patchwork Tue Feb 4 18:30:23 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959567 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) (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 4D5E8217719; Tue, 4 Feb 2025 18:31:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693897; cv=none; b=UXTKuj0DpTRVRgwDjY2lXJgnfj3g/Dmb+KhfmziwcHgam1fFnA/oEXPkj6DbGUKdKenQ7kjg+zBDGADuQXGh7kxIKVkQ3Uhl+Ai+YI/rvsdGXZiWNMHcXr+b4vxdAbM4UC+5adC3BH9vSo5MqdQ7y01Ov6NjMkgECX3h7/R8mQA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693897; c=relaxed/simple; bh=U7E9mizli4Bk7jylQ/BPR7NIf1gctffza2LoYxYBHeE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=OSxfD7k0YUPIO8aAjDqCJzJIPvLLUe9VCiQVeF7G7vscEGVfszNTMxEbWxH76I0n2iE2/I8V/2qhnYCKqoO4GPFLLM3qsJhYk4sUFLtY/yrxnvMCb413TCbzohRai0RJlnt8UmAOYJDkh0gBWo6jD7BDbycPfwLNK1R0NQEgoCs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=lj70skGH; arc=none smtp.client-ip=209.85.216.48 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) header.d=gmail.com header.i=@gmail.com header.b="lj70skGH" Received: by mail-pj1-f48.google.com with SMTP id 98e67ed59e1d1-2f13acbe29bso88426a91.1; Tue, 04 Feb 2025 10:31:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693895; x=1739298695; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9DRlgN3qVuWfs5Q4rRCKBtt/eYEeRjpMUiyPnMHhuq0=; b=lj70skGHGuLziXwOm3WiAogBqLdYKKNSmEasZPZzwrVzQYqZDK6P6L4cr3fNDAidfY EZczRr52Tbrjg3eeQBbLbJQ46FW5b676FQlvShYx2Xo9sG6w6e9bD0iY9J0cxT2fszI5 R9WGUrW/8SGUZ5C5yTpYjXGWDGJ50Lg3PXf7exhKx7pFAAMKZ4xz3gedZ20iAcE5Ox+N aB4h0I6ex8HWVDTJh/S481gnFQUbm3qTX6k/iSTGqlDt+rAgL5DSEPcly1Y0uxn90FZh 0zEwjiVWAncX8jPcjzqtpg8qgB9ScnNlJ456T1HStylgdrMG5ihHjEYA2w3n1NZ2aq3n 4HHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693895; x=1739298695; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9DRlgN3qVuWfs5Q4rRCKBtt/eYEeRjpMUiyPnMHhuq0=; b=eRJfDGPc7gffMNa+brAbrNfI0Vn6MDnSe7npGjTv+IcVZZbbRjDDKDYViYgkns9/kd fn2YrY+VCs3luIe9P4x4tAzTkl/SOOZE3XCyS7O0Wi/npvN+gQx0KNOyEmc/KsYt+r7L dZfk7r3hCoUvlDIO1WdzVlNMFnLr58i6xz+NRHT4veaMoOaK14pjxUTQcjD6mWVUQkND rhu0TPlMCD83tAX6apaKo+DIEgdfmPzZ0JC2sQoX+3mZGJEUoYV68oMlJ6xV/QE9Fzfs OFlLn7D4WaOTBuDgOwvYbTIIk+S0sVzGH+TJccxDpqOEP5r6B9eklwq6JnKrYYT9Elrz aF2g== X-Forwarded-Encrypted: i=1; AJvYcCV87uBRUB/ItgzZtibiwWp2OaAnhHNqKwgn4B9h0ENAo5Npa7i8dwZO7egoXvlSSfGMfcojy8s=@vger.kernel.org X-Gm-Message-State: AOJu0YyiSp1AVRFQOO0GMXli7wngVlQnGMaX8cLtGu9jv+iOSTp26yth 0nH7XDWPVfTjsUlieXkuvjq3fITmLynH49xlgrdVOppbZr0XbI+D X-Gm-Gg: ASbGnctvYhrBd0dr5RoMcCqxl7LpiXHGryOYQFan4Yr3m4y8gEvp3mmnA//cUKiAtS9 b0QaktWeFwH42VlN1RqdcHb6eqZUUSiRqlcOWMrMIlMnPDilo5tL9hC+3/8vj43cE2dcDV+D5fR XxjouiHjz6tom3VvORiYEXHI/U5JQI9Eoqkq15fqG5UKhcTp3+2funHMRfG7huAvCHYM1Rzc+th vFtrKoo2nCqqqXgXPrkyGI/30FhIPJqjOVI/U/3kQbTbzqTT2IL8qHLRS1ESn4TTqdMPZG90s/0 iqeUNGiOfkK1RZSZUvIgwIvtvCAtjJymP3t9S60UHqRJwrnIYvhcag== X-Google-Smtp-Source: AGHT+IFcJT+ALVYYNbzTyM7auTPPGJVRhKb/Gp+nFSLDgsro7nKlUTzUjf29NphzQ+zbO3GRvkaCWg== X-Received: by 2002:a17:90b:2884:b0:2f9:9c3a:ed3 with SMTP id 98e67ed59e1d1-2f9ba73e992mr6512851a91.16.1738693895580; Tue, 04 Feb 2025 10:31:35 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.31.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:31:35 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 11/12] bpf: add a new callback in tcp_tx_timestamp() Date: Wed, 5 Feb 2025 02:30:23 +0800 Message-Id: <20250204183024.87508-12-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Introduce the callback to correlate tcp_sendmsg timestamp with other points, like SND/SW/ACK. let bpf prog trace the beginning of tcp_sendmsg_locked() and then store the sendmsg timestamp at the bpf_sk_storage, so that in tcp_tx_timestamp() we can correlate the timestamp with tskey which can be found in other sending points. More details can be found in the selftest: The selftest uses the bpf_sk_storage to store the sendmsg timestamp at fentry/tcp_sendmsg_locked and retrieves it back at tcp_tx_timestamp (i.e. BPF_SOCK_OPS_TS_SND_CB added in this patch). Signed-off-by: Jason Xing --- include/uapi/linux/bpf.h | 7 +++++++ net/ipv4/tcp.c | 1 + tools/include/uapi/linux/bpf.h | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 800122a8abe5..accb3b314fff 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -7052,6 +7052,13 @@ enum { * when SK_BPF_CB_TX_TIMESTAMPING * feature is on. */ + BPF_SOCK_OPS_TS_SND_CB, /* Called when every sendmsg syscall + * is triggered. For TCP, it stays + * in the last send process to + * correlate with tcp_sendmsg timestamp + * with other timestamping callbacks, + * like SND/SW/ACK. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 3df802410ebf..a2ac57543b6d 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -501,6 +501,7 @@ static void tcp_tx_timestamp(struct sock *sk, struct sockcm_cookie *sockc) tcb->txstamp_ack_bpf = 1; shinfo->tx_flags |= SKBTX_BPF; shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1; + bpf_skops_tx_timestamping(sk, skb, BPF_SOCK_OPS_TS_SND_CB); } } diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 06e68d772989..384502996cdd 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -7045,6 +7045,13 @@ enum { * when SK_BPF_CB_TX_TIMESTAMPING * feature is on. */ + BPF_SOCK_OPS_TS_SND_CB, /* Called when every sendmsg syscall + * is triggered. For TCP, it stays + * in the last send process to + * correlate with tcp_sendmsg timestamp + * with other timestamping callbacks, + * like SND/SW/ACK. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect From patchwork Tue Feb 4 18:30:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Xing X-Patchwork-Id: 13959568 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 365E1216E2C; Tue, 4 Feb 2025 18:31:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693904; cv=none; b=Hr9L6D4UuHBUOdkghFp7OFeUFkCRYLCigY1bE7gszcFM/mUu7AHgfIrMetOBgBsAMQXSx2+yF9L4gxaxCj/WFqburLyqZIu46C0B2dM9ki2P43Wen4Y8hL4N6Hj9E1hdTixLbBsk5LtrFcc9h5O/WsrmgeQj3WLh54aJenAVWGc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738693904; c=relaxed/simple; bh=PEkCAvKkwZMHFwnW0IRzODxvbKz765Ze0Wjp1RscKIs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Oqpj/jUK9Dl0bkGKA873nZSuzTrkOCDdAe36uvkLGjLkUcqsA+S6SuOk9wn8Su5Q+4rXIuYwDPB250pNBzcopWh7NipJ6nEfoFBxYNAElBMYZ6UgtKU9Ge1b+OwT30V2S46GJwWjBgFt7BeHl/j7CIQpOgQUY9nZTNXPgR2ZuHI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=WcSZ2OEx; arc=none smtp.client-ip=209.85.214.171 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) header.d=gmail.com header.i=@gmail.com header.b="WcSZ2OEx" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-21644aca3a0so138970305ad.3; Tue, 04 Feb 2025 10:31:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738693901; x=1739298701; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7c4fIDjfzhYg9xW5oO4dMMiKBgmgZpT+f0c/dW19Gbk=; b=WcSZ2OExKiIAg+wu94W4++nltDx6camwOMTUWW1NiKcslbEsXxnaGRMLm3moT2EY+M YjkVYvFOSWS/Q2fAI0u6KE9bEtZjoYMinrRAc9RUYUk7H5Wz0Ip6nd8oURq9XyCVbImm I8I4eszaid+JT4kM9J4Qjy0ETKH8j+0t9r1DHkCqOyomxQ3QOiS94ONJsEVXYoUbiMbS Pn5OETdD81E8UzO/onXr7cqrzNT+UhX4Lu1EgeXPL+s0KwUMi8D0vaQYLic/M43tWCeQ ev2TDEplxOyuYyDkiSoNVrSGWMCuwpgzlaHaaqhWyItBYI4X24jTuHXwV6Xa51dzgksR 5pag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738693901; x=1739298701; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7c4fIDjfzhYg9xW5oO4dMMiKBgmgZpT+f0c/dW19Gbk=; b=ZuCKRKXywsYOF+TPWq0iiDvhDfouetxsyn50Ji8mQ4DCb1kirlNlNg+VywUxeiHQoy haD4mfii470mzoxIaGMQhvBvNHXkK3lTGJIaXru0P/iR/E2MynijoYaVAxWapw8/ygOh MuixUyqrYg3wkvP95FaC02ZJXieLoUT01yyhyhrU1zWFLoh9FA4MPIlfY7Ea9OUXhvEk 8hvqvGcYm82K66QHMMvrUfH73/afG0LKfg/AYpdCGcFCAz63dk9xdzSpJgywcbO9o4Qr kwmd7KXxAtEQI4dOeE91bCr+5gn7jLVenoOS8gm/aAgGIyi6pv6MAbvW83S8juS/Podc eCZw== X-Forwarded-Encrypted: i=1; AJvYcCWH7ZtlwJRigeY4D9p2uuuQKXNZc9DT363FZdG5RZWwGg7b7hbSj4gx8LRknDmZkNUp5kdmdgE=@vger.kernel.org X-Gm-Message-State: AOJu0YxKc9iCemahbhzqx18QcshqQy5QUCirgLX3FbpNY/3MXpk0dWMx iAb0z/s1Up4MdCj5U/rmZ21QZ30+Dd0ocnJvA3LvrZETHXUFlat2 X-Gm-Gg: ASbGncuzXGBmdf0F0Q/4T2EJi/TssGo1Lu/TKtab2pJBnKwLR/+XAUGkZ47CG1EGxzv IATlbVJAGKH3aJGMj+h6U/Z5gIiVrdF/GFJ7VuRz5Q0LkxsOYSCXyS4TgE4mFXcZyci72CGgQ4O lnHKht4PVWnUX/fA6Lyzg6H1GyjzqurH8sjeNQ3vSKxVfjZALrpjdybSZZYUQqHbyTcJUpBW4Nd glSeRbcbMNuzWF2XRFRRPvLuEEiSDGQ52Nq7PxjZNfmGUURT6aKcwOCRbps5XpY/s0zXoh4im/Q ZcmrcKM/0pUNRP1KjPnV+jsKnwB8O5XF/fHJcNhf57xBNSgI4fqlhA== X-Google-Smtp-Source: AGHT+IH/tPUN7YZLjQLsVdaN9RdQndECxz0nEN+h5bjlyKilwuB7Ry5m8Dz4WV8OkpOXFkTuKRWREg== X-Received: by 2002:a17:902:d543:b0:21f:f3d:d533 with SMTP id d9443c01a7336-21f0f3dd8afmr26059515ad.2.1738693901298; Tue, 04 Feb 2025 10:31:41 -0800 (PST) Received: from KERNELXING-MC1.tencent.com ([111.201.25.167]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848a99a45sm11590591a91.38.2025.02.04.10.31.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Feb 2025 10:31:40 -0800 (PST) From: Jason Xing To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, dsahern@kernel.org, willemdebruijn.kernel@gmail.com, willemb@google.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, horms@kernel.org Cc: bpf@vger.kernel.org, netdev@vger.kernel.org, Jason Xing Subject: [PATCH bpf-next v8 12/12] selftests/bpf: add simple bpf tests in the tx path for timestamping feature Date: Wed, 5 Feb 2025 02:30:24 +0800 Message-Id: <20250204183024.87508-13-kerneljasonxing@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250204183024.87508-1-kerneljasonxing@gmail.com> References: <20250204183024.87508-1-kerneljasonxing@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Bpf prog calculates a couple of latency delta between each tx points which SO_TIMESTAMPING feature has already implemented. It can be used in the real world to diagnose the behaviour in the tx path. Also, check the safety issues by accessing a few bpf calls in bpf_test_access_bpf_calls(). Signed-off-by: Jason Xing --- .../bpf/prog_tests/so_timestamping.c | 79 +++++ .../selftests/bpf/progs/so_timestamping.c | 306 ++++++++++++++++++ 2 files changed, 385 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/so_timestamping.c create mode 100644 tools/testing/selftests/bpf/progs/so_timestamping.c diff --git a/tools/testing/selftests/bpf/prog_tests/so_timestamping.c b/tools/testing/selftests/bpf/prog_tests/so_timestamping.c new file mode 100644 index 000000000000..1829f93bc52e --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/so_timestamping.c @@ -0,0 +1,79 @@ +#include "test_progs.h" +#include "network_helpers.h" + +#include "so_timestamping.skel.h" + +#define CG_NAME "/so-timestamping-test" + +static const char addr4_str[] = "127.0.0.1"; +static const char addr6_str[] = "::1"; +static struct so_timestamping *skel; + +static void test_tcp(int family) +{ + struct so_timestamping__bss *bss = skel->bss; + char buf[] = "testing testing"; + int sfd = -1, cfd = -1; + int n; + + memset(bss, 0, sizeof(*bss)); + + sfd = start_server(family, SOCK_STREAM, + family == AF_INET6 ? addr6_str : addr4_str, 0, 0); + if (!ASSERT_OK_FD(sfd, "start_server")) + goto out; + + cfd = connect_to_fd(sfd, 0); + if (!ASSERT_OK_FD(cfd, "connect_to_fd_server")) + goto out; + + n = write(cfd, buf, sizeof(buf)); + if (!ASSERT_EQ(n, sizeof(buf), "send to server")) + goto out; + + ASSERT_EQ(bss->nr_active, 1, "nr_active"); + ASSERT_EQ(bss->nr_snd, 2, "nr_snd"); + ASSERT_EQ(bss->nr_sched, 1, "nr_sched"); + ASSERT_EQ(bss->nr_txsw, 1, "nr_txsw"); + ASSERT_EQ(bss->nr_ack, 1, "nr_ack"); + +out: + if (sfd >= 0) + close(sfd); + if (cfd >= 0) + close(cfd); +} + +void test_so_timestamping(void) +{ + struct netns_obj *ns; + int cg_fd; + + cg_fd = test__join_cgroup(CG_NAME); + if (!ASSERT_OK_FD(cg_fd, "join cgroup")) + return; + + ns = netns_new("so_timestamping_ns", true); + if (!ASSERT_OK_PTR(ns, "create ns")) + goto done; + + skel = so_timestamping__open_and_load(); + if (!ASSERT_OK_PTR(skel, "open and load skel")) + goto done; + + if (!ASSERT_OK(so_timestamping__attach(skel), "attach skel")) + goto done; + + skel->links.skops_sockopt = + bpf_program__attach_cgroup(skel->progs.skops_sockopt, cg_fd); + if (!ASSERT_OK_PTR(skel->links.skops_sockopt, "attach cgroup")) + goto done; + + test_tcp(AF_INET6); + test_tcp(AF_INET); + +done: + so_timestamping__destroy(skel); + netns_free(ns); + close(cg_fd); +} diff --git a/tools/testing/selftests/bpf/progs/so_timestamping.c b/tools/testing/selftests/bpf/progs/so_timestamping.c new file mode 100644 index 000000000000..dc8bbcfd9eb5 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/so_timestamping.c @@ -0,0 +1,306 @@ +#include "vmlinux.h" +#include "bpf_tracing_net.h" +#include +#include +#include "bpf_misc.h" +#include "bpf_kfuncs.h" +#define BPF_PROG_TEST_TCP_HDR_OPTIONS +#include "test_tcp_hdr_options.h" +#include + +#define SK_BPF_CB_FLAGS 1009 +#define SK_BPF_CB_TX_TIMESTAMPING 1 + +int nr_active; +int nr_snd; +int nr_passive; +int nr_sched; +int nr_txsw; +int nr_ack; + +struct sockopt_test { + int opt; + int new; +}; + +static const struct sockopt_test sol_socket_tests[] = { + { .opt = SK_BPF_CB_FLAGS, .new = SK_BPF_CB_TX_TIMESTAMPING, }, + { .opt = 0, }, +}; + +struct loop_ctx { + void *ctx; + const struct sock *sk; +}; + +struct sk_stg { + __u64 sendmsg_ns; /* record ts when sendmsg is called */ +}; + +struct sk_tskey { + u64 cookie; + u32 tskey; +}; + +struct delay_info { + u64 sendmsg_ns; /* record ts when sendmsg is called */ + u32 sched_delay; /* SCHED_OPT_CB - sendmsg_ns */ + u32 sw_snd_delay; /* SW_OPT_CB - SCHED_OPT_CB */ + u32 ack_delay; /* ACK_OPT_CB - SW_OPT_CB */ +}; + +struct { + __uint(type, BPF_MAP_TYPE_SK_STORAGE); + __uint(map_flags, BPF_F_NO_PREALLOC); + __type(key, int); + __type(value, struct sk_stg); +} sk_stg_map SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, struct sk_tskey); + __type(value, struct delay_info); + __uint(max_entries, 1024); +} time_map SEC(".maps"); + +static u64 delay_tolerance_nsec = 10000000000; /* 10 second as an example */ + +static int bpf_test_sockopt_int(void *ctx, const struct sock *sk, + const struct sockopt_test *t, + int level) +{ + int new, opt, tmp; + + opt = t->opt; + new = t->new; + + if (bpf_setsockopt(ctx, level, opt, &new, sizeof(new))) + return 1; + + if (bpf_getsockopt(ctx, level, opt, &tmp, sizeof(tmp)) || + tmp != new) + return 1; + + return 0; +} + +static int bpf_test_socket_sockopt(__u32 i, struct loop_ctx *lc) +{ + const struct sockopt_test *t; + + if (i >= ARRAY_SIZE(sol_socket_tests)) + return 1; + + t = &sol_socket_tests[i]; + if (!t->opt) + return 1; + + return bpf_test_sockopt_int(lc->ctx, lc->sk, t, SOL_SOCKET); +} + +static int bpf_test_sockopt(void *ctx, const struct sock *sk) +{ + struct loop_ctx lc = { .ctx = ctx, .sk = sk, }; + int n; + + n = bpf_loop(ARRAY_SIZE(sol_socket_tests), bpf_test_socket_sockopt, &lc, 0); + if (n != ARRAY_SIZE(sol_socket_tests)) + return -1; + + return 0; +} + +static bool bpf_test_access_sockopt(void *ctx) +{ + const struct sockopt_test *t; + int tmp, ret, i = 0; + int level = SOL_SOCKET; + + t = &sol_socket_tests[i]; + + for (; t->opt;) { + ret = bpf_setsockopt(ctx, level, t->opt, (void *)&t->new, sizeof(t->new)); + if (ret != -EOPNOTSUPP) + return true; + + ret = bpf_getsockopt(ctx, level, t->opt, &tmp, sizeof(tmp)); + if (ret != -EOPNOTSUPP) + return true; + + if (++i >= ARRAY_SIZE(sol_socket_tests)) + break; + } + + return false; +} + +/* Adding a simple test to see if we can get an expected value */ +static bool bpf_test_access_load_hdr_opt(struct bpf_sock_ops *skops) +{ + struct tcp_opt reg_opt; + int load_flags = 0; + int ret; + + reg_opt.kind = TCPOPT_EXP; + reg_opt.len = 0; + reg_opt.data32 = 0; + ret = bpf_load_hdr_opt(skops, ®_opt, sizeof(reg_opt), load_flags); + if (ret != -EOPNOTSUPP) + return true; + + return false; +} + +/* Adding a simple test to see if we can get an expected value */ +static bool bpf_test_access_cb_flags_set(struct bpf_sock_ops *skops) +{ + int ret; + + ret = bpf_sock_ops_cb_flags_set(skops, 0); + if (ret != -EOPNOTSUPP) + return true; + + return false; +} + +/* In the timestamping callbacks, we're not allowed to call the following + * BPF CALLs for the safety concern. Return false if expected. + */ +static bool bpf_test_access_bpf_calls(struct bpf_sock_ops *skops, + const struct sock *sk) +{ + if (bpf_test_access_sockopt(skops)) + return true; + + if (bpf_test_access_load_hdr_opt(skops)) + return true; + + if (bpf_test_access_cb_flags_set(skops)) + return true; + + return false; +} + +static bool bpf_test_delay(struct bpf_sock_ops *skops, const struct sock *sk) +{ + struct bpf_sock_ops_kern *skops_kern; + u64 timestamp = bpf_ktime_get_ns(); + struct skb_shared_info *shinfo; + struct delay_info dinfo = {0}; + struct sk_tskey key = {0}; + struct delay_info *val; + struct sk_buff *skb; + struct sk_stg *stg; + u64 prior_ts, delay; + + if (bpf_test_access_bpf_calls(skops, sk)) + return false; + + skops_kern = bpf_cast_to_kern_ctx(skops); + skb = skops_kern->skb; + shinfo = bpf_core_cast(skb->head + skb->end, struct skb_shared_info); + key.tskey = shinfo->tskey; + if (!key.tskey) + return false; + + key.cookie = bpf_get_socket_cookie(skops); + if (!key.cookie) + return false; + + if (skops->op == BPF_SOCK_OPS_TS_SND_CB) { + stg = bpf_sk_storage_get(&sk_stg_map, (void *)sk, 0, 0); + if (!stg) + return false; + dinfo.sendmsg_ns = stg->sendmsg_ns; + bpf_map_update_elem(&time_map, &key, &dinfo, BPF_ANY); + goto out; + } + + val = bpf_map_lookup_elem(&time_map, &key); + if (!val) + return false; + + switch (skops->op) { + case BPF_SOCK_OPS_TS_SCHED_OPT_CB: + delay = val->sched_delay = timestamp - val->sendmsg_ns; + break; + case BPF_SOCK_OPS_TS_SW_OPT_CB: + prior_ts = val->sched_delay + val->sendmsg_ns; + delay = val->sw_snd_delay = timestamp - prior_ts; + break; + case BPF_SOCK_OPS_TS_ACK_OPT_CB: + prior_ts = val->sw_snd_delay + val->sched_delay + val->sendmsg_ns; + delay = val->ack_delay = timestamp - prior_ts; + break; + } + + if (delay >= delay_tolerance_nsec) + return false; + + /* Since it's the last one, remove from the map after latency check */ + if (skops->op == BPF_SOCK_OPS_TS_ACK_OPT_CB) + bpf_map_delete_elem(&time_map, &key); + +out: + return true; +} + +SEC("fentry/tcp_sendmsg_locked") +int BPF_PROG(trace_tcp_sendmsg_locked, struct sock *sk, struct msghdr *msg, size_t size) +{ + u64 timestamp = bpf_ktime_get_ns(); + u32 flag = sk->sk_bpf_cb_flags; + struct sk_stg *stg; + + if (!flag) + return 0; + + stg = bpf_sk_storage_get(&sk_stg_map, sk, 0, + BPF_SK_STORAGE_GET_F_CREATE); + if (!stg) + return 0; + + stg->sendmsg_ns = timestamp; + nr_snd += 1; + return 0; +} + +SEC("sockops") +int skops_sockopt(struct bpf_sock_ops *skops) +{ + struct bpf_sock *bpf_sk = skops->sk; + const struct sock *sk; + + if (!bpf_sk) + return 1; + + sk = (struct sock *)bpf_skc_to_tcp_sock(bpf_sk); + if (!sk) + return 1; + + switch (skops->op) { + case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: + nr_active += !bpf_test_sockopt(skops, sk); + break; + case BPF_SOCK_OPS_TS_SND_CB: + if (bpf_test_delay(skops, sk)) + nr_snd += 1; + break; + case BPF_SOCK_OPS_TS_SCHED_OPT_CB: + if (bpf_test_delay(skops, sk)) + nr_sched += 1; + break; + case BPF_SOCK_OPS_TS_SW_OPT_CB: + if (bpf_test_delay(skops, sk)) + nr_txsw += 1; + break; + case BPF_SOCK_OPS_TS_ACK_OPT_CB: + if (bpf_test_delay(skops, sk)) + nr_ack += 1; + break; + } + + return 1; +} + +char _license[] SEC("license") = "GPL";