Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
LU-13004 ptlrpc: simplify bd_vec access.
[fs/lustre-release.git]
/
lustre
/
osc
/
osc_page.c
diff --git
a/lustre/osc/osc_page.c
b/lustre/osc/osc_page.c
index
ff64374
..
d0fd5e2
100644
(file)
--- a/
lustre/osc/osc_page.c
+++ b/
lustre/osc/osc_page.c
@@
-84,20
+84,17
@@
static void osc_page_transfer_add(const struct lu_env *env,
{
struct osc_object *obj = cl2osc(opg->ops_cl.cpl_obj);
- /* ops_lru and ops_inflight share the same field, so take it from LRU
- * first and then use it as inflight. */
osc_lru_use(osc_cli(obj), opg);
}
-int osc_page_cache_add(const struct lu_env *env,
-
const struct cl_page_slice *slice, struct cl_io *io
)
+int osc_page_cache_add(const struct lu_env *env,
struct osc_page *opg,
+
struct cl_io *io, cl_commit_cbt cb
)
{
- struct osc_page *opg = cl2osc_page(slice);
int result;
ENTRY;
osc_page_transfer_get(opg, "transfer\0cache");
- result = osc_queue_async_io(env, io, opg);
+ result = osc_queue_async_io(env, io, opg
, cb
);
if (result != 0)
osc_page_transfer_put(env, opg);
else
@@
-114,11
+111,6
@@
void osc_index2policy(union ldlm_policy_data *policy,
policy->l_extent.end = cl_offset(obj, end + 1) - 1;
}
-static const char *osc_list(struct list_head *head)
-{
- return list_empty(head) ? "-" : "+";
-}
-
static inline s64 osc_submit_duration(struct osc_page *opg)
{
if (ktime_to_ns(opg->ops_submit_time) == 0)
@@
-128,52
+120,51
@@
static inline s64 osc_submit_duration(struct osc_page *opg)
}
static int osc_page_print(const struct lu_env *env,
-
const struct cl_page_slice *slice,
-
void *cookie, lu_printer_t printer)
+ const struct cl_page_slice *slice,
+ void *cookie, lu_printer_t printer)
{
-
struct osc_page
*opg = cl2osc_page(slice);
-
struct osc_async_page *oap = &opg->ops_oap;
-
struct osc_object
*obj = cl2osc(slice->cpl_obj);
-
struct client_obd
*cli = &osc_export(obj)->exp_obd->u.cli;
+
struct osc_page
*opg = cl2osc_page(slice);
+ struct osc_async_page *oap = &opg->ops_oap;
+
struct osc_object
*obj = cl2osc(slice->cpl_obj);
+
struct client_obd
*cli = &osc_export(obj)->exp_obd->u.cli;
return (*printer)(env, cookie, LUSTRE_OSC_NAME"-page@%p %lu: "
- "1< %#x %d %
u %s %s
> "
+ "1< %#x %d %
c %c
> "
"2< %lld %u %u %#x %#x | %p %p %p > "
"3< %d %lld %d > "
- "4< %d %d %d %lu %
s | %s %s %s %s
> "
- "5< %
s %s %s %s | %d %s | %d %s %s
>\n",
+ "4< %d %d %d %lu %
c | %c %c %c %c
> "
+ "5< %
c %c %c %c | %d %c | %d %c %c
>\n",
opg, osc_index(opg),
- /* 1 */
- oap->oap_magic, oap->oap_cmd,
- oap->oap_interrupted,
- osc_list(&oap->oap_pending_item),
- osc_list(&oap->oap_rpc_item),
- /* 2 */
- oap->oap_obj_off, oap->oap_page_off, oap->oap_count,
- oap->oap_async_flags, oap->oap_brw_flags,
+ /* 1 */
+ oap->oap_magic, oap->oap_cmd,
+ list_empty_marker(&oap->oap_pending_item),
+ list_empty_marker(&oap->oap_rpc_item),
+ /* 2 */
+ oap->oap_obj_off, oap->oap_page_off, oap->oap_count,
+ oap->oap_async_flags, oap->oap_brw_flags,
oap->oap_request, oap->oap_cli, obj,
/* 3 */
opg->ops_transfer_pinned,
osc_submit_duration(opg), opg->ops_srvlock,
-
/* 4 */
-
cli->cl_r_in_flight, cli->cl_w_in_flight,
-
cli->cl_max_rpcs_in_flight,
-
cli->cl_avail_grant,
-
osc_list
(&cli->cl_cache_waiters),
-
osc_list
(&cli->cl_loi_ready_list),
-
osc_list
(&cli->cl_loi_hp_ready_list),
-
osc_list
(&cli->cl_loi_write_list),
-
osc_list
(&cli->cl_loi_read_list),
-
/* 5 */
-
osc_list
(&obj->oo_ready_item),
-
osc_list
(&obj->oo_hp_ready_item),
-
osc_list
(&obj->oo_write_item),
-
osc_list
(&obj->oo_read_item),
+ /* 4 */
+ cli->cl_r_in_flight, cli->cl_w_in_flight,
+ cli->cl_max_rpcs_in_flight,
+ cli->cl_avail_grant,
+
list_empty_marker
(&cli->cl_cache_waiters),
+
list_empty_marker
(&cli->cl_loi_ready_list),
+
list_empty_marker
(&cli->cl_loi_hp_ready_list),
+
list_empty_marker
(&cli->cl_loi_write_list),
+
list_empty_marker
(&cli->cl_loi_read_list),
+ /* 5 */
+
list_empty_marker
(&obj->oo_ready_item),
+
list_empty_marker
(&obj->oo_hp_ready_item),
+
list_empty_marker
(&obj->oo_write_item),
+
list_empty_marker
(&obj->oo_read_item),
atomic_read(&obj->oo_nr_reads),
-
osc_list
(&obj->oo_reading_exts),
+
list_empty_marker
(&obj->oo_reading_exts),
atomic_read(&obj->oo_nr_writes),
-
osc_list
(&obj->oo_hp_exts),
-
osc_list
(&obj->oo_urgent_exts));
+
list_empty_marker
(&obj->oo_hp_exts),
+
list_empty_marker
(&obj->oo_urgent_exts));
}
static void osc_page_delete(const struct lu_env *env,
@@
-229,21
+220,6
@@
static void osc_page_clip(const struct lu_env *env,
spin_unlock(&oap->oap_lock);
}
-static int osc_page_cancel(const struct lu_env *env,
- const struct cl_page_slice *slice)
-{
- struct osc_page *opg = cl2osc_page(slice);
- int rc = 0;
-
- /* Check if the transferring against this page
- * is completed, or not even queued. */
- if (opg->ops_transfer_pinned)
- /* FIXME: may not be interrupted.. */
- rc = osc_cancel_async_page(env, opg);
- LASSERT(ergo(rc == 0, opg->ops_transfer_pinned == 0));
- return rc;
-}
-
static int osc_page_flush(const struct lu_env *env,
const struct cl_page_slice *slice,
struct cl_io *io)
@@
-268,7
+244,6
@@
static const struct cl_page_operations osc_page_ops = {
.cpo_print = osc_page_print,
.cpo_delete = osc_page_delete,
.cpo_clip = osc_page_clip,
- .cpo_cancel = osc_page_cancel,
.cpo_flush = osc_page_flush,
.cpo_page_touch = osc_page_touch,
};
@@
-327,6
+302,7
@@
EXPORT_SYMBOL(osc_page_init);
void osc_page_submit(const struct lu_env *env, struct osc_page *opg,
enum cl_req_type crt, int brw_flags)
{
+ struct osc_io *oio = osc_env_io(env);
struct osc_async_page *oap = &opg->ops_oap;
LASSERTF(oap->oap_magic == OAP_MAGIC, "Bad oap magic: oap %p, "
@@
-339,7
+315,7
@@
void osc_page_submit(const struct lu_env *env, struct osc_page *opg,
oap->oap_count = opg->ops_to - opg->ops_from;
oap->oap_brw_flags = OBD_BRW_SYNC | brw_flags;
- if (
cfs_capable(CFS_CAP_SYS_RESOURCE)
) {
+ if (
oio->oi_cap_sys_resource
) {
oap->oap_brw_flags |= OBD_BRW_NOQUOTA;
oap->oap_cmd |= OBD_BRW_NOQUOTA;
}
@@
-443,7
+419,7
@@
int lru_queue_work(const struct lu_env *env, void *data)
void osc_lru_add_batch(struct client_obd *cli, struct list_head *plist)
{
-
struct list_head lru = LIST_HEAD_INIT
(lru);
+
LIST_HEAD
(lru);
struct osc_async_page *oap;
long npages = 0;
@@
-516,6
+492,8
@@
static void osc_lru_use(struct client_obd *cli, struct osc_page *opg)
/* If page is being transferred for the first time,
* ops_lru should be empty */
if (opg->ops_in_lru) {
+ if (list_empty(&opg->ops_lru))
+ return;
spin_lock(&cli->cl_lru_list_lock);
if (!list_empty(&opg->ops_lru)) {
__osc_lru_del(cli, opg);
@@
-795,7
+773,6
@@
out:
static int osc_lru_alloc(const struct lu_env *env, struct client_obd *cli,
struct osc_page *opg)
{
- struct l_wait_info lwi = LWI_INTR(LWI_ON_SIGNAL_NOOP, NULL);
struct osc_io *oio = osc_env_io(env);
int rc = 0;
@@
-819,11
+796,13
@@
static int osc_lru_alloc(const struct lu_env *env, struct client_obd *cli,
continue;
cond_resched();
- rc = l_wait_event(osc_lru_waitq,
- atomic_long_read(cli->cl_lru_left) > 0,
- &lwi);
- if (rc < 0)
+ rc = l_wait_event_abortable(
+ osc_lru_waitq,
+ atomic_long_read(cli->cl_lru_left) > 0);
+ if (rc < 0) {
+ rc = -EINTR;
break;
+ }
}
out:
@@
-906,7
+885,6
@@
static inline void unstable_page_accounting(struct ptlrpc_bulk_desc *desc,
int i;
if (desc != NULL) {
- LASSERT(ptlrpc_is_bulk_desc_kiov(desc->bd_type));
page_count = desc->bd_iov_count;
} else {
page_count = aa->aa_page_count;
@@
-915,7
+893,7
@@
static inline void unstable_page_accounting(struct ptlrpc_bulk_desc *desc,
for (i = 0; i < page_count; i++) {
void *pz;
if (desc)
- pz = page_zone(
BD_GET_KIOV(desc, i)
.kiov_page);
+ pz = page_zone(
desc->bd_vec[i]
.kiov_page);
else
pz = page_zone(aa->aa_ppga[i]->pg);