提交 1e72a8e8 编写于 作者: J Joe Thornber 提交者: Mike Snitzer

dm cache policy smq: handle races with queuing background_work

The background_tracker holds a set of promotions/demotions that the
cache policy wishes the core target to implement.

When adding a new operation to the tracker it's possible that an
operation on the same block is already present (but in practise this
doesn't appear to be happening).  Catch these situations and do the
appropriate cleanup.
Signed-off-by: NJoe Thornber <ejt@redhat.com>
Signed-off-by: NMike Snitzer <snitzer@redhat.com>
上级 23397844
...@@ -1174,12 +1174,16 @@ static void queue_writeback(struct smq_policy *mq) ...@@ -1174,12 +1174,16 @@ static void queue_writeback(struct smq_policy *mq)
work.cblock = infer_cblock(mq, e); work.cblock = infer_cblock(mq, e);
r = btracker_queue(mq->bg_work, &work, NULL); r = btracker_queue(mq->bg_work, &work, NULL);
WARN_ON_ONCE(r); // FIXME: finish, I think we have to get rid of this race. if (r) {
clear_pending(mq, e);
q_push_front(&mq->dirty, e);
}
} }
} }
static void queue_demotion(struct smq_policy *mq) static void queue_demotion(struct smq_policy *mq)
{ {
int r;
struct policy_work work; struct policy_work work;
struct entry *e; struct entry *e;
...@@ -1199,12 +1203,17 @@ static void queue_demotion(struct smq_policy *mq) ...@@ -1199,12 +1203,17 @@ static void queue_demotion(struct smq_policy *mq)
work.op = POLICY_DEMOTE; work.op = POLICY_DEMOTE;
work.oblock = e->oblock; work.oblock = e->oblock;
work.cblock = infer_cblock(mq, e); work.cblock = infer_cblock(mq, e);
btracker_queue(mq->bg_work, &work, NULL); r = btracker_queue(mq->bg_work, &work, NULL);
if (r) {
clear_pending(mq, e);
q_push_front(&mq->clean, e);
}
} }
static void queue_promotion(struct smq_policy *mq, dm_oblock_t oblock, static void queue_promotion(struct smq_policy *mq, dm_oblock_t oblock,
struct policy_work **workp) struct policy_work **workp)
{ {
int r;
struct entry *e; struct entry *e;
struct policy_work work; struct policy_work work;
...@@ -1234,7 +1243,9 @@ static void queue_promotion(struct smq_policy *mq, dm_oblock_t oblock, ...@@ -1234,7 +1243,9 @@ static void queue_promotion(struct smq_policy *mq, dm_oblock_t oblock,
work.op = POLICY_PROMOTE; work.op = POLICY_PROMOTE;
work.oblock = oblock; work.oblock = oblock;
work.cblock = infer_cblock(mq, e); work.cblock = infer_cblock(mq, e);
btracker_queue(mq->bg_work, &work, workp); r = btracker_queue(mq->bg_work, &work, workp);
if (r)
free_entry(&mq->cache_alloc, e);
} }
/*----------------------------------------------------------------*/ /*----------------------------------------------------------------*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册