Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93420770 authored by Boaz Harrosh's avatar Boaz Harrosh
Browse files

pnfs-obj: pg_test check for max_io_size



Implement pg_test vector to test for max IO sizes. We calculate
a max_io_size member only once, and cache it in lseg so to not
do so on every page insert.

Signed-off-by: default avatarBoaz Harrosh <bharrosh@panasas.com>
[simplify logic]
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
parent 5b36c7dc
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -128,6 +128,8 @@ struct objio_segment {
	u64 group_depth;
	unsigned group_count;

	unsigned max_io_size;

	unsigned comps_index;
	unsigned num_comps;
	/* variable length */
@@ -365,6 +367,11 @@ int objio_alloc_lseg(struct pnfs_layout_segment **outp,
		objio_seg->group_count = 1;
	}

	/* Cache this calculation it will hit for every page */
	objio_seg->max_io_size = (BIO_MAX_PAGES_KMALLOC * PAGE_SIZE -
				  objio_seg->stripe_unit) *
				 objio_seg->group_width;

	*outp = &objio_seg->lseg;
	return 0;

@@ -988,6 +995,16 @@ ssize_t objio_write_pagelist(struct objlayout_io_state *ol_state, bool stable)
	return _write_exec(ios);
}

static bool objio_pg_test(struct nfs_pageio_descriptor *pgio,
			  struct nfs_page *prev, struct nfs_page *req)
{
	if (!pnfs_generic_pg_test(pgio, prev, req))
		return false;

	return pgio->pg_count + req->wb_bytes <=
			OBJIO_LSEG(pgio->pg_lseg)->max_io_size;
}

static struct pnfs_layoutdriver_type objlayout_type = {
	.id = LAYOUT_OSD2_OBJECTS,
	.name = "LAYOUT_OSD2_OBJECTS",
@@ -1001,7 +1018,7 @@ static struct pnfs_layoutdriver_type objlayout_type = {

	.read_pagelist           = objlayout_read_pagelist,
	.write_pagelist          = objlayout_write_pagelist,
	.pg_test                 = pnfs_generic_pg_test,
	.pg_test                 = objio_pg_test,

	.free_deviceid_node	 = objio_free_deviceid_node,