Whamcloud - gitweb
LU-13309 osd-ldiskfs: speedup osd_bufs_get/put 86/37786/4
authorAndrew Perepechko <c17827@cray.com>
Fri, 28 Feb 2020 15:53:16 +0000 (18:53 +0300)
committerOleg Drokin <green@whamcloud.com>
Tue, 14 Apr 2020 08:10:22 +0000 (08:10 +0000)
Let's remove useless page processing
in osd_get_put/osd_put_page that affects regular I/O
in non-cached mode.

Change-Id: I1972cfdec940f104c1d66e1b1ffb4faa6007929b
Signed-off-by: Andrew Perepechko <c17827@cray.com>
Cray-bug-id: LUS-8004
Reviewed-on: https://review.whamcloud.com/37786
Reviewed-by: Alexander Boyko <alexander.boyko@hpe.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osd-ldiskfs/osd_handler.c
lustre/osd-ldiskfs/osd_io.c

index c083434..4c3bfd6 100644 (file)
@@ -7396,8 +7396,14 @@ static void osd_key_fini(const struct lu_context *ctx,
        if (info->oti_dio_pages) {
                int i;
                for (i = 0; i < PTLRPC_MAX_BRW_PAGES; i++) {
-                       if (info->oti_dio_pages[i])
-                               __free_page(info->oti_dio_pages[i]);
+                       struct page *page = info->oti_dio_pages[i];
+                       if (page) {
+                               LASSERT(PagePrivate2(page));
+                               LASSERT(PageLocked(page));
+                               ClearPagePrivate2(page);
+                               unlock_page(page);
+                               __free_page(page);
+                       }
                }
                OBD_FREE(info->oti_dio_pages,
                         sizeof(struct page *) * PTLRPC_MAX_BRW_PAGES);
index 34090a8..ce2af33 100644 (file)
@@ -666,10 +666,12 @@ static struct page *osd_get_page(const struct lu_env *env, struct dt_object *dt,
                page = find_or_create_page(inode->i_mapping,
                                           offset >> PAGE_SHIFT, gfp_mask);
 
-               if (likely(page))
-                       LASSERT(!test_bit(PG_private_2, &page->flags));
-               else
+               if (likely(page)) {
+                       LASSERT(!PagePrivate2(page));
+                       wait_on_page_writeback(page);
+               } else {
                        lprocfs_counter_add(d->od_stats, LPROC_OSD_NO_PAGE, 1);
+               }
 
                return page;
        }
@@ -678,34 +680,29 @@ static struct page *osd_get_page(const struct lu_env *env, struct dt_object *dt,
                /* consult with pagecache, but do not create new pages */
                /* this is normally used once */
                page = find_lock_page(inode->i_mapping, offset >> PAGE_SHIFT);
-               if (page)
+               if (page) {
+                       wait_on_page_writeback(page);
                        return page;
+               }
        }
 
        LASSERT(oti->oti_dio_pages);
        cur = oti->oti_dio_pages_used;
+       page = oti->oti_dio_pages[cur];
 
-       if (unlikely(!oti->oti_dio_pages[cur])) {
+       if (unlikely(!page)) {
                LASSERT(cur < PTLRPC_MAX_BRW_PAGES);
                page = alloc_page(gfp_mask);
                if (!page)
                        return NULL;
                oti->oti_dio_pages[cur] = page;
+               SetPagePrivate2(page);
+               lock_page(page);
        }
 
-       page = oti->oti_dio_pages[cur];
-       LASSERT(!test_bit(PG_private_2, &page->flags));
-       set_bit(PG_private_2, &page->flags);
-       oti->oti_dio_pages_used++;
-
-       LASSERT(!PageLocked(page));
-       lock_page(page);
-
-       LASSERT(!page->mapping);
-       LASSERT(!PageWriteback(page));
        ClearPageUptodate(page);
-
        page->index = offset >> PAGE_SHIFT;
+       oti->oti_dio_pages_used++;
 
        return page;
 }
@@ -758,11 +755,7 @@ static int osd_bufs_put(const struct lu_env *env, struct dt_object *dt,
 
                /* if the page isn't cached, then reset uptodate
                 * to prevent reuse */
-               if (test_bit(PG_private_2, &page->flags)) {
-                       clear_bit(PG_private_2, &page->flags);
-                       ClearPageUptodate(page);
-                       if (lnb[i].lnb_locked)
-                               unlock_page(page);
+               if (PagePrivate2(page)) {
                        oti->oti_dio_pages_used--;
                } else {
                        if (lnb[i].lnb_locked)
@@ -880,8 +873,6 @@ bypass_checks:
                        GOTO(cleanup, rc = -ENOMEM);
 
                lnb->lnb_locked = 1;
-               wait_on_page_writeback(lnb->lnb_page);
-               BUG_ON(PageWriteback(lnb->lnb_page));
        }
 
 #if 0
@@ -1323,9 +1314,11 @@ static int osd_write_commit(const struct lu_env *env, struct dt_object *dt,
                for (i = 0; i < npages; i++) {
                        if (lnb[i].lnb_page == NULL)
                                continue;
-                       LASSERT(PageLocked(lnb[i].lnb_page));
-                       generic_error_remove_page(inode->i_mapping,
-                                                 lnb[i].lnb_page);
+                       if (!PagePrivate2(lnb[i].lnb_page)) {
+                               LASSERT(PageLocked(lnb[i].lnb_page));
+                               generic_error_remove_page(inode->i_mapping,
+                                                         lnb[i].lnb_page);
+                       }
                }
        }
 
@@ -1408,7 +1401,8 @@ static int osd_read_prep(const struct lu_env *env, struct dt_object *dt,
                /* early release to let others read data during the bulk */
                for (i = 0; i < iobuf->dr_npages; i++) {
                        LASSERT(PageLocked(iobuf->dr_pages[i]));
-                       unlock_page(iobuf->dr_pages[i]);
+                       if (!PagePrivate2(iobuf->dr_pages[i]))
+                               unlock_page(iobuf->dr_pages[i]);
                }
        }