From 2f3e0b0fd0e09dca643ecb007d95ad149e88dd8e Mon Sep 17 00:00:00 2001 From: Adam Rutkowski Date: Fri, 26 Aug 2022 06:45:52 +0200 Subject: [PATCH 1/2] more precise req->alock_status size calculations 1. On 1 bit per cacheline is required for the status 2. ... however the size must be 8B aligned Signed-off-by: Adam Rutkowski --- src/ocf_request.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ocf_request.c b/src/ocf_request.c index 5905b74..bf7d8a9 100644 --- a/src/ocf_request.c +++ b/src/ocf_request.c @@ -1,5 +1,5 @@ /* - * Copyright(c) 2012-2021 Intel Corporation + * Copyright(c) 2012-2022 Intel Corporation * SPDX-License-Identifier: BSD-3-Clause */ @@ -43,13 +43,18 @@ static inline size_t ocf_req_sizeof_map(struct ocf_request *req) return size; } -static inline size_t ocf_req_sizeof_alock_status(struct ocf_request *req) +static inline size_t ocf_req_sizeof_alock_status(uint32_t lines) { - uint32_t lines = req->core_line_count; - size_t size = (lines * sizeof(uint8_t)); + uint32_t size; ENV_BUG_ON(lines == 0); - return size; + + /* 1 bit per cacheline */ + size = OCF_DIV_ROUND_UP(lines, 8); + + /* round up to 8B to avoid out of boundary access in bit operations + * on alock status */ + return OCF_DIV_ROUND_UP(size, sizeof(long)) * sizeof(long); } int ocf_req_allocator_init(struct ocf_ctx *ocf_ctx) @@ -142,7 +147,8 @@ int ocf_req_alloc_map(struct ocf_request *req) return 0; req->map = env_zalloc(ocf_req_sizeof_map(req) + - ocf_req_sizeof_alock_status(req), ENV_MEM_NOIO); + ocf_req_sizeof_alock_status(req->core_line_count), + ENV_MEM_NOIO); if (!req->map) { req->error = -OCF_ERR_NO_MEM; return -OCF_ERR_NO_MEM; From 0cfb8077c520ed8e188fb88687bcd1000014147f Mon Sep 17 00:00:00 2001 From: Adam Rutkowski Date: Fri, 26 Aug 2022 06:47:26 +0200 Subject: [PATCH 2/2] allocate fixed map status alongside request struct It is wastefull to allocate a full 1B to store 1 bit of alock status per cacheline. Fixed allocation of 128 bits seems more reasonable. Signed-off-by: Adam Rutkowski --- src/ocf_request.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ocf_request.c b/src/ocf_request.c index bf7d8a9..cb82561 100644 --- a/src/ocf_request.c +++ b/src/ocf_request.c @@ -59,8 +59,13 @@ static inline size_t ocf_req_sizeof_alock_status(uint32_t lines) int ocf_req_allocator_init(struct ocf_ctx *ocf_ctx) { - ocf_ctx->resources.req = env_mpool_create(sizeof(struct ocf_request), - sizeof(struct ocf_map_info) + sizeof(uint8_t), ENV_MEM_NORMAL, ocf_req_size_128, + enum ocf_req_size max_req_size = ocf_req_size_128; + size_t alock_status_size = ocf_req_sizeof_alock_status( + (1U << (unsigned)max_req_size)); + size_t header_size = sizeof(struct ocf_request) + alock_status_size; + + ocf_ctx->resources.req = env_mpool_create(header_size, + sizeof(struct ocf_map_info), ENV_MEM_NORMAL, max_req_size, false, NULL, "ocf_req", true); if (ocf_ctx->resources.req == NULL)