Skip to content

Commit

Permalink
Implement vblock split write amp reduction algo
Browse files Browse the repository at this point in the history
During a vblock split, we can save write amp by using
mpool_mblock_punch() to FALLOC_FL_PUNCH_HOLE a portion of the mblock for
both the left and right hand side destination mblocks.

Signed-off-by: Tristan Partin <tpartin@micron.com>
Co-authored-by: Nabeel Meeramohideen Mohamed <nmeeramohide@micron.com>
  • Loading branch information
tristan957 and nabeelmmd committed Jan 19, 2023
1 parent d30305d commit 4d35f54
Show file tree
Hide file tree
Showing 9 changed files with 326 additions and 102 deletions.
2 changes: 1 addition & 1 deletion lib/cn/keep.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ kvset_keep_vblocks(

for (uint32_t j = 0; j < cnt; ++j) {
vbm->vbm_blkv[nv] = kvset_get_nth_vblock_id(kvset, j);
vbm->vbm_tot += kvset_get_nth_vblock_len(kvset, j);
vbm->vbm_tot += kvset_get_nth_vblock_wlen(kvset, j);

if (j == vgmap_vbidx_out_end(kvset, kvg)) {
merr_t err;
Expand Down
20 changes: 14 additions & 6 deletions lib/cn/kvset.c
Original file line number Diff line number Diff line change
Expand Up @@ -1773,11 +1773,19 @@ kvset_get_nth_vblock_id(struct kvset *ks, uint32_t index)
}

uint32_t
kvset_get_nth_vblock_len(struct kvset *ks, uint32_t index)
kvset_get_nth_vblock_wlen(struct kvset *ks, uint32_t index)
{
struct vblock_desc *vbd = lvx2vbd(ks, index);

return vbd ? vbd->vbd_len : 0;
return vbd ? vbd->vbd_wlen : 0;
}

uint32_t
kvset_get_nth_vblock_alen(struct kvset *ks, uint32_t index)
{
struct vblock_desc *vbd = lvx2vbd(ks, index);

return vbd ? vbd->vbd_alen : 0;
}

struct vblock_desc *
Expand Down Expand Up @@ -2297,7 +2305,7 @@ vr_start_read(
/* update mblock properties */
assert(lvx2vbd(ks, vbidx));
vr->vr_mblk_dstart = lvx2vbd(ks, vbidx)->vbd_off;
vr->vr_mblk_dlen = lvx2vbd(ks, vbidx)->vbd_len;
vr->vr_mblk_dlen = lvx2vbd(ks, vbidx)->vbd_wlen;
vr->vr_mbid = lvx2mbid(ks, vbidx);

/* set io fields for async mblock read */
Expand Down Expand Up @@ -2708,7 +2716,7 @@ kvset_madvise_vblks(struct kvset *ks, int advice)
for (j = 0; j < v->mbs_mblkc; j++) {
struct vblock_desc *vbd = mbset_get_udata(v, j);

vbr_madvise_async(vbd, 0, vbd->vbd_len, advice, wq);
vbr_madvise_async(vbd, 0, vbd->vbd_wlen, advice, wq);
}
}
}
Expand All @@ -2730,7 +2738,7 @@ kvset_madvise_capped(struct kvset *ks, int advice)
for (uint j = 0; j < v->mbs_mblkc; j++) {
struct vblock_desc *vbd = mbset_get_udata(v, j);

vbr_madvise_async(vbd, 0, min_t(uint, vbd->vbd_len, vra_len), advice, wq);
vbr_madvise_async(vbd, 0, min_t(uint, vbd->vbd_wlen, vra_len), advice, wq);
}
}
}
Expand All @@ -2746,7 +2754,7 @@ kvset_madvise_vmaps(struct kvset *ks, int advice)
for (uint j = 0; j < v->mbs_mblkc; j++) {
struct vblock_desc *vbd = mbset_get_udata(v, j);

vbr_madvise(vbd, 0, vbd->vbd_len, advice);
vbr_madvise(vbd, 0, vbd->vbd_wlen, advice);
}
}
}
Expand Down
11 changes: 9 additions & 2 deletions lib/cn/kvset.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,11 +351,18 @@ void
kvset_set_rule(struct kvset *ks, enum cn_rule rule);

/**
* kvset_get_nth_vblock_len() - Get len of useful data in nth vblock
* Get len of useful written data in nth vblock
*/
/* MTF_MOCK */
uint32_t
kvset_get_nth_vblock_len(struct kvset *km, uint32_t index);
kvset_get_nth_vblock_wlen(struct kvset *km, uint32_t index);

/**
* Get len of useful allocated data in nth vblock
*/
/* MTF_MOCK */
uint32_t
kvset_get_nth_vblock_alen(struct kvset *km, uint32_t index);

/* MTF_MOCK */
void
Expand Down
Loading

0 comments on commit 4d35f54

Please sign in to comment.