From 6a275773ceeee3d86f50ebee4d6c0a539856adf5 Mon Sep 17 00:00:00 2001 From: Rafal Stefanowski Date: Wed, 5 Feb 2025 16:57:59 +0100 Subject: [PATCH] Kernel 6.13: Introduce cas_queue_max_discard_sectors() Signed-off-by: Robert Baldyga Signed-off-by: Rafal Stefanowski --- configure.d/1_queue_discard.conf | 48 ++++++++++++++++++++ modules/cas_cache/volume/vol_block_dev_top.c | 5 +- 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 configure.d/1_queue_discard.conf diff --git a/configure.d/1_queue_discard.conf b/configure.d/1_queue_discard.conf new file mode 100644 index 0000000..a93dc19 --- /dev/null +++ b/configure.d/1_queue_discard.conf @@ -0,0 +1,48 @@ +#!/bin/bash +# +# Copyright(c) 2012-2022 Intel Corporation +# Copyright(c) 2025 Huawei Technologies +# SPDX-License-Identifier: BSD-3-Clause +# + +. $(dirname $3)/conf_framework.sh + +check() { + cur_name=$(basename $2) + config_file_path=$1 + if compile_module $cur_name "blk_queue_max_discard_sectors(NULL, 0);" "linux/blkdev.h" + then + echo $cur_name "1" >> $config_file_path + else + echo $cur_name "2" >> $config_file_path + fi +} + +apply() { + case "$1" in + "1") + add_function " + static inline void cas_queue_max_discard_sectors( + struct request_queue *q, + unsigned int max_discard_sectors) + { + blk_queue_max_discard_sectors(q, max_discard_sectors); + }" ;; + "2") + add_function " + static inline void cas_queue_max_discard_sectors( + struct request_queue *q, + unsigned int max_discard_sectors) + { + struct queue_limits *lim = &q->limits; + + lim->max_hw_discard_sectors = max_discard_sectors; + lim->max_discard_sectors = + min(max_discard_sectors, lim->max_user_discard_sectors); + }" ;; + *) + exit 1 + esac +} + +conf_run $@ diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index 05207e7..3e8d818 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -63,13 +63,14 @@ static void blkdev_set_discard_properties(ocf_cache_t cache, CAS_SET_DISCARD_ZEROES_DATA(exp_q->limits, 0); if (core_q && cas_has_discard_support(core_bd)) { - blk_queue_max_discard_sectors(exp_q, core_q->limits.max_discard_sectors); + cas_queue_max_discard_sectors(exp_q, + core_q->limits.max_discard_sectors); exp_q->limits.discard_alignment = bdev_discard_alignment(core_bd); exp_q->limits.discard_granularity = core_q->limits.discard_granularity; } else { - blk_queue_max_discard_sectors(exp_q, + cas_queue_max_discard_sectors(exp_q, min((uint64_t)core_sectors, (uint64_t)UINT_MAX)); exp_q->limits.discard_granularity = ocf_cache_get_line_size(cache); exp_q->limits.discard_alignment = 0;