From: Alex Elder <elder@inktank.com>
To: ceph-devel@vger.kernel.org
Subject: [PATCH 2/3] ceph: simplify ceph_sync_write() page_align calculation
Date: Mon, 04 Mar 2013 12:15:36 -0600 [thread overview]
Message-ID: <5134E4C8.4070601@inktank.com> (raw)
In-Reply-To: <5134E46C.9020402@inktank.com>
(This is being reposted. The first one had a problem because it
erroneously added a similar change elsewhere; that change has been
dropped.)
The next patch in this series points out that the calculation for
the number of pages in an osd request is getting done twice. It
is not obvious, but the result of both calculations is identical.
This patch simplifies one of them--as a separate step--to make
it clear that the transformation in the next patch is valid.
In ceph_sync_write() there is some magic that computes page_align
for an osd request. But a little analysis shows it can be
simplified.
First, we have:
io_align = pos & ~PAGE_MASK;
which is used here:
page_align = (pos - io_align + buf_align) & ~PAGE_MASK;
Note (pos - io_align) simply rounds "pos" down to the nearest multiple
of the page size.
We also have:
buf_align = (unsigned long)data & ~PAGE_MASK;
Adding buf_align to that rounded-down "pos" value will stay within
the same page; the result will just be offset by the page offset for
the "data" pointer. The final mask therefore leaves just the value
of "buf_align".
One more simplification. Note that the result of calc_pages_for()
is invariant of which page the offset starts in--the only thing that
matters is the offset within the starting page. We will have
put the proper page offset to use into "page_align", so just use
that in calculating num_pages.
This resolves:
http://tracker.ceph.com/issues/4166
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
---
fs/ceph/file.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 9c4325e..805678e 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -526,15 +526,10 @@ more:
io_align = pos & ~PAGE_MASK;
buf_align = (unsigned long)data & ~PAGE_MASK;
len = left;
- if (file->f_flags & O_DIRECT) {
- /* write from beginning of first page, regardless of
- io alignment */
- page_align = (pos - io_align + buf_align) & ~PAGE_MASK;
- num_pages = calc_pages_for((unsigned long)data, len);
- } else {
- page_align = pos & ~PAGE_MASK;
- num_pages = calc_pages_for(pos, len);
- }
+
+ /* write from beginning of first page, regardless of io alignment */
+ page_align = file->f_flags & O_DIRECT ? buf_align : io_align;
+ num_pages = calc_pages_for(page_align, len);
req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
ceph_vino(inode), pos, &len,
CEPH_OSD_OP_WRITE, flags,
--
1.7.9.5
next prev parent reply other threads:[~2013-03-04 18:15 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-04 18:05 OSD Data Read/Write Separation Patches Alex Elder
2013-03-04 18:08 ` [PATCH 0/3] libceph: a few cleanups Alex Elder
2013-03-04 18:09 ` [PATCH 1/3] libceph: use (void *) for untyped data in osd ops Alex Elder
2013-03-04 18:09 ` [PATCH 2/3] libceph: kill ceph_msg->pagelist_count Alex Elder
2013-03-04 18:09 ` [PATCH 3/3] libceph: rename ceph_calc_object_layout() Alex Elder
2013-03-05 1:49 ` [PATCH 0/3] libceph: a few cleanups Josh Durgin
2013-03-04 18:10 ` [PATCH 0/3] libceph: simplify incoming message allocation Alex Elder
2013-03-04 18:12 ` [PATCH 1/3] libceph: drop mutex while allocating a message Alex Elder
2013-03-04 19:07 ` Gregory Farnum
2013-03-04 19:25 ` Alex Elder
2013-03-04 19:39 ` Gregory Farnum
2013-03-04 19:52 ` Alex Elder
2013-03-04 18:12 ` [PATCH 2/3] libceph: define mds_alloc_msg() method Alex Elder
2013-03-04 19:05 ` Gregory Farnum
2013-03-04 19:37 ` Alex Elder
2013-03-04 18:12 ` [PATCH 3/3] libceph: no need for alignment for mds message Alex Elder
2013-03-04 19:09 ` Gregory Farnum
2013-03-04 18:14 ` [PATCH 0/3] ceph: assign message data fields consistently Alex Elder
2013-03-04 18:15 ` [PATCH 1/3] ceph: use calc_pages_for() in start_read() Alex Elder
2013-03-04 18:15 ` Alex Elder [this message]
2013-03-04 18:15 ` [PATCH 3/3] libceph: don't assign page info in ceph_osdc_new_request() Alex Elder
2013-03-05 1:55 ` [PATCH 0/3] ceph: assign message data fields consistently Josh Durgin
2013-03-04 18:16 ` [PATCH 0/3] libceph: distinguish osd request read and write data Alex Elder
2013-03-04 18:17 ` [PATCH 1/3] libceph: separate osd request data info Alex Elder
2013-03-05 2:13 ` Josh Durgin
2013-03-04 18:18 ` [PATCH 2/3] libceph: distinguish page and bio requests Alex Elder
2013-03-05 2:14 ` Josh Durgin
2013-03-04 18:18 ` [PATCH 3/3] libceph: separate read and write data Alex Elder
2013-03-05 2:15 ` 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=5134E4C8.4070601@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.