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 <max.kellermann@xxxxxxxxx> --- 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_connection *con) { struct ceph_msg *msg; - BUG_ON(list_empty(&con->out_queue)); + if (list_empty(&con->out_queue)) + return NULL; + msg = list_first_entry(&con->out_queue, struct ceph_msg, list_head); WARN_ON(msg->con != con); 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 /* * 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; + m = ceph_con_get_out_msg(con); + if (m == NULL) + return false; + con_out_kvec_reset(con); con->v1.out_msg_done = false; @@ -208,8 +214,6 @@ static void prepare_write_message(struct ceph_connection *con) &con->v1.out_temp_ack); } - m = 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_connection *con) } ceph_con_flag_set(con, CEPH_CON_F_WRITE_PENDING); + + return true; } /* @@ -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 *con) static int populate_out_iter(struct ceph_connection *con) { + struct ceph_msg *msg; int ret; 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 = ceph_con_get_out_msg(con); + } else if ((msg = ceph_con_get_out_msg(con)) != NULL) { ret = prepare_message(con, msg); if (ret) { pr_err("prepare_message failed: %d\n", ret); -- 2.47.2