From d465a21a3090ef5191ad96ba721a02cd240da2e4 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Tue, 2 Oct 2018 06:21:36 -0700 Subject: [PATCH] reduce: allocate scratch buffer space for requests Each request will need a scratch buffer of size chunk_size. This is needed for read/modify/write operations when only part of a chunk is written. Signed-off-by: Jim Harris Change-Id: Ided33f1e9ae18dd9a5de45f53f0a994a6f260b17 Reviewed-on: https://review.gerrithub.io/434111 Tested-by: SPDK CI Jenkins Chandler-Test-Pool: SPDK Automated Test System Reviewed-by: Shuhei Matsumoto Reviewed-by: Ben Walker --- lib/reduce/reduce.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/reduce/reduce.c b/lib/reduce/reduce.c index 0ae9633eb..d978d11c9 100644 --- a/lib/reduce/reduce.c +++ b/lib/reduce/reduce.c @@ -75,6 +75,7 @@ struct spdk_reduce_pm_file { }; struct spdk_reduce_vol_request { + uint8_t *buf; TAILQ_ENTRY(spdk_reduce_vol_request) tailq; }; @@ -92,6 +93,7 @@ struct spdk_reduce_vol { struct spdk_reduce_vol_request *request_mem; TAILQ_HEAD(, spdk_reduce_vol_request) requests; + uint8_t *bufspace; }; /* @@ -236,13 +238,21 @@ _allocate_vol_requests(struct spdk_reduce_vol *vol) struct spdk_reduce_vol_request *req; int i; + vol->bufspace = spdk_dma_malloc(REDUCE_NUM_VOL_REQUESTS * vol->params.chunk_size, 64, NULL); + if (vol->bufspace == NULL) { + return -ENOMEM; + } + vol->request_mem = calloc(REDUCE_NUM_VOL_REQUESTS, sizeof(*req)); if (vol->request_mem == NULL) { + free(vol->bufspace); return -ENOMEM; } for (i = 0; i < REDUCE_NUM_VOL_REQUESTS; i++) { - TAILQ_INSERT_HEAD(&vol->requests, &vol->request_mem[i], tailq); + req = &vol->request_mem[i]; + TAILQ_INSERT_HEAD(&vol->requests, req, tailq); + req->buf = vol->bufspace + i * vol->params.chunk_size; } return 0; @@ -261,6 +271,7 @@ _init_load_cleanup(struct spdk_reduce_vol *vol, struct reduce_init_load_ctx *ctx spdk_bit_array_free(&vol->allocated_chunk_maps); spdk_bit_array_free(&vol->allocated_backing_io_units); free(vol->request_mem); + spdk_dma_free(vol->bufspace); free(vol); } }