* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2016, Intel Corporation.
+ * Copyright (c) 2011, 2017, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <linux/pagemap.h>
/* current_is_kswapd() */
#include <linux/swap.h>
+#include <linux/task_io_accounting_ops.h>
#define DEBUG_SUBSYSTEM S_LLITE
io->ci_obj, ra.cra_end, page_idx);
/* update read ahead RPC size.
* NB: it's racy but doesn't matter */
- if (ras->ras_rpc_size > ra.cra_rpc_size &&
+ if (ras->ras_rpc_size != ra.cra_rpc_size &&
ra.cra_rpc_size > 0)
ras->ras_rpc_size = ra.cra_rpc_size;
/* trim it to align with optimal RPC size */
write_unlock(&fd->fd_lock);
}
-static int ll_io_read_page(const struct lu_env *env, struct cl_io *io,
+int ll_io_read_page(const struct lu_env *env, struct cl_io *io,
struct cl_page *page, struct file *file)
{
struct inode *inode = vvp_object_inode(page->cp_obj);
PFID(ll_inode2fid(inode)), rc2, vvp_index(vpg));
}
- if (queue->c2_qin.pl_nr > 0)
+ if (queue->c2_qin.pl_nr > 0) {
+ int count = queue->c2_qin.pl_nr;
rc = cl_io_submit_rw(env, io, CRT_READ, queue);
+ if (rc == 0)
+ task_io_account_read(PAGE_SIZE * count);
+ }
+
if (anchor != NULL && !cl_page_is_owned(page, io)) { /* have sent */
rc = cl_sync_io_wait(env, anchor, 0);
/* TODO: discard all pages until page reinit route is implemented */
cl_page_list_discard(env, io, &queue->c2_qin);
- /*
- * Unlock unsent pages in case of error.
- */
+ /* Unlock unsent read pages in case of error. */
cl_page_list_disown(env, io, &queue->c2_qin);
+
cl_2queue_fini(env, queue);
RETURN(rc);
struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
struct ll_readahead_state *ras = &fd->fd_ras;
struct lu_env *local_env = NULL;
+ unsigned long fast_read_pages =
+ max(RA_REMAIN_WINDOW_MIN, ras->ras_rpc_size);
struct vvp_page *vpg;
result = -ENODATA;
* the case, we can't do fast IO because we will need
* a cl_io to issue the RPC. */
if (ras->ras_window_start + ras->ras_window_len <
- ras->ras_next_readahead + PTLRPC_MAX_BRW_PAGES) {
+ ras->ras_next_readahead + fast_read_pages) {
/* export the page and skip io stack */
vpg->vpg_ra_used = 1;
cl_page_export(env, page, 1);
LASSERT(page->cp_type == CPT_CACHEABLE);
if (likely(!PageUptodate(vmpage))) {
cl_page_assume(env, io, page);
+
result = ll_io_read_page(env, io, page, file);
} else {
/* Page from a non-object file. */
}
RETURN(result);
}
-
-int ll_page_sync_io(const struct lu_env *env, struct cl_io *io,
- struct cl_page *page, enum cl_req_type crt)
-{
- struct cl_2queue *queue;
- int result;
-
- LASSERT(io->ci_type == CIT_READ || io->ci_type == CIT_WRITE);
-
- queue = &io->ci_queue;
- cl_2queue_init_page(queue, page);
-
- result = cl_io_submit_sync(env, io, crt, queue, 0);
- LASSERT(cl_page_is_owned(page, io));
-
- if (crt == CRT_READ)
- /*
- * in CRT_WRITE case page is left locked even in case of
- * error.
- */
- cl_page_list_disown(env, io, &queue->c2_qin);
- cl_2queue_fini(env, queue);
-
- return result;
-}