From nobody Sun Oct 5 09:06:19 2025 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.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 C2F1A288CAC for ; Wed, 6 Aug 2025 09:49:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754473745; cv=none; b=XZ5SncOnAt1wQJaImDouEpJT7jSZRseSTDFQZs/zgfuAmajGuH2i8Y3I1WUr0ENyOgZe1Oyb5y2YUr8MsQfy5JO203nEUYYXNTh+oR0jOmIYP20XXonoe2ElF4xbPY3gi/ZU40RFGm4Hz8ZnpuB5/3OWOlINxpiEwzf50B6+Jek= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754473745; c=relaxed/simple; bh=1YGQQ5oF6wdBoCReT6qqnw64tGjUt8KNamcQDHOlm4w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UXU5Wh31uBDLQyBnb3HrqQo8wDCWExQAyxDApgh8ozNsjlmkFdczEK1Ot2v+EPEiMpmsvCQZ20P54ZEElY0TcCchldbrWQUobwEtggaVtxBO4UdvtljfbD7k2DTfxDt3b5JYERHuqHSGjNBMyO7/jOCHC9SPPle9dUFSha6VN4Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=ionos.com; spf=pass smtp.mailfrom=ionos.com; dkim=pass (2048-bit key) header.d=ionos.com header.i=@ionos.com header.b=dQsZCbzJ; arc=none smtp.client-ip=209.85.218.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=ionos.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ionos.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ionos.com header.i=@ionos.com header.b="dQsZCbzJ" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-af922ab4849so971716766b.3 for ; Wed, 06 Aug 2025 02:49:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ionos.com; s=google; t=1754473741; x=1755078541; 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=GG5PLhncHW4/uYRe700ffa/jWZYkRzoUW2i3d4oIBMU=; b=dQsZCbzJHqZo7u04UFrtYYvgoy1+yQRVNu3jophpgQtf51al/f21p7l6ULmvJqnSKK 2NkiUZdOzcTZxnlZx1ZFYRa4oWeDXYhCkKjPKy089b3hFN0gZjHVWIf0rP4cM8eKygGj PkHKO24bca2x26gmgPcYe0c7H/ufamumM3aJOT0OvAc5so2b5wp3bPL3TzRlqt1noF+K AzzgshvACcvEaijCzj9RwcsIVRMcmt2/Kfl06/qHYtktKQyP+/zMGQcOhbO1taKiHQrg 5Rlk2YOjdnKmKefXZUKK16q1pHLzIb1rupH0BKHG++ND9/T5GM8Kje2qKhwqz/ktioq5 J/MQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754473741; x=1755078541; 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=GG5PLhncHW4/uYRe700ffa/jWZYkRzoUW2i3d4oIBMU=; b=lcdO3RtElINnZaKchRhGXN77zs6Zr7IvytPHWjaJZMffMbZWMFTo3yGNd1U0QonZBg 9NuPMVx0dgtAtq3ja+ZOiK5HKYaHACtQpIubMUw4T1pHHLYbqL7cwB9v3iuLa1gZgaxJ 50nvqJ/M+jLPPo+WzNo/BrrGONV3BsKCv2D00ntL+dASX7xs56OfvqdiX3d6OpI5JrSX J1nFOgfo7w9ER2LTp0eaNPNvo6y9xb/6JlrM54fnz3/epk1DEzg7/b26KRkh/OKjHS0L m7klM07wL8FFN9mk8YZCXb+aUqY9IgjHjOgMDg/WOo22S7gvRy4XU7n8p2A3387uw9oK dctQ== X-Forwarded-Encrypted: i=1; AJvYcCWEprvWTWYRp1Uai00PxXqAt0qvbZB6F4a6Cp/czp0DAmKhLKhbzelpXEuRVjpfT0MzW1decAQsGXaJ5FI=@vger.kernel.org X-Gm-Message-State: AOJu0YwulEzgAJRSYXVoSpmBUK8YVWAeg9iWfVv3WNChWy1UIPs10iNO n3Qf4KNsEkMxsztNOMtTRxgcvWxd9kphLN2QID2Kh9gAwL1OpR3vWrk8w1RxDvqdBwM= X-Gm-Gg: ASbGnctjBeiWBV2lHKz9b0lWo5DnOaKjY4mh9lqyKCD5INKOKWz7PtyNUnJbru/LLqc XwXmJnn5K7KCstLUB2v31Ghi7qT2+zFa1SOmslct/bc7tlbpUMkaNFPeeKe5FhRF9lCUybvdJny 0K51BJXqRHiFYuCPujn7lia3OFEOuoUka8AiJe30o6w6s+3hCTH9B4Jizk1HcNWi59mfd4bzU0s 4c9vO8P1p52QH3w1/EyeofEekVayWdIgFi2eEiNaxO4mf2xDGSPZLOV7Cc6Pt1iqgKgp1YIRM5I EkRv61SovlULYzw/+HOtiPTpUI+FCwmMn7b9dtbIkzS5fXblSs52KeDGSR8xP5YfVG0do1HfVIC Nl7FYWbW6KKqouNG/oKtK7bvdQOADrG3pE5YNaAZ85ugHzAuUxBi2PbCjhhFk4hSAvpN3ZX980Q sfCrEK4yZq9KOEfD7VAGMBag== X-Google-Smtp-Source: AGHT+IEXaSar5Vg+LOV4tJVM3fSmFUEov8B5F8P/UBBCyNn8SgY7LaRxMuVf+6MM4Sqi4/YSucIRwA== X-Received: by 2002:a17:907:3f99:b0:ae3:c767:da11 with SMTP id a640c23a62f3a-af990463606mr179892866b.50.1754473740927; Wed, 06 Aug 2025 02:49:00 -0700 (PDT) Received: from raven.intern.cm-ag (p200300dc6f12d500023064fffe740809.dip0.t-ipconnect.de. [2003:dc:6f12:d500:230:64ff:fe74:809]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-615a8f00247sm10139093a12.9.2025.08.06.02.49.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Aug 2025 02:49:00 -0700 (PDT) From: Max Kellermann To: xiubli@redhat.com, idryomov@gmail.com, amarkuze@redhat.com, ceph-devel@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Max Kellermann Subject: [PATCH 1/3] net/ceph/messenger: ceph_con_get_out_msg() returns the message pointer Date: Wed, 6 Aug 2025 11:48:53 +0200 Message-ID: <20250806094855.268799-2-max.kellermann@ionos.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250806094855.268799-1-max.kellermann@ionos.com> References: <20250806094855.268799-1-max.kellermann@ionos.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The caller in messenger_v1.c loads it anyway, so let's keep the pointer in the register instead of reloading it from memory. This eliminates a tiny bit of unnecessary overhead. Signed-off-by: Max Kellermann Reviewed-by: Viacheslav Dubeyko Tested-by: Viacheslav Dubeyko --- include/linux/ceph/messenger.h | 2 +- net/ceph/messenger.c | 4 ++-- net/ceph/messenger_v1.c | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h index 1717cc57cdac..57fa70c6edfb 100644 --- a/include/linux/ceph/messenger.h +++ b/include/linux/ceph/messenger.h @@ -548,7 +548,7 @@ void ceph_addr_set_port(struct ceph_entity_addr *addr, = int p); void ceph_con_process_message(struct ceph_connection *con); int ceph_con_in_msg_alloc(struct ceph_connection *con, struct ceph_msg_header *hdr, int *skip); -void ceph_con_get_out_msg(struct ceph_connection *con); +struct ceph_msg *ceph_con_get_out_msg(struct ceph_connection *con); =20 /* messenger_v1.c */ int ceph_con_v1_try_read(struct ceph_connection *con); diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index d1b5705dc0c6..7ab2176b977e 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -2109,7 +2109,7 @@ int ceph_con_in_msg_alloc(struct ceph_connection *con, return ret; } =20 -void ceph_con_get_out_msg(struct ceph_connection *con) +struct ceph_msg *ceph_con_get_out_msg(struct ceph_connection *con) { struct ceph_msg *msg; =20 @@ -2140,7 +2140,7 @@ void ceph_con_get_out_msg(struct ceph_connection *con) * message or in case of a fault. */ WARN_ON(con->out_msg); - con->out_msg =3D ceph_msg_get(msg); + return con->out_msg =3D ceph_msg_get(msg); } =20 /* diff --git a/net/ceph/messenger_v1.c b/net/ceph/messenger_v1.c index 0cb61c76b9b8..eebe4e19d75a 100644 --- a/net/ceph/messenger_v1.c +++ b/net/ceph/messenger_v1.c @@ -210,8 +210,7 @@ static void prepare_write_message(struct ceph_connectio= n *con) &con->v1.out_temp_ack); } =20 - ceph_con_get_out_msg(con); - m =3D con->out_msg; + m =3D ceph_con_get_out_msg(con); =20 dout("prepare_write_message %p seq %lld type %d len %d+%d+%zd\n", m, con->out_seq, le16_to_cpu(m->hdr.type), --=20 2.47.2 From nobody Sun Oct 5 09:06:19 2025 Received: from mail-ej1-f68.google.com (mail-ej1-f68.google.com [209.85.218.68]) (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 ACFD9EAF9 for ; Wed, 6 Aug 2025 09:49:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754473747; cv=none; b=s/uVqFIGkVNOYW7zrzWE/SR6BvNwlgoeU8xnoMi/tIkQq7Qfdm3eONM5MtnRmjwcWqWt32F4uoqoIE3jyluJYNxc5NdAdv0VqtF4dNB2obgiuk10tym8dNyaZJUcsxLPxPIsgM5NhxSritG+sUBjcFAFzvUyfzUAI0GYqXykSBQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754473747; c=relaxed/simple; bh=KuPqiPkzpuEgpSTW5Lw965/HuKo2hxH4/HmhS9Ztj/0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=H/iK8W9aO8rSJXiBZkT7HMcNEeLOAkklHH4AV1/p+Z/7NuNfZvXFZTskzhD0pybD/0y8ryhUbC1+/wn4YD9e/129k3CqiImzSL2CGdHMiYCxFvFytDk4N7wfvqebmj2ljQmjVyzVRzvUZfqZLYLUlTnebQESn+LkRtdCB/dfONw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=ionos.com; spf=pass smtp.mailfrom=ionos.com; dkim=pass (2048-bit key) header.d=ionos.com header.i=@ionos.com header.b=Y31hDOo+; arc=none smtp.client-ip=209.85.218.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=ionos.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ionos.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ionos.com header.i=@ionos.com header.b="Y31hDOo+" Received: by mail-ej1-f68.google.com with SMTP id a640c23a62f3a-af90fd52147so985604966b.3 for ; Wed, 06 Aug 2025 02:49:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ionos.com; s=google; t=1754473742; x=1755078542; 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=Mq5ixE05IMWfqlj1BPAwhSO/PR5iAWhaNwuEsAaJEgc=; b=Y31hDOo+oHJyz99J1MnouJ35ubzUcocvYz4agraaMmfPCLZrFJ8rZZ/UU9OEn7n0Ib nF3ZTzYVbxmWTTWekUZjlAqr+LtrIz0/ZE2kHHfuo+Nv8oSPENtrbyx5HOOofpF0Da2b a+8crH7r+hQTY66/+p/4FEmrXIPWOQL6nY76Q8ttsw/Y8iEgNmiATCRj9ng424fhB3kd bYKIRSMLDQ56pZfE9wGnLBwLRYNrEUvLmwp54DZUw4T7WsZQ/vaW5K8JUor/FV41bc8x c1CKrYJrQix1EfEnEx7vfg9VgOd04YHc4P69kvscddZi4v6XQB72M8nMa3TRhlS7dvO+ mWfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754473742; x=1755078542; 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=Mq5ixE05IMWfqlj1BPAwhSO/PR5iAWhaNwuEsAaJEgc=; b=aw2Ieg1M8SPXvz/q+hQM5a2x5/H8BOKRwis8Fd1HykeuOb/bPCXQwQsJ0XwJgzQHZK xK0xBRxCZwRvSuD3qj5zfj6qi0oPCSurW7yy1gj27HGoYNK/qc8pfazVG+X1FC04HWaC uWf3xnRB1z+Cce3pXQLJJkpKWWfbL/26hen13CQO2IDM+nYcHxAttt+Lt2qUPyp9Jkuo fJMCltuMe2xMKoEnt4aq1tgzxSg0gLxfScbaNFEkweNhHMZH1Q0uPht5SXqwq1YAfD+X I7rNfuz/AZvs8TKnYwzVwKaY8VKiL3jxB6IcEYjb9uxRMaH2FMjKTBtP32AMrLpawsru hLrg== X-Forwarded-Encrypted: i=1; AJvYcCUPSCOkA62lMwxp37vvnUri8HU7S9f0mTJCaStDW2RXcAfb+BfIbSlp8GPOurwZJMXZQLnX+8PLyEINuY4=@vger.kernel.org X-Gm-Message-State: AOJu0YzONfIBTIUcU75sDXKkAyoiD0NgNETZ4avll+AAkjjpXX4YZ67N IIYsQAaxrkB1PFTSiKhgkdciFR7ldv8kJjRh8CWjD7xYLh46aKkfxiinHu/OOAdB8tRzTJ0P5oy qied9Dx6VIg== X-Gm-Gg: ASbGncvL4Y2VmlS/i/IsvRJtf2kJWbhsXLeGUd0i6ZVG3dJFFWaXCw35wWDurGAE5bs mbC0DN97pfv0w+zxP3Z4PkW8l/5ROBt+vx8+roLPaBRZdlb8z1X5Mykxknm7JCEe1Rj5E1+eR0Z fdGKgjTjAQAc6AFwjKuT6BAwKAuSPBgKL1/dyRV9FWiBN4dKzy1RGN8txiyFnzxyB0zn4nF9qGa PPkO7hFtkWWKZx+4yH7rV5759dOI7Ds+h+/oKh2z2bMJgNW1BTbO/L43g19SbgrUvnLriwjxMS/ UIWVqYBLxPJCxzjpdFfYr3LAbnY8JI+GS2MIZVRmnTvc1KO8WxO/cvXw8re3T4c3OQ0KK5HrnWm yAEOf8prz/UKHSbz+NQkAkfYyqFP0/OjTnHyqbmTSsgf8hb+NoDiZ3Bs1URIbdNjXEC8hX3VTWR O+jRJbfGHTVb9PmlAffeublFWPlzBYBywW X-Google-Smtp-Source: AGHT+IHT1A999TTyOU0FT1zAlZBIgKdIFMNfoSGEWaaPRe+4qvlcIBx3SD7h6siEJfs9RZvQwvIlfQ== X-Received: by 2002:a17:907:9409:b0:af6:361a:eac0 with SMTP id a640c23a62f3a-af992b4c219mr156934966b.32.1754473741767; Wed, 06 Aug 2025 02:49:01 -0700 (PDT) Received: from raven.intern.cm-ag (p200300dc6f12d500023064fffe740809.dip0.t-ipconnect.de. [2003:dc:6f12:d500:230:64ff:fe74:809]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-615a8f00247sm10139093a12.9.2025.08.06.02.49.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Aug 2025 02:49:01 -0700 (PDT) From: Max Kellermann To: xiubli@redhat.com, idryomov@gmail.com, amarkuze@redhat.com, ceph-devel@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Max Kellermann Subject: [PATCH 2/3] net/ceph/messenger_v[12]: pass ceph_msg* instead of loading con->out_msg Date: Wed, 6 Aug 2025 11:48:54 +0200 Message-ID: <20250806094855.268799-3-max.kellermann@ionos.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250806094855.268799-1-max.kellermann@ionos.com> References: <20250806094855.268799-1-max.kellermann@ionos.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This pointer is in a register anyway, so let's use that instead of reloading from memory everywhere. Signed-off-by: Max Kellermann --- include/linux/ceph/messenger.h | 4 +- net/ceph/messenger.c | 4 +- net/ceph/messenger_v1.c | 43 +++++---- net/ceph/messenger_v2.c | 158 ++++++++++++++++----------------- 4 files changed, 102 insertions(+), 107 deletions(-) diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h index 57fa70c6edfb..585844a28237 100644 --- a/include/linux/ceph/messenger.h +++ b/include/linux/ceph/messenger.h @@ -553,7 +553,7 @@ struct ceph_msg *ceph_con_get_out_msg(struct ceph_conne= ction *con); /* messenger_v1.c */ int ceph_con_v1_try_read(struct ceph_connection *con); int ceph_con_v1_try_write(struct ceph_connection *con); -void ceph_con_v1_revoke(struct ceph_connection *con); +void ceph_con_v1_revoke(struct ceph_connection *con, struct ceph_msg *msg); void ceph_con_v1_revoke_incoming(struct ceph_connection *con); bool ceph_con_v1_opened(struct ceph_connection *con); void ceph_con_v1_reset_session(struct ceph_connection *con); @@ -562,7 +562,7 @@ void ceph_con_v1_reset_protocol(struct ceph_connection = *con); /* messenger_v2.c */ int ceph_con_v2_try_read(struct ceph_connection *con); int ceph_con_v2_try_write(struct ceph_connection *con); -void ceph_con_v2_revoke(struct ceph_connection *con); +void ceph_con_v2_revoke(struct ceph_connection *con, struct ceph_msg *msg); void ceph_con_v2_revoke_incoming(struct ceph_connection *con); bool ceph_con_v2_opened(struct ceph_connection *con); void ceph_con_v2_reset_session(struct ceph_connection *con); diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 7ab2176b977e..424fb2769b71 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -1792,9 +1792,9 @@ void ceph_msg_revoke(struct ceph_msg *msg) WARN_ON(con->state !=3D CEPH_CON_S_OPEN); dout("%s con %p msg %p was sending\n", __func__, con, msg); if (ceph_msgr2(from_msgr(con->msgr))) - ceph_con_v2_revoke(con); + ceph_con_v2_revoke(con, msg); else - ceph_con_v1_revoke(con); + ceph_con_v1_revoke(con, msg); ceph_msg_put(con->out_msg); con->out_msg =3D NULL; } else { diff --git a/net/ceph/messenger_v1.c b/net/ceph/messenger_v1.c index eebe4e19d75a..516f2eeb122a 100644 --- a/net/ceph/messenger_v1.c +++ b/net/ceph/messenger_v1.c @@ -169,10 +169,8 @@ static void prepare_message_data(struct ceph_msg *msg,= u32 data_len) * Prepare footer for currently outgoing message, and finish things * off. Assumes out_kvec* are already valid.. we just add on to the end. */ -static void prepare_write_message_footer(struct ceph_connection *con) +static void prepare_write_message_footer(struct ceph_connection *con, stru= ct ceph_msg *m) { - struct ceph_msg *m =3D con->out_msg; - m->footer.flags |=3D CEPH_MSG_FOOTER_COMPLETE; =20 dout("prepare_write_message_footer %p\n", con); @@ -230,31 +228,31 @@ static void prepare_write_message(struct ceph_connect= ion *con) =20 /* fill in hdr crc and finalize hdr */ crc =3D crc32c(0, &m->hdr, offsetof(struct ceph_msg_header, crc)); - con->out_msg->hdr.crc =3D cpu_to_le32(crc); - memcpy(&con->v1.out_hdr, &con->out_msg->hdr, sizeof(con->v1.out_hdr)); + m->hdr.crc =3D cpu_to_le32(crc); + memcpy(&con->v1.out_hdr, &m->hdr, sizeof(con->v1.out_hdr)); =20 /* fill in front and middle crc, footer */ crc =3D crc32c(0, m->front.iov_base, m->front.iov_len); - con->out_msg->footer.front_crc =3D cpu_to_le32(crc); + m->footer.front_crc =3D cpu_to_le32(crc); if (m->middle) { crc =3D crc32c(0, m->middle->vec.iov_base, m->middle->vec.iov_len); - con->out_msg->footer.middle_crc =3D cpu_to_le32(crc); + m->footer.middle_crc =3D cpu_to_le32(crc); } else - con->out_msg->footer.middle_crc =3D 0; + m->footer.middle_crc =3D 0; dout("%s front_crc %u middle_crc %u\n", __func__, - le32_to_cpu(con->out_msg->footer.front_crc), - le32_to_cpu(con->out_msg->footer.middle_crc)); - con->out_msg->footer.flags =3D 0; + le32_to_cpu(m->footer.front_crc), + le32_to_cpu(m->footer.middle_crc)); + m->footer.flags =3D 0; =20 /* is there a data payload? */ - con->out_msg->footer.data_crc =3D 0; + m->footer.data_crc =3D 0; if (m->data_length) { - prepare_message_data(con->out_msg, m->data_length); + prepare_message_data(m, m->data_length); con->v1.out_more =3D 1; /* data + footer will follow */ } else { /* no, queue up footer too and be done */ - prepare_write_message_footer(con); + prepare_write_message_footer(con, m); } =20 ceph_con_flag_set(con, CEPH_CON_F_WRITE_PENDING); @@ -461,9 +459,8 @@ static int write_partial_kvec(struct ceph_connection *c= on) * 0 -> socket full, but more to do * <0 -> error */ -static int write_partial_message_data(struct ceph_connection *con) +static int write_partial_message_data(struct ceph_connection *con, struct = ceph_msg *msg) { - struct ceph_msg *msg =3D con->out_msg; struct ceph_msg_data_cursor *cursor =3D &msg->cursor; bool do_datacrc =3D !ceph_test_opt(from_msgr(con->msgr), NOCRC); u32 crc; @@ -515,7 +512,7 @@ static int write_partial_message_data(struct ceph_conne= ction *con) else msg->footer.flags |=3D CEPH_MSG_FOOTER_NOCRC; con_out_kvec_reset(con); - prepare_write_message_footer(con); + prepare_write_message_footer(con, msg); =20 return 1; /* must return > 0 to indicate success */ } @@ -1471,6 +1468,7 @@ int ceph_con_v1_try_read(struct ceph_connection *con) */ int ceph_con_v1_try_write(struct ceph_connection *con) { + struct ceph_msg *msg; int ret =3D 1; =20 dout("try_write start %p state %d\n", con, con->state); @@ -1517,14 +1515,15 @@ int ceph_con_v1_try_write(struct ceph_connection *c= on) } =20 /* msg pages? */ - if (con->out_msg) { + msg =3D con->out_msg; + if (msg) { if (con->v1.out_msg_done) { - ceph_msg_put(con->out_msg); + ceph_msg_put(msg); con->out_msg =3D NULL; /* we're done with this one */ goto do_next; } =20 - ret =3D write_partial_message_data(con); + ret =3D write_partial_message_data(con, msg); if (ret =3D=3D 1) goto more; /* we need to send the footer, too! */ if (ret =3D=3D 0) @@ -1563,10 +1562,8 @@ int ceph_con_v1_try_write(struct ceph_connection *co= n) return ret; } =20 -void ceph_con_v1_revoke(struct ceph_connection *con) +void ceph_con_v1_revoke(struct ceph_connection *con, struct ceph_msg *msg) { - struct ceph_msg *msg =3D con->out_msg; - WARN_ON(con->v1.out_skip); /* footer */ if (con->v1.out_msg_done) { diff --git a/net/ceph/messenger_v2.c b/net/ceph/messenger_v2.c index 5483b4eed94e..90109fa0fe60 100644 --- a/net/ceph/messenger_v2.c +++ b/net/ceph/messenger_v2.c @@ -1589,10 +1589,10 @@ static int prepare_ack(struct ceph_connection *con) return prepare_control(con, FRAME_TAG_ACK, con->v2.out_buf, 8); } =20 -static void prepare_epilogue_plain(struct ceph_connection *con, bool abort= ed) +static void prepare_epilogue_plain(struct ceph_connection *con, struct cep= h_msg *msg, bool aborted) { dout("%s con %p msg %p aborted %d crcs %u %u %u\n", __func__, con, - con->out_msg, aborted, con->v2.out_epil.front_crc, + msg, aborted, con->v2.out_epil.front_crc, con->v2.out_epil.middle_crc, con->v2.out_epil.data_crc); =20 encode_epilogue_plain(con, aborted); @@ -1603,10 +1603,8 @@ static void prepare_epilogue_plain(struct ceph_conne= ction *con, bool aborted) * For "used" empty segments, crc is -1. For unused (trailing) * segments, crc is 0. */ -static void prepare_message_plain(struct ceph_connection *con) +static void prepare_message_plain(struct ceph_connection *con, struct ceph= _msg *msg) { - struct ceph_msg *msg =3D con->out_msg; - prepare_head_plain(con, con->v2.out_buf, sizeof(struct ceph_msg_header2), NULL, 0, false); =20 @@ -1647,7 +1645,7 @@ static void prepare_message_plain(struct ceph_connect= ion *con) con->v2.out_state =3D OUT_S_QUEUE_DATA; } else { con->v2.out_epil.data_crc =3D 0; - prepare_epilogue_plain(con, false); + prepare_epilogue_plain(con, msg, false); con->v2.out_state =3D OUT_S_FINISH_MESSAGE; } } @@ -1659,7 +1657,7 @@ static void prepare_message_plain(struct ceph_connect= ion *con) * allocate pages for the entire tail of the message (currently up * to ~32M) and two sgs arrays (up to ~256K each)... */ -static int prepare_message_secure(struct ceph_connection *con) +static int prepare_message_secure(struct ceph_connection *con, struct ceph= _msg *msg) { void *zerop =3D page_address(ceph_zero_page); struct sg_table enc_sgt =3D {}; @@ -1674,7 +1672,7 @@ static int prepare_message_secure(struct ceph_connect= ion *con) if (ret) return ret; =20 - tail_len =3D tail_onwire_len(con->out_msg, true); + tail_len =3D tail_onwire_len(msg, true); if (!tail_len) { /* * Empty message: once the head is written, @@ -1685,7 +1683,7 @@ static int prepare_message_secure(struct ceph_connect= ion *con) } =20 encode_epilogue_secure(con, false); - ret =3D setup_message_sgs(&sgt, con->out_msg, zerop, zerop, zerop, + ret =3D setup_message_sgs(&sgt, msg, zerop, zerop, zerop, &con->v2.out_epil, NULL, 0, false); if (ret) goto out; @@ -1714,7 +1712,7 @@ static int prepare_message_secure(struct ceph_connect= ion *con) goto out; =20 dout("%s con %p msg %p sg_cnt %d enc_page_cnt %d\n", __func__, con, - con->out_msg, sgt.orig_nents, enc_page_cnt); + msg, sgt.orig_nents, enc_page_cnt); con->v2.out_state =3D OUT_S_QUEUE_ENC_PAGE; =20 out: @@ -1723,19 +1721,19 @@ static int prepare_message_secure(struct ceph_conne= ction *con) return ret; } =20 -static int prepare_message(struct ceph_connection *con) +static int prepare_message(struct ceph_connection *con, struct ceph_msg *m= sg) { int lens[] =3D { sizeof(struct ceph_msg_header2), - front_len(con->out_msg), - middle_len(con->out_msg), - data_len(con->out_msg) + front_len(msg), + middle_len(msg), + data_len(msg) }; struct ceph_frame_desc desc; int ret; =20 dout("%s con %p msg %p logical %d+%d+%d+%d\n", __func__, con, - con->out_msg, lens[0], lens[1], lens[2], lens[3]); + msg, lens[0], lens[1], lens[2], lens[3]); =20 if (con->in_seq > con->in_seq_acked) { dout("%s con %p in_seq_acked %llu -> %llu\n", __func__, con, @@ -1746,15 +1744,15 @@ static int prepare_message(struct ceph_connection *= con) reset_out_kvecs(con); init_frame_desc(&desc, FRAME_TAG_MESSAGE, lens, 4); encode_preamble(&desc, con->v2.out_buf); - fill_header2(CTRL_BODY(con->v2.out_buf), &con->out_msg->hdr, + fill_header2(CTRL_BODY(con->v2.out_buf), &msg->hdr, con->in_seq_acked); =20 if (con_secure(con)) { - ret =3D prepare_message_secure(con); + ret =3D prepare_message_secure(con, msg); if (ret) return ret; } else { - prepare_message_plain(con); + prepare_message_plain(con, msg); } =20 ceph_con_flag_set(con, CEPH_CON_F_WRITE_PENDING); @@ -3184,20 +3182,20 @@ int ceph_con_v2_try_read(struct ceph_connection *co= n) } } =20 -static void queue_data(struct ceph_connection *con) +static void queue_data(struct ceph_connection *con, struct ceph_msg *msg) { struct bio_vec bv; =20 con->v2.out_epil.data_crc =3D -1; - ceph_msg_data_cursor_init(&con->v2.out_cursor, con->out_msg, - data_len(con->out_msg)); + ceph_msg_data_cursor_init(&con->v2.out_cursor, msg, + data_len(msg)); =20 get_bvec_at(&con->v2.out_cursor, &bv); set_out_bvec(con, &bv, true); con->v2.out_state =3D OUT_S_QUEUE_DATA_CONT; } =20 -static void queue_data_cont(struct ceph_connection *con) +static void queue_data_cont(struct ceph_connection *con, struct ceph_msg *= msg) { struct bio_vec bv; =20 @@ -3218,7 +3216,7 @@ static void queue_data_cont(struct ceph_connection *c= on) * we are done. */ reset_out_kvecs(con); - prepare_epilogue_plain(con, false); + prepare_epilogue_plain(con, msg, false); con->v2.out_state =3D OUT_S_FINISH_MESSAGE; } =20 @@ -3250,7 +3248,7 @@ static void queue_enc_page(struct ceph_connection *co= n) con->v2.out_state =3D OUT_S_FINISH_MESSAGE; } =20 -static void queue_zeros(struct ceph_connection *con) +static void queue_zeros(struct ceph_connection *con, struct ceph_msg *msg) { dout("%s con %p out_zero %d\n", __func__, con, con->v2.out_zero); =20 @@ -3267,7 +3265,7 @@ static void queue_zeros(struct ceph_connection *con) * Once it's written, we are done patching up for the revoke. */ reset_out_kvecs(con); - prepare_epilogue_plain(con, true); + prepare_epilogue_plain(con, msg, true); con->v2.out_state =3D OUT_S_FINISH_MESSAGE; } =20 @@ -3309,18 +3307,18 @@ static int populate_out_iter(struct ceph_connection= *con) switch (con->v2.out_state) { case OUT_S_QUEUE_DATA: WARN_ON(!con->out_msg); - queue_data(con); + queue_data(con, con->out_msg); goto populated; case OUT_S_QUEUE_DATA_CONT: WARN_ON(!con->out_msg); - queue_data_cont(con); + queue_data_cont(con, con->out_msg); goto populated; case OUT_S_QUEUE_ENC_PAGE: queue_enc_page(con); goto populated; case OUT_S_QUEUE_ZEROS: WARN_ON(con->out_msg); /* revoked */ - queue_zeros(con); + queue_zeros(con, con->out_msg); goto populated; case OUT_S_FINISH_MESSAGE: finish_message(con); @@ -3340,8 +3338,8 @@ static int populate_out_iter(struct ceph_connection *= con) return ret; } } else if (!list_empty(&con->out_queue)) { - ceph_con_get_out_msg(con); - ret =3D prepare_message(con); + struct ceph_msg *msg =3D ceph_con_get_out_msg(con); + ret =3D prepare_message(con, msg); if (ret) { pr_err("prepare_message failed: %d\n", ret); return ret; @@ -3453,17 +3451,17 @@ static u32 crc32c_zeros(u32 crc, int zero_len) return crc; } =20 -static void prepare_zero_front(struct ceph_connection *con, int resid) +static void prepare_zero_front(struct ceph_connection *con, struct ceph_ms= g *msg, int resid) { int sent; =20 - WARN_ON(!resid || resid > front_len(con->out_msg)); - sent =3D front_len(con->out_msg) - resid; + WARN_ON(!resid || resid > front_len(msg)); + sent =3D front_len(msg) - resid; dout("%s con %p sent %d resid %d\n", __func__, con, sent, resid); =20 if (sent) { con->v2.out_epil.front_crc =3D - crc32c(-1, con->out_msg->front.iov_base, sent); + crc32c(-1, msg->front.iov_base, sent); con->v2.out_epil.front_crc =3D crc32c_zeros(con->v2.out_epil.front_crc, resid); } else { @@ -3474,17 +3472,17 @@ static void prepare_zero_front(struct ceph_connecti= on *con, int resid) out_zero_add(con, resid); } =20 -static void prepare_zero_middle(struct ceph_connection *con, int resid) +static void prepare_zero_middle(struct ceph_connection *con, struct ceph_m= sg *msg, int resid) { int sent; =20 - WARN_ON(!resid || resid > middle_len(con->out_msg)); - sent =3D middle_len(con->out_msg) - resid; + WARN_ON(!resid || resid > middle_len(msg)); + sent =3D middle_len(msg) - resid; dout("%s con %p sent %d resid %d\n", __func__, con, sent, resid); =20 if (sent) { con->v2.out_epil.middle_crc =3D - crc32c(-1, con->out_msg->middle->vec.iov_base, sent); + crc32c(-1, msg->middle->vec.iov_base, sent); con->v2.out_epil.middle_crc =3D crc32c_zeros(con->v2.out_epil.middle_crc, resid); } else { @@ -3495,61 +3493,61 @@ static void prepare_zero_middle(struct ceph_connect= ion *con, int resid) out_zero_add(con, resid); } =20 -static void prepare_zero_data(struct ceph_connection *con) +static void prepare_zero_data(struct ceph_connection *con, struct ceph_msg= *msg) { dout("%s con %p\n", __func__, con); - con->v2.out_epil.data_crc =3D crc32c_zeros(-1, data_len(con->out_msg)); - out_zero_add(con, data_len(con->out_msg)); + con->v2.out_epil.data_crc =3D crc32c_zeros(-1, data_len(msg)); + out_zero_add(con, data_len(msg)); } =20 -static void revoke_at_queue_data(struct ceph_connection *con) +static void revoke_at_queue_data(struct ceph_connection *con, struct ceph_= msg *msg) { int boundary; int resid; =20 - WARN_ON(!data_len(con->out_msg)); + WARN_ON(!data_len(msg)); WARN_ON(!iov_iter_is_kvec(&con->v2.out_iter)); resid =3D iov_iter_count(&con->v2.out_iter); =20 - boundary =3D front_len(con->out_msg) + middle_len(con->out_msg); + boundary =3D front_len(msg) + middle_len(msg); if (resid > boundary) { resid -=3D boundary; WARN_ON(resid > MESSAGE_HEAD_PLAIN_LEN); dout("%s con %p was sending head\n", __func__, con); - if (front_len(con->out_msg)) - prepare_zero_front(con, front_len(con->out_msg)); - if (middle_len(con->out_msg)) - prepare_zero_middle(con, middle_len(con->out_msg)); - prepare_zero_data(con); + if (front_len(msg)) + prepare_zero_front(con, msg, front_len(msg)); + if (middle_len(msg)) + prepare_zero_middle(con, msg, middle_len(msg)); + prepare_zero_data(con, msg); WARN_ON(iov_iter_count(&con->v2.out_iter) !=3D resid); con->v2.out_state =3D OUT_S_QUEUE_ZEROS; return; } =20 - boundary =3D middle_len(con->out_msg); + boundary =3D middle_len(msg); if (resid > boundary) { resid -=3D boundary; dout("%s con %p was sending front\n", __func__, con); - prepare_zero_front(con, resid); - if (middle_len(con->out_msg)) - prepare_zero_middle(con, middle_len(con->out_msg)); - prepare_zero_data(con); - queue_zeros(con); + prepare_zero_front(con, msg, resid); + if (middle_len(msg)) + prepare_zero_middle(con, msg, middle_len(msg)); + prepare_zero_data(con, msg); + queue_zeros(con, msg); return; } =20 WARN_ON(!resid); dout("%s con %p was sending middle\n", __func__, con); - prepare_zero_middle(con, resid); - prepare_zero_data(con); - queue_zeros(con); + prepare_zero_middle(con, msg, resid); + prepare_zero_data(con, msg); + queue_zeros(con, msg); } =20 -static void revoke_at_queue_data_cont(struct ceph_connection *con) +static void revoke_at_queue_data_cont(struct ceph_connection *con, struct = ceph_msg *msg) { int sent, resid; /* current piece of data */ =20 - WARN_ON(!data_len(con->out_msg)); + WARN_ON(!data_len(msg)); WARN_ON(!iov_iter_is_bvec(&con->v2.out_iter)); resid =3D iov_iter_count(&con->v2.out_iter); WARN_ON(!resid || resid > con->v2.out_bvec.bv_len); @@ -3568,10 +3566,10 @@ static void revoke_at_queue_data_cont(struct ceph_c= onnection *con) =20 con->v2.out_iter.count -=3D resid; out_zero_add(con, con->v2.out_cursor.total_resid); - queue_zeros(con); + queue_zeros(con, msg); } =20 -static void revoke_at_finish_message(struct ceph_connection *con) +static void revoke_at_finish_message(struct ceph_connection *con, struct c= eph_msg *msg) { int boundary; int resid; @@ -3579,39 +3577,39 @@ static void revoke_at_finish_message(struct ceph_co= nnection *con) WARN_ON(!iov_iter_is_kvec(&con->v2.out_iter)); resid =3D iov_iter_count(&con->v2.out_iter); =20 - if (!front_len(con->out_msg) && !middle_len(con->out_msg) && - !data_len(con->out_msg)) { + if (!front_len(msg) && !middle_len(msg) && + !data_len(msg)) { WARN_ON(!resid || resid > MESSAGE_HEAD_PLAIN_LEN); dout("%s con %p was sending head (empty message) - noop\n", __func__, con); return; } =20 - boundary =3D front_len(con->out_msg) + middle_len(con->out_msg) + + boundary =3D front_len(msg) + middle_len(msg) + CEPH_EPILOGUE_PLAIN_LEN; if (resid > boundary) { resid -=3D boundary; WARN_ON(resid > MESSAGE_HEAD_PLAIN_LEN); dout("%s con %p was sending head\n", __func__, con); - if (front_len(con->out_msg)) - prepare_zero_front(con, front_len(con->out_msg)); - if (middle_len(con->out_msg)) - prepare_zero_middle(con, middle_len(con->out_msg)); + if (front_len(msg)) + prepare_zero_front(con, msg, front_len(msg)); + if (middle_len(msg)) + prepare_zero_middle(con, msg, middle_len(msg)); con->v2.out_iter.count -=3D CEPH_EPILOGUE_PLAIN_LEN; WARN_ON(iov_iter_count(&con->v2.out_iter) !=3D resid); con->v2.out_state =3D OUT_S_QUEUE_ZEROS; return; } =20 - boundary =3D middle_len(con->out_msg) + CEPH_EPILOGUE_PLAIN_LEN; + boundary =3D middle_len(msg) + CEPH_EPILOGUE_PLAIN_LEN; if (resid > boundary) { resid -=3D boundary; dout("%s con %p was sending front\n", __func__, con); - prepare_zero_front(con, resid); - if (middle_len(con->out_msg)) - prepare_zero_middle(con, middle_len(con->out_msg)); + prepare_zero_front(con, msg, resid); + if (middle_len(msg)) + prepare_zero_middle(con, msg, middle_len(msg)); con->v2.out_iter.count -=3D CEPH_EPILOGUE_PLAIN_LEN; - queue_zeros(con); + queue_zeros(con, msg); return; } =20 @@ -3619,9 +3617,9 @@ static void revoke_at_finish_message(struct ceph_conn= ection *con) if (resid > boundary) { resid -=3D boundary; dout("%s con %p was sending middle\n", __func__, con); - prepare_zero_middle(con, resid); + prepare_zero_middle(con, msg, resid); con->v2.out_iter.count -=3D CEPH_EPILOGUE_PLAIN_LEN; - queue_zeros(con); + queue_zeros(con, msg); return; } =20 @@ -3629,7 +3627,7 @@ static void revoke_at_finish_message(struct ceph_conn= ection *con) dout("%s con %p was sending epilogue - noop\n", __func__, con); } =20 -void ceph_con_v2_revoke(struct ceph_connection *con) +void ceph_con_v2_revoke(struct ceph_connection *con, struct ceph_msg *msg) { WARN_ON(con->v2.out_zero); =20 @@ -3642,13 +3640,13 @@ void ceph_con_v2_revoke(struct ceph_connection *con) =20 switch (con->v2.out_state) { case OUT_S_QUEUE_DATA: - revoke_at_queue_data(con); + revoke_at_queue_data(con, msg); break; case OUT_S_QUEUE_DATA_CONT: - revoke_at_queue_data_cont(con); + revoke_at_queue_data_cont(con, msg); break; case OUT_S_FINISH_MESSAGE: - revoke_at_finish_message(con); + revoke_at_finish_message(con, msg); break; default: WARN(1, "bad out_state %d", con->v2.out_state); --=20 2.47.2 From nobody Sun Oct 5 09:06:19 2025 Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) (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 4431D21CC4E for ; Wed, 6 Aug 2025 09:49:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754473746; cv=none; b=Xxk1kPthxuRtPVE/yMCOxaa9ZQhv+n9wy5NZbg7dEJUHmJ3pqBs/yRL+6+WKxdCCrSDWVnlnRkkMDlXIeYN5ukNwrTI8oeoaahZGk9YyowfDDwVCUK6ZcurNtkLmMYBDsakRWrJPpxviWyI2mxQAgnuC73ekiwQztGeJANkFUKE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754473746; c=relaxed/simple; bh=OUNTpGpOyHEACCY3f52sli6ZIozk/y/E+v4cvUaJRQ8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RuFXWiAPjc/Q9hxB06LMHp3kgHOVOTNy/e6xmaCqDM6ddd96F4jn9VYkSWcYheDs4W5lqe++8R4fkMU4IdcY7hFi50cL9Z+o+ksqNSLAvMqIhXJNXfHTjPFh58JMqFpyP9RRKbF0kBOvPwxhP/TRCu2ZDWAKvSeEp6cDhm+RLPk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=ionos.com; spf=pass smtp.mailfrom=ionos.com; dkim=pass (2048-bit key) header.d=ionos.com header.i=@ionos.com header.b=P2FQjxdU; arc=none smtp.client-ip=209.85.208.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=ionos.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ionos.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ionos.com header.i=@ionos.com header.b="P2FQjxdU" Received: by mail-ed1-f47.google.com with SMTP id 4fb4d7f45d1cf-615c8ca53efso10898932a12.2 for ; Wed, 06 Aug 2025 02:49:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ionos.com; s=google; t=1754473742; x=1755078542; 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=3DlDihxHSTEJD5Q+/V0RYrSEM7+zdm1rlpG9EF1SpuY=; b=P2FQjxdUFLRRtCD7kDlfFpL9SaQ1KZqrswWj1VSPctb2X8Hk3oZh8RYy0ugr9uHAgc ClXu+HtKP5nMkKe+SH5qvKA/CpwZ4suk3q/55g6bQbW7LfGT6EpdXOK7SV26VuSU6lVe Ctr11lVOt+FMWGZUrPKIPbGWpAJzBEqBAG2uS3ROrsKhnCzJYvPuG0UcHlR8Z5BhKiel rg/oXUAA6OcEbm0KiLKwBcUkiLObZ8tkAMSRoIZMVBFXKHd0pjLHUQHUuqy/3MDVS39G cOAHhnSfDNPR6wPQZ77nSFiOQflY5z5WtEvJSOOpF4aChD829rZyWjUXJRA0lKqIMEEP SnjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754473742; x=1755078542; 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=3DlDihxHSTEJD5Q+/V0RYrSEM7+zdm1rlpG9EF1SpuY=; b=PwAj/32YhDsL9Z48TMfJ190hf5rNqKhTyyCoSc/4hRRiSwbmJsivo9njv2Ud/wQS/q v6ODERzxPRLiE7biPH+0byboDYUhYLbRaGgrktcw1B0x6wwXWXI98h11jMsu9TMWsG8v M2u79Tfgfw/gPTu9FIs3kt0n52cAjupu+NK+VdceK4ZQEQZ0agTuwA6x3NcAoLVxQQrN 4lTXIAAuqgU3kYLwxrP9El/6xnjR6v4LlJwXVG+o2MVXYsGswdDPUV2qJRYK6UIOhNYc oVxYE3o0L9ahI6sWgNW8vWFcGNikTyJb4omYA4OyaOFlxc/MoGjaSXe8LBo/bRlXeqhJ f02w== X-Forwarded-Encrypted: i=1; AJvYcCXzgozFe8sj1Q8MDXs2JiIJ+oJ1SeqT5ndxy3uXWefjqriNEGh9wOgo/h3FvzqgZOK4nIEVPR7sLOBNExg=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6S60elTfy49Cu6qTEd2b2cPwXPmNO5YegzhH+xMUbq4URxczj /Fs2qEbrX3WLB/JuBnMitQcMI7ARkidgvW3GBdwFKLyuVco+HOldgDZZ47NCD0qa9fg= X-Gm-Gg: ASbGnct5QToKXU5UUpLl8hVotwHakZZIWY/a59wTvoNeXhmbwO356fyIy9vVBX/W6f5 20kD9cAK7ODRWic4Ya8sTlrBK+pjDbKPENqtkIomAJUfzPABfWdh5AxsxyGElKCIUABuRaOyn5+ JnCJ97SfJWSVqjoD+HVHaKh3PzBd/6OvDWatqaz8hOA/O6oALZX4E4c38eKLMzes24SEjaYfnrW eWbG3+1ZOsFHWMMTH99G8YMQlZBurSXLIVpCcLttSHOinANu6uFXQJYhheBVSpo+0MRdR3sKlpu ud0/atqJKraCYDRUMIHJqJg/Uo6xY2+2uxiClIbH1XBjeNJz4vtCk+sWapUCzrLny1bqK+KC8eC 5MJVZNrJEJqgR53nHHdX6DhB55+2Sk7rmw7QilcBaewLikFAMvho2dWfnUeQ+RZmpFPzqFd6DNo 1v8XZZFfs6ZS6TZjPHe975zQ== X-Google-Smtp-Source: AGHT+IHw49tgHJW7XSDygJR2NggxiIk7qwiHB6yykI13Vvyz+84jOeZsCm6cwy4/ZwWs/cmFRcBtTg== X-Received: by 2002:a05:6402:268a:b0:615:7047:4efd with SMTP id 4fb4d7f45d1cf-617960c735amr2019608a12.13.1754473742414; Wed, 06 Aug 2025 02:49:02 -0700 (PDT) Received: from raven.intern.cm-ag (p200300dc6f12d500023064fffe740809.dip0.t-ipconnect.de. [2003:dc:6f12:d500:230:64ff:fe74:809]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-615a8f00247sm10139093a12.9.2025.08.06.02.49.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Aug 2025 02:49:02 -0700 (PDT) From: Max Kellermann To: xiubli@redhat.com, idryomov@gmail.com, amarkuze@redhat.com, ceph-devel@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Max Kellermann Subject: [PATCH 3/3] net/ceph/messenger: add empty check to ceph_con_get_out_msg() Date: Wed, 6 Aug 2025 11:48:55 +0200 Message-ID: <20250806094855.268799-4-max.kellermann@ionos.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250806094855.268799-1-max.kellermann@ionos.com> References: <20250806094855.268799-1-max.kellermann@ionos.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This moves the list_empty() checks from the two callers (v1 and v2) into the base messenger.c library. Now the v1/v2 specializations do not need to know about con->out_queue; that implementation detail is now hidden behind the ceph_con_get_out_msg() function. Signed-off-by: Max Kellermann --- net/ceph/messenger.c | 4 +++- net/ceph/messenger_v1.c | 15 ++++++++++----- net/ceph/messenger_v2.c | 4 ++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 424fb2769b71..8886c38a55d2 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -2113,7 +2113,9 @@ struct ceph_msg *ceph_con_get_out_msg(struct ceph_con= nection *con) { struct ceph_msg *msg; =20 - BUG_ON(list_empty(&con->out_queue)); + if (list_empty(&con->out_queue)) + return NULL; + msg =3D list_first_entry(&con->out_queue, struct ceph_msg, list_head); WARN_ON(msg->con !=3D con); =20 diff --git a/net/ceph/messenger_v1.c b/net/ceph/messenger_v1.c index 516f2eeb122a..5eb6cfdbc494 100644 --- a/net/ceph/messenger_v1.c +++ b/net/ceph/messenger_v1.c @@ -189,12 +189,18 @@ static void prepare_write_message_footer(struct ceph_= connection *con, struct cep =20 /* * Prepare headers for the next outgoing message. + * + * @return false if there are no outgoing messages */ -static void prepare_write_message(struct ceph_connection *con) +static bool prepare_write_message(struct ceph_connection *con) { struct ceph_msg *m; u32 crc; =20 + m =3D ceph_con_get_out_msg(con); + if (m =3D=3D NULL) + return false; + con_out_kvec_reset(con); con->v1.out_msg_done =3D false; =20 @@ -208,8 +214,6 @@ static void prepare_write_message(struct ceph_connectio= n *con) &con->v1.out_temp_ack); } =20 - m =3D ceph_con_get_out_msg(con); - dout("prepare_write_message %p seq %lld type %d len %d+%d+%zd\n", m, con->out_seq, le16_to_cpu(m->hdr.type), le32_to_cpu(m->hdr.front_len), le32_to_cpu(m->hdr.middle_len), @@ -256,6 +260,8 @@ static void prepare_write_message(struct ceph_connectio= n *con) } =20 ceph_con_flag_set(con, CEPH_CON_F_WRITE_PENDING); + + return true; } =20 /* @@ -1543,8 +1549,7 @@ int ceph_con_v1_try_write(struct ceph_connection *con) goto more; } /* is anything else pending? */ - if (!list_empty(&con->out_queue)) { - prepare_write_message(con); + if (prepare_write_message(con)) { goto more; } if (con->in_seq > con->in_seq_acked) { diff --git a/net/ceph/messenger_v2.c b/net/ceph/messenger_v2.c index 90109fa0fe60..e0b5f2e2582d 100644 --- a/net/ceph/messenger_v2.c +++ b/net/ceph/messenger_v2.c @@ -3292,6 +3292,7 @@ static void finish_message(struct ceph_connection *co= n) =20 static int populate_out_iter(struct ceph_connection *con) { + struct ceph_msg *msg; int ret; =20 dout("%s con %p state %d out_state %d\n", __func__, con, con->state, @@ -3337,8 +3338,7 @@ static int populate_out_iter(struct ceph_connection *= con) pr_err("prepare_keepalive2 failed: %d\n", ret); return ret; } - } else if (!list_empty(&con->out_queue)) { - struct ceph_msg *msg =3D ceph_con_get_out_msg(con); + } else if ((msg =3D ceph_con_get_out_msg(con)) !=3D NULL) { ret =3D prepare_message(con, msg); if (ret) { pr_err("prepare_message failed: %d\n", ret); --=20 2.47.2