summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
83d8dd1)
When doing unaligned strided reads, it's possible for the
first and last page of a stride to be read by another
thread on the same node, resulting in EBUSY.
Also this could potentially happen for sequential read,
for example, several MPI split one large file with unaligned
page size, sequential read happen with each MPI program.
We shouldn't stop readahead in these cases.
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: I4e832c8859452d0b52f14b5e4fdb64a972bf40a3
Reviewed-on: https://review.whamcloud.com/35457
Reviewed-by: Wang Shilong <wshilong@ddn.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
struct ra_io_arg *ria, pgoff_t *ra_end)
{
struct cl_read_ahead ra = { 0 };
struct ra_io_arg *ria, pgoff_t *ra_end)
{
struct cl_read_ahead ra = { 0 };
+ /* busy page count is per stride */
+ int rc = 0, count = 0, busy_page_count = 0;
pgoff_t page_idx;
LASSERT(ria != NULL);
pgoff_t page_idx;
LASSERT(ria != NULL);
/* If the page is inside the read-ahead window */
rc = ll_read_ahead_page(env, io, queue, page_idx);
/* If the page is inside the read-ahead window */
rc = ll_read_ahead_page(env, io, queue, page_idx);
+ if (rc < 0 && rc != -EBUSY)
+ if (rc == -EBUSY) {
+ busy_page_count++;
+ CDEBUG(D_READA,
+ "skip busy page: %lu\n", page_idx);
+ /* For page unaligned readahead the first
+ * last pages of each region can be read by
+ * another reader on the same node, and so
+ * may be busy. So only stop for > 2 busy
+ * pages. */
+ if (busy_page_count > 2)
+ break;
+ }
*ra_end = page_idx;
/* Only subtract from reserve & count the page if we
*ra_end = page_idx;
/* Only subtract from reserve & count the page if we
pos += (ria->ria_length - offset);
if ((pos >> PAGE_SHIFT) >= page_idx + 1)
page_idx = (pos >> PAGE_SHIFT) - 1;
pos += (ria->ria_length - offset);
if ((pos >> PAGE_SHIFT) >= page_idx + 1)
page_idx = (pos >> PAGE_SHIFT) - 1;
CDEBUG(D_READA,
"Stride: jump %llu pages to %lu\n",
ria->ria_length - offset, page_idx);
CDEBUG(D_READA,
"Stride: jump %llu pages to %lu\n",
ria->ria_length - offset, page_idx);