mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-05-09 21:11:16 +00:00
2425d6e457
Readahead fixed! Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
56 lines
2.0 KiB
Diff
56 lines
2.0 KiB
Diff
From 5c97f5b2d4924961479e862e8fe516ba217551b3 Mon Sep 17 00:00:00 2001
|
|
From: Dan Magenheimer <dan.magenheimer@oracle.com>
|
|
Date: Wed, 25 Jan 2012 14:32:51 -0800
|
|
Subject: [PATCH 83/87] zcache: fix deadlock condition
|
|
|
|
commit 9256a4789be3dae37d00924c03546ba7958ea5a3 upstream.
|
|
|
|
I discovered this deadlock condition awhile ago working on RAMster
|
|
but it affects zcache as well. The list spinlock must be
|
|
locked prior to the page spinlock and released after. As
|
|
a result, the page copy must also be done while the locks are held.
|
|
|
|
Applies to 3.2. Konrad, please push (via GregKH?)...
|
|
this is definitely a bug fix so need not be pushed during
|
|
a -rc0 window.
|
|
|
|
Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com>
|
|
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/staging/zcache/zcache-main.c | 7 +++----
|
|
1 files changed, 3 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/drivers/staging/zcache/zcache-main.c b/drivers/staging/zcache/zcache-main.c
|
|
index d3a8e67..f5e469d 100644
|
|
--- a/drivers/staging/zcache/zcache-main.c
|
|
+++ b/drivers/staging/zcache/zcache-main.c
|
|
@@ -358,8 +358,8 @@ static struct zbud_hdr *zbud_create(uint16_t client_id, uint16_t pool_id,
|
|
if (unlikely(zbpg == NULL))
|
|
goto out;
|
|
/* ok, have a page, now compress the data before taking locks */
|
|
- spin_lock(&zbpg->lock);
|
|
spin_lock(&zbud_budlists_spinlock);
|
|
+ spin_lock(&zbpg->lock);
|
|
list_add_tail(&zbpg->bud_list, &zbud_unbuddied[nchunks].list);
|
|
zbud_unbuddied[nchunks].count++;
|
|
zh = &zbpg->buddy[0];
|
|
@@ -389,12 +389,11 @@ init_zh:
|
|
zh->oid = *oid;
|
|
zh->pool_id = pool_id;
|
|
zh->client_id = client_id;
|
|
- /* can wait to copy the data until the list locks are dropped */
|
|
- spin_unlock(&zbud_budlists_spinlock);
|
|
-
|
|
to = zbud_data(zh, size);
|
|
memcpy(to, cdata, size);
|
|
spin_unlock(&zbpg->lock);
|
|
+ spin_unlock(&zbud_budlists_spinlock);
|
|
+
|
|
zbud_cumul_chunk_counts[nchunks]++;
|
|
atomic_inc(&zcache_zbud_curr_zpages);
|
|
zcache_zbud_cumul_zpages++;
|
|
--
|
|
1.7.7.4
|
|
|