From: Alex Elder <elder@inktank.com>
To: ceph-devel@vger.kernel.org
Subject: [PATCH 1/4] libceph: use cursor for bio reads
Date: Tue, 12 Mar 2013 20:05:18 -0500 [thread overview]
Message-ID: <513FD0CE.6000800@inktank.com> (raw)
In-Reply-To: <513FD092.2030106@inktank.com>
Replace the use of the information in con->in_msg_pos for incoming
bio data. The old in_msg_pos and the new cursor mechanism do
basically the same thing, just slightly differently.
The main functional difference is that in_msg_pos keeps track of the
length of the complete bio list, and assumed it was fully consumed
when that many bytes had been transferred. The cursor does not assume
a length, it simply consumes all bytes in the bio list. Because the
only user of bio data is the rbd client, and because the length of a
bio list provided by rbd client always matches the number of bytes
in the list, both ways of tracking length are equivalent.
In addition, for in_msg_pos the initial bio vector is selected as
the initial value of the bio->bi_idx, while the cursor assumes this
is zero. Again, the rbd client always passes 0 as the initial index
so the effect is the same.
Other than that, they basically match:
in_msg_pos cursor
---------- ------
bio_iter bio
bio_seg vec_index
page_pos page_offset
The in_msg_pos field is initialized by a call to init_bio_iter().
The bio cursor is initialized by ceph_msg_data_cursor_init().
Both now happen in the same spot, in prepare_message_data().
The in_msg_pos field is advanced by a call to in_msg_pos_next(),
which updates page_pos and calls iter_bio_next() to move to the next
bio vector, or to the next bio in the list. The cursor is advanced
by ceph_msg_data_advance(). That isn't currently happening so
add a call to that in in_msg_pos_next().
Finally, the next piece of data to use for a read is determined
by a bunch of lines in read_partial_message_bio(). Those can be
replaced by an equivalent ceph_msg_data_bio_next() call.
Since the read path has no need to know whether the next piece of a
bio to use is the last, allow it to pass a null pointer as its
last_piece argument to ceph_msg_data_bio_next().
This partially resolves:
http://tracker.ceph.com/issues/4428
Signed-off-by: Alex Elder <elder@inktank.com>
---
net/ceph/messenger.c | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index 07ace1d..1b003b4 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -1450,6 +1450,10 @@ static void in_msg_pos_next(struct
ceph_connection *con, size_t len,
msg_pos->data_pos += received;
msg_pos->page_pos += received;
+#ifdef CONFIG_BLOCK
+ if (ceph_msg_has_bio(msg))
+ (void) ceph_msg_data_advance(&msg->b, received);
+#endif /* CONFIG_BLOCK */
if (received < len)
return;
@@ -2225,23 +2229,14 @@ static int read_partial_message_bio(struct
ceph_connection *con,
unsigned int data_len, bool do_datacrc)
{
struct ceph_msg *msg = con->in_msg;
- struct ceph_msg_pos *msg_pos = &con->in_msg_pos;
- struct bio_vec *bv;
struct page *page;
size_t page_offset;
size_t length;
- unsigned int left;
int ret;
BUG_ON(!msg);
- BUG_ON(!msg->b.bio_iter);
- bv = bio_iovec_idx(msg->b.bio_iter, msg->b.bio_seg);
- page = bv->bv_page;
- page_offset = bv->bv_offset + msg_pos->page_pos;
- BUG_ON(msg_pos->data_pos >= data_len);
- left = data_len - msg_pos->data_pos;
- BUG_ON(msg_pos->page_pos >= bv->bv_len);
- length = min_t(unsigned int, bv->bv_len - msg_pos->page_pos, left);
+
+ page = ceph_msg_data_next(&msg->b, &page_offset, &length, NULL);
ret = ceph_tcp_recvpage(con->sock, page, page_offset, length);
if (ret <= 0)
--
1.7.9.5
next prev parent reply other threads:[~2013-03-13 1:05 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-13 1:04 [PATCH 0/4] libceph: use cursor for incoming data Alex Elder
2013-03-13 1:05 ` Alex Elder [this message]
2013-03-13 1:05 ` [PATCH 2/4] libceph: kill ceph message bio_iter, bio_seg Alex Elder
2013-03-13 1:05 ` [PATCH 3/4] libceph: use cursor for inbound data pages Alex Elder
2013-03-13 1:06 ` [PATCH 4/4] libceph: get rid of read helpers Alex Elder
2013-03-14 19:49 ` [PATCH 0/4] libceph: use cursor for incoming data Josh Durgin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=513FD0CE.6000800@inktank.com \
--to=elder@inktank.com \
--cc=ceph-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.