void (*cra_release)(const struct lu_env *env, void *cbdata);
/* Callback data for cra_release routine */
void *cra_cbdata;
+ /* whether lock is in contention */
+ bool cra_contention;
};
static inline void cl_read_ahead_release(const struct lu_env *env,
if (rc < 0)
break;
+ /* Do not shrink the ria_end at any case until
+ * the minimum end of current read is covered.
+ * And only shrink the ria_end if the matched
+ * LDLM lock doesn't cover more. */
+ if (page_idx > ra.cra_end ||
+ (ra.cra_contention &&
+ page_idx > ria->ria_end_min)) {
+ ria->ria_end = ra.cra_end;
+ break;
+ }
+
CDEBUG(D_READA, "idx: %lu, ra: %lu, rpc: %lu\n",
page_idx, ra.cra_end, ra.cra_rpc_size);
LASSERTF(ra.cra_end >= page_idx,
ria->ria_end = end - 1;
if (ria->ria_end < ria->ria_end_min)
ria->ria_end = ria->ria_end_min;
- if (ria->ria_end > ra.cra_end)
- ria->ria_end = ra.cra_end;
}
if (page_idx > ria->ria_end)
break;
dlmlock->l_policy_data.l_extent.end);
ra->cra_release = osc_read_ahead_release;
ra->cra_cbdata = dlmlock;
+ if (ra->cra_end != CL_PAGE_EOF)
+ ra->cra_contention = true;
result = 0;
}