]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: kmap in messenger read path
authorSage Weil <sage@newdream.net>
Tue, 6 May 2008 18:32:10 +0000 (11:32 -0700)
committerSage Weil <sage@newdream.net>
Tue, 6 May 2008 18:55:38 +0000 (11:55 -0700)
src/kernel/addr.c
src/kernel/messenger.c
src/kernel/osd_client.c

index 26d5bc3e7fa833e0d9c71b028e70766dbc723492..bbdab12818bfafb832fcc118fb66f11105f4fbed 100644 (file)
@@ -19,26 +19,25 @@ static int ceph_readpage(struct file *filp, struct page *page)
        struct inode *inode = filp->f_dentry->d_inode;
        struct ceph_inode_info *ci = ceph_inode(inode);
        struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
-       void *kaddr;
        int err = 0;
 
        dout(10, "readpage inode %p file %p page %p index %lu\n",
             inode, filp, page, page->index);
-       kaddr = kmap(page);
        err = ceph_osdc_readpage(osdc, ceph_ino(inode), &ci->i_layout,
                                 page->index << PAGE_SHIFT, PAGE_SIZE, page);
-       if (err < 0)
+       if (unlikely(err < 0))
                goto out;
 
-       if (err < PAGE_CACHE_SIZE) {
+       if (unlikely(err < PAGE_CACHE_SIZE)) {
+               void *kaddr = kmap_atomic(page, KM_USER0);
                dout(10, "readpage zeroing tail %d bytes of page %p\n",
                     (int)PAGE_CACHE_SIZE - err, page);
                memset(kaddr + err, 0, PAGE_CACHE_SIZE - err);
+               kunmap_atomic(kaddr, KM_USER0);
        }
        SetPageUptodate(page);
 
 out:
-       kunmap(page);
        unlock_page(page);
        return err;
 }
@@ -85,7 +84,6 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
                        continue;
                }
                dout(10, "readpages adding page %p\n", page);
-               kunmap(page);
                flush_dcache_page(page);
                SetPageUptodate(page);
                unlock_page(page);
index beedaef63fdf0fd6171646b3c6b5297c5b7df3d4..78830e47d06c51fb078c1941e43538d8fc004798 100644 (file)
@@ -756,11 +756,10 @@ static int read_message_partial(struct ceph_connection *con)
                        con->in_tag = CEPH_MSGR_TAG_READY;
                        return 0;
                }
-               //p = kmap_atomic(m->pages[con->in_msg_pos.page], KM_USER1);
-               p = page_address(m->pages[con->in_msg_pos.page]);
+               p = kmap(m->pages[con->in_msg_pos.page]);
                ret = ceph_tcp_recvmsg(con->sock, p + con->in_msg_pos.page_pos,
                                       left);
-               //kunmap_atomic(p, KM_USER1);
+               kunmap(m->pages[con->in_msg_pos.page]);
                mutex_unlock(&m->page_mutex);
                if (ret <= 0)
                        return ret;
index 6599b97dca0cecd21db0616424d1aefb8abccf77..0889a4c35d4ad53ed0edf2086b6bb67ac377d903 100644 (file)
@@ -670,7 +670,7 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
        struct page *page;
        pgoff_t next_index;
        int contig_pages;
-       int rc;
+       int rc = 0;
 
        /*
         * for now, our strategy is simple: start with the
@@ -678,10 +678,9 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
         * we can that falls within the range specified by
         * nr_pages.
         */
-
        dout(10, "readpages on ino %llx on %llu~%llu\n", ino, off, len);
 
-       /* alloc request, w/ page vector */
+       /* alloc request, w/ optimistically-sized page vector */
        reqm = new_request_msg(osdc, CEPH_OSD_OP_READ);
        if (IS_ERR(reqm))
                return PTR_ERR(reqm);
@@ -696,7 +695,6 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
        contig_pages = 0;
        list_for_each_entry_reverse(page, page_list, lru) {
                if (page->index == next_index) {
-                       kmap(page);
                        req->r_pages[contig_pages] = page;
                        contig_pages++;
                        next_index++;
@@ -704,10 +702,8 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
                        break;
        }
        dout(10, "readpages found %d/%d contig\n", contig_pages, nr_pages);
-       if (contig_pages == 0) {
-               put_request(req);
-               return 0;
-       }
+       if (contig_pages == 0)
+               goto out;
        len = min((contig_pages << PAGE_CACHE_SHIFT) - (off & ~PAGE_CACHE_MASK),
                  len);
        dout(10, "readpages contig page extent is %llu~%llu\n", off, len);
@@ -715,13 +711,15 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
        /* request msg */
        len = calc_layout(osdc, ino, layout, off, len, req);
        req->r_nr_pages = calc_pages_for(off, len);
-
        dout(10, "readpages final extent is %llu~%llu -> %d pages\n",
             off, len, req->r_nr_pages);
-
        rc = do_request(osdc, req);
+
+out:
        put_request(req);
        dout(10, "readpages result %d\n", rc);
+       if (rc < 0)
+               dout(10, "hrm!\n");
        return rc;
 }