Merge pull request #1632 from mmichal10/preemption

Disable preemption when accessing current cpu id
This commit is contained in:
Robert Baldyga 2025-03-26 08:19:35 +01:00 committed by GitHub
commit 21d017d60b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 26 additions and 6 deletions

View File

@ -1,6 +1,6 @@
/* /*
* Copyright(c) 2012-2022 Intel Corporation * Copyright(c) 2012-2022 Intel Corporation
* Copyright(c) 2024 Huawei Technologies * Copyright(c) 2024-2025 Huawei Technologies
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
@ -73,6 +73,7 @@ static int _cas_cleaner_thread(void *data)
struct cache_priv *cache_priv = ocf_cache_get_priv(cache); struct cache_priv *cache_priv = ocf_cache_get_priv(cache);
struct cas_thread_info *info; struct cas_thread_info *info;
uint32_t ms; uint32_t ms;
ocf_queue_t queue;
BUG_ON(!c); BUG_ON(!c);
@ -94,7 +95,10 @@ static int _cas_cleaner_thread(void *data)
atomic_set(&info->kicked, 0); atomic_set(&info->kicked, 0);
init_completion(&info->sync_compl); init_completion(&info->sync_compl);
ocf_cleaner_run(c, cache_priv->io_queues[smp_processor_id()]); get_cpu();
queue = cache_priv->io_queues[smp_processor_id()];
put_cpu();
ocf_cleaner_run(c, queue);
wait_for_completion(&info->sync_compl); wait_for_completion(&info->sync_compl);
/* /*

View File

@ -1,6 +1,6 @@
/* /*
* Copyright(c) 2012-2022 Intel Corporation * Copyright(c) 2012-2022 Intel Corporation
* Copyright(c) 2024 Huawei Technologies * Copyright(c) 2024-2025 Huawei Technologies
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
@ -208,9 +208,13 @@ void *cas_rpool_try_get(struct cas_reserve_pool *rpool_master, int *cpu)
CAS_DEBUG_TRACE(); CAS_DEBUG_TRACE();
get_cpu();
*cpu = smp_processor_id(); *cpu = smp_processor_id();
current_rpool = &rpool_master->rpools[*cpu]; current_rpool = &rpool_master->rpools[*cpu];
put_cpu();
spin_lock_irqsave(&current_rpool->lock, flags); spin_lock_irqsave(&current_rpool->lock, flags);
if (!list_empty(&current_rpool->list)) { if (!list_empty(&current_rpool->list)) {

View File

@ -248,12 +248,16 @@ static int blkdev_handle_data_single(struct bd_object *bvol, struct bio *bio,
{ {
ocf_cache_t cache = ocf_volume_get_cache(bvol->front_volume); ocf_cache_t cache = ocf_volume_get_cache(bvol->front_volume);
struct cache_priv *cache_priv = ocf_cache_get_priv(cache); struct cache_priv *cache_priv = ocf_cache_get_priv(cache);
ocf_queue_t queue = cache_priv->io_queues[smp_processor_id()]; ocf_queue_t queue;
ocf_io_t io; ocf_io_t io;
struct blk_data *data; struct blk_data *data;
uint64_t flags = CAS_BIO_OP_FLAGS(bio); uint64_t flags = CAS_BIO_OP_FLAGS(bio);
int ret; int ret;
get_cpu();
queue = cache_priv->io_queues[smp_processor_id()];
put_cpu();
data = cas_alloc_blk_data(bio_segments(bio), GFP_NOIO); data = cas_alloc_blk_data(bio_segments(bio), GFP_NOIO);
if (!data) { if (!data) {
CAS_PRINT_RL(KERN_CRIT "BIO data vector allocation error\n"); CAS_PRINT_RL(KERN_CRIT "BIO data vector allocation error\n");
@ -363,9 +367,13 @@ static void blkdev_handle_discard(struct bd_object *bvol, struct bio *bio)
{ {
ocf_cache_t cache = ocf_volume_get_cache(bvol->front_volume); ocf_cache_t cache = ocf_volume_get_cache(bvol->front_volume);
struct cache_priv *cache_priv = ocf_cache_get_priv(cache); struct cache_priv *cache_priv = ocf_cache_get_priv(cache);
ocf_queue_t queue = cache_priv->io_queues[smp_processor_id()]; ocf_queue_t queue;
ocf_io_t io; ocf_io_t io;
get_cpu();
queue = cache_priv->io_queues[smp_processor_id()];
put_cpu();
io = ocf_volume_new_io(bvol->front_volume, queue, io = ocf_volume_new_io(bvol->front_volume, queue,
CAS_BIO_BISECTOR(bio) << SECTOR_SHIFT, CAS_BIO_BISECTOR(bio) << SECTOR_SHIFT,
CAS_BIO_BISIZE(bio), OCF_WRITE, 0, 0); CAS_BIO_BISIZE(bio), OCF_WRITE, 0, 0);
@ -411,9 +419,13 @@ static void blkdev_handle_flush(struct bd_object *bvol, struct bio *bio)
{ {
ocf_cache_t cache = ocf_volume_get_cache(bvol->front_volume); ocf_cache_t cache = ocf_volume_get_cache(bvol->front_volume);
struct cache_priv *cache_priv = ocf_cache_get_priv(cache); struct cache_priv *cache_priv = ocf_cache_get_priv(cache);
ocf_queue_t queue = cache_priv->io_queues[smp_processor_id()]; ocf_queue_t queue;
ocf_io_t io; ocf_io_t io;
get_cpu();
queue = cache_priv->io_queues[smp_processor_id()];
put_cpu();
io = ocf_volume_new_io(bvol->front_volume, queue, 0, 0, OCF_WRITE, 0, io = ocf_volume_new_io(bvol->front_volume, queue, 0, 0, OCF_WRITE, 0,
CAS_SET_FLUSH(0)); CAS_SET_FLUSH(0));
if (!io) { if (!io) {