summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2018-11-14 12:24:01 +0100
committerIlya Dryomov <idryomov@gmail.com>2018-12-26 15:56:04 +0100
commit1f6b821aef78e3d79e8d598ae59fc7e23fb6c563 (patch)
tree0b40e4c8496c1d8648bf35db04f7c4939795c3dc /net
parent0cab9f33d9c33f5ea94e5438fbc91bc8b7f48057 (diff)
downloadlinux-0-day-1f6b821aef78e3d79e8d598ae59fc7e23fb6c563.tar.gz
linux-0-day-1f6b821aef78e3d79e8d598ae59fc7e23fb6c563.tar.xz
libceph: drop last_piece logic from write_partial_message_data()
last_piece is for the last piece in the current data item, not in the entire data payload of the message. This is harmful for messages with multiple data items. On top of that, we don't need to signal the end of a data payload either because it is always followed by a footer. We used to signal "more" unconditionally, until commit fe38a2b67bc6 ("libceph: start defining message data cursor"). Part of a large series, it introduced cursor->last_piece and also mistakenly inverted the hint by passing last_piece for "more". This was corrected with commit c2cfa1940097 ("libceph: Fix ceph_tcp_sendpage()'s more boolean usage"). As it is, last_piece is not helping at all: because Nagle algorithm is disabled, for a simple message with two 512-byte data items we end up emitting three packets: front + first data item, second data item and footer. Go back to the original pre-fe38a2b67bc6 behavior -- a single packet in most cases. Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/messenger.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index 2f126eff275d5..cca96d32ac641 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -1592,7 +1592,6 @@ static int write_partial_message_data(struct ceph_connection *con)
struct page *page;
size_t page_offset;
size_t length;
- bool last_piece;
int ret;
if (!cursor->resid) {
@@ -1600,10 +1599,9 @@ static int write_partial_message_data(struct ceph_connection *con)
continue;
}
- page = ceph_msg_data_next(cursor, &page_offset, &length,
- &last_piece);
- ret = ceph_tcp_sendpage(con->sock, page, page_offset,
- length, !last_piece);
+ page = ceph_msg_data_next(cursor, &page_offset, &length, NULL);
+ ret = ceph_tcp_sendpage(con->sock, page, page_offset, length,
+ true);
if (ret <= 0) {
if (do_datacrc)
msg->footer.data_crc = cpu_to_le32(crc);