X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosc%2Fosc_page.c;h=29d119c05eb841950cd06301fdee51d603b4471b;hp=a583eef43eb6f9860bb68c5126c9c0b30616fc7d;hb=3dcf18d3;hpb=cefa8cda2ba2d288ccaa4ec077a6c627592503ea diff --git a/lustre/osc/osc_page.c b/lustre/osc/osc_page.c index a583eef..29d119c 100644 --- a/lustre/osc/osc_page.c +++ b/lustre/osc/osc_page.c @@ -75,6 +75,10 @@ static int osc_page_is_dlocked(const struct lu_env *env, dlmmode, &flags, NULL, lockh, unref); } +/** + * Checks an invariant that a page in the cache is covered by a lock, as + * needed. + */ static int osc_page_protected(const struct lu_env *env, const struct osc_page *opg, enum cl_lock_mode mode, int unref) @@ -87,11 +91,20 @@ static int osc_page_protected(const struct lu_env *env, LINVRNT(!opg->ops_temp); + page = opg->ops_cl.cpl_page; + if (page->cp_owner != NULL && + cl_io_top(page->cp_owner)->ci_lockreq == CILR_NEVER) + /* + * If IO is done without locks (liblustre, or lloop), lock is + * not required. + */ + result = 1; + else + /* otherwise check for a DLM lock */ result = osc_page_is_dlocked(env, opg, mode, 1, unref); if (result == 0) { /* maybe this page is a part of a lockless io? */ hdr = cl_object_header(opg->ops_cl.cpl_obj); - page = opg->ops_cl.cpl_page; descr = &osc_env_info(env)->oti_descr; descr->cld_mode = mode; descr->cld_start = page->cp_index; @@ -164,6 +177,8 @@ static void osc_page_transfer_add(const struct lu_env *env, { struct osc_object *obj; + LINVRNT(cl_page_is_vmlocked(env, opg->ops_cl.cpl_page)); + obj = cl2osc(opg->ops_cl.cpl_obj); spin_lock(&obj->oo_seatbelt); list_add(&opg->ops_inflight, &obj->oo_inflight[crt]); @@ -173,7 +188,7 @@ static void osc_page_transfer_add(const struct lu_env *env, static int osc_page_cache_add(const struct lu_env *env, const struct cl_page_slice *slice, - struct cl_io *_) + struct cl_io *unused) { struct osc_page *opg = cl2osc_page(slice); struct osc_object *obj = cl2osc(opg->ops_cl.cpl_obj); @@ -186,7 +201,7 @@ static int osc_page_cache_add(const struct lu_env *env, ENTRY; /* Set the OBD_BRW_SRVLOCK before the page is queued. */ - brw_flags = oio->oi_lockless ? OBD_BRW_SRVLOCK : 0; + brw_flags = osc_io_srvlock(oio) ? OBD_BRW_SRVLOCK : 0; if (!client_is_remote(osc_export(obj)) && cfs_capable(CFS_CAP_SYS_RESOURCE)) { brw_flags |= OBD_BRW_NOQUOTA; @@ -214,7 +229,7 @@ void osc_index2policy(ldlm_policy_data_t *policy, const struct cl_object *obj, static int osc_page_is_under_lock(const struct lu_env *env, const struct cl_page_slice *slice, - struct cl_io *_) + struct cl_io *unused) { struct cl_lock *lock; int result; @@ -231,7 +246,8 @@ static int osc_page_is_under_lock(const struct lu_env *env, } static int osc_page_fail(const struct lu_env *env, - const struct cl_page_slice *slice, struct cl_io *_) + const struct cl_page_slice *slice, + struct cl_io *unused) { /* * Cached read? @@ -254,16 +270,25 @@ static int osc_page_print(const struct lu_env *env, struct osc_async_page *oap = &opg->ops_oap; return (*printer)(env, cookie, LUSTRE_OSC_NAME"-page@%p: " - "%#x %d %u %s %s %s %llu %u %#x %p %p %p %p %p\n", - opg, oap->oap_magic, oap->oap_cmd, + "< %#x %d %u %s %s %s >" + "< %llu %u %#x %#x %p %p %p %p %p >" + "< %s %p %d >\n", + opg, + /* 1 */ + oap->oap_magic, oap->oap_cmd, oap->oap_interrupted, osc_list(&oap->oap_pending_item), osc_list(&oap->oap_urgent_item), osc_list(&oap->oap_rpc_item), + /* 2 */ oap->oap_obj_off, oap->oap_page_off, - oap->oap_async_flags, oap->oap_request, + oap->oap_async_flags, oap->oap_brw_flags, + oap->oap_request, oap->oap_cli, oap->oap_loi, oap->oap_caller_ops, - oap->oap_caller_data); + oap->oap_caller_data, + /* 3 */ + osc_list(&opg->ops_inflight), + opg->ops_submitter, opg->ops_transfer_pinned); } static void osc_page_delete(const struct lu_env *env, @@ -280,7 +305,11 @@ static void osc_page_delete(const struct lu_env *env, CDEBUG(D_TRACE, "%p\n", opg); osc_page_transfer_put(env, opg); rc = osc_teardown_async_page(osc_export(obj), NULL, obj->oo_oinfo, oap); - LASSERTF(rc == 0, "%i\n", rc); + if (rc) { + CL_PAGE_DEBUG(D_ERROR, env, cl_page_top(slice->cpl_page), + "Trying to teardown failed: %d\n", rc); + LASSERT(0); + } spin_lock(&obj->oo_seatbelt); list_del_init(&opg->ops_inflight); spin_unlock(&obj->oo_seatbelt); @@ -395,6 +424,7 @@ static int osc_completion(const struct lu_env *env, enum cl_req_type crt; LINVRNT(osc_page_protected(env, opg, CLM_READ, 1)); + LINVRNT(cl_page_is_vmlocked(env, page)); ENTRY; @@ -467,7 +497,7 @@ struct cl_page *osc_page_init(const struct lu_env *env, struct osc_page *opg; int result; - OBD_SLAB_ALLOC_PTR(opg, osc_page_kmem); + OBD_SLAB_ALLOC_PTR_GFP(opg, osc_page_kmem, CFS_ALLOC_IO); if (opg != NULL) { void *oap = &opg->ops_oap; @@ -495,6 +525,10 @@ struct cl_page *osc_page_init(const struct lu_env *env, return ERR_PTR(result); } +/** + * Helper function called by osc_io_submit() for every page in an immediate + * transfer (i.e., transferred synchronously). + */ void osc_io_submit_page(const struct lu_env *env, struct osc_io *oio, struct osc_page *opg, enum cl_req_type crt) @@ -507,8 +541,11 @@ void osc_io_submit_page(const struct lu_env *env, oap->oap_page_off = opg->ops_from; oap->oap_count = opg->ops_to - opg->ops_from; + /* Give a hint to OST that requests are coming from kswapd - bug19529 */ + if (libcfs_memory_pressure_get()) + oap->oap_brw_flags |= OBD_BRW_MEMALLOC; oap->oap_brw_flags |= OBD_BRW_SYNC; - if (oio->oi_lockless) + if (osc_io_srvlock(oio)) oap->oap_brw_flags |= OBD_BRW_SRVLOCK; oap->oap_cmd = crt == CRT_WRITE ? OBD_BRW_WRITE : OBD_BRW_READ;