diff options
-rw-r--r-- | drivers/md/dm-bufio.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index 58df20fd5465..2451a4d68aed 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -132,6 +132,7 @@ enum data_mode { struct dm_buffer { struct rb_node node; struct list_head lru_list; + struct list_head global_list; sector_t block; void *data; unsigned char data_mode; /* DATA_MODE_* */ @@ -192,7 +193,9 @@ static unsigned long dm_bufio_cache_size; */ static unsigned long dm_bufio_cache_size_latch; -static DEFINE_SPINLOCK(param_spinlock); +static DEFINE_SPINLOCK(global_spinlock); + +static LIST_HEAD(global_queue); /* * Buffers are freed after this timeout @@ -301,7 +304,7 @@ static void adjust_total_allocated(struct dm_buffer *b, bool unlink) if (unlink) diff = -diff; - spin_lock(¶m_spinlock); + spin_lock(&global_spinlock); *class_ptr[data_mode] += diff; @@ -310,7 +313,13 @@ static void adjust_total_allocated(struct dm_buffer *b, bool unlink) if (dm_bufio_current_allocated > dm_bufio_peak_allocated) dm_bufio_peak_allocated = dm_bufio_current_allocated; - spin_unlock(¶m_spinlock); + if (!unlink) { + list_add(&b->global_list, &global_queue); + } else { + list_del(&b->global_list); + } + + spin_unlock(&global_spinlock); } /* |