ioat: hide 2MiB boundary memory check in spdk_vtophys()
Change-Id: I8ad61e398f02fc5989450415424f58ea60423f85 Signed-off-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5178 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
e1aba43745
commit
26ae3d66d8
@ -606,8 +606,7 @@ spdk_ioat_build_copy(struct spdk_ioat_chan *ioat, void *cb_arg, spdk_ioat_req_cb
|
||||
struct ioat_descriptor *last_desc;
|
||||
uint64_t remaining, op_size;
|
||||
uint64_t vdst, vsrc;
|
||||
uint64_t vdst_page, vsrc_page;
|
||||
uint64_t pdst_page, psrc_page;
|
||||
uint64_t pdst_addr, psrc_addr, dst_len, src_len;
|
||||
uint32_t orig_head;
|
||||
|
||||
if (!ioat) {
|
||||
@ -618,30 +617,25 @@ spdk_ioat_build_copy(struct spdk_ioat_chan *ioat, void *cb_arg, spdk_ioat_req_cb
|
||||
|
||||
vdst = (uint64_t)dst;
|
||||
vsrc = (uint64_t)src;
|
||||
vdst_page = vsrc_page = 0;
|
||||
pdst_page = psrc_page = SPDK_VTOPHYS_ERROR;
|
||||
|
||||
remaining = nbytes;
|
||||
while (remaining) {
|
||||
if (_2MB_PAGE(vsrc) != vsrc_page) {
|
||||
vsrc_page = _2MB_PAGE(vsrc);
|
||||
psrc_page = spdk_vtophys((void *)vsrc_page, NULL);
|
||||
src_len = dst_len = remaining;
|
||||
|
||||
psrc_addr = spdk_vtophys((void *)vsrc, &src_len);
|
||||
if (psrc_addr == SPDK_VTOPHYS_ERROR) {
|
||||
return -EINVAL;
|
||||
}
|
||||
pdst_addr = spdk_vtophys((void *)vdst, &dst_len);
|
||||
if (pdst_addr == SPDK_VTOPHYS_ERROR) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (_2MB_PAGE(vdst) != vdst_page) {
|
||||
vdst_page = _2MB_PAGE(vdst);
|
||||
pdst_page = spdk_vtophys((void *)vdst_page, NULL);
|
||||
}
|
||||
op_size = remaining;
|
||||
op_size = spdk_min(op_size, (VALUE_2MB - _2MB_OFFSET(vsrc)));
|
||||
op_size = spdk_min(op_size, (VALUE_2MB - _2MB_OFFSET(vdst)));
|
||||
op_size = spdk_min(dst_len, src_len);
|
||||
op_size = spdk_min(op_size, ioat->max_xfer_size);
|
||||
remaining -= op_size;
|
||||
|
||||
last_desc = ioat_prep_copy(ioat,
|
||||
pdst_page + _2MB_OFFSET(vdst),
|
||||
psrc_page + _2MB_OFFSET(vsrc),
|
||||
op_size);
|
||||
last_desc = ioat_prep_copy(ioat, pdst_addr, psrc_addr, op_size);
|
||||
|
||||
if (remaining == 0 || last_desc == NULL) {
|
||||
break;
|
||||
@ -693,6 +687,7 @@ spdk_ioat_build_fill(struct spdk_ioat_chan *ioat, void *cb_arg, spdk_ioat_req_cb
|
||||
struct ioat_descriptor *last_desc = NULL;
|
||||
uint64_t remaining, op_size;
|
||||
uint64_t vdst;
|
||||
uint64_t pdst_addr, dst_len;
|
||||
uint32_t orig_head;
|
||||
|
||||
if (!ioat) {
|
||||
@ -710,15 +705,16 @@ spdk_ioat_build_fill(struct spdk_ioat_chan *ioat, void *cb_arg, spdk_ioat_req_cb
|
||||
remaining = nbytes;
|
||||
|
||||
while (remaining) {
|
||||
op_size = remaining;
|
||||
op_size = spdk_min(op_size, (VALUE_2MB - _2MB_OFFSET(vdst)));
|
||||
op_size = spdk_min(op_size, ioat->max_xfer_size);
|
||||
dst_len = remaining;
|
||||
pdst_addr = spdk_vtophys((void *)vdst, &dst_len);
|
||||
if (pdst_addr == SPDK_VTOPHYS_ERROR) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
op_size = spdk_min(dst_len, ioat->max_xfer_size);
|
||||
remaining -= op_size;
|
||||
|
||||
last_desc = ioat_prep_fill(ioat,
|
||||
spdk_vtophys((void *)vdst, NULL),
|
||||
fill_pattern,
|
||||
op_size);
|
||||
last_desc = ioat_prep_fill(ioat, pdst_addr, fill_pattern, op_size);
|
||||
|
||||
if (remaining == 0 || last_desc == NULL) {
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user