[dm-devel] [PATCH 06/24] dm cache policy mq: return NULL if mq->free list is empty in alloc_entry

Mike Snitzer snitzer at redhat.com
Fri Oct 25 20:44:43 UTC 2013


On Fri, Oct 25 2013 at 12:37pm -0400,
Alasdair G Kergon <agk at redhat.com> wrote:

> On Thu, Oct 24, 2013 at 02:30:19PM -0400, Mike Snitzer wrote:
> > From: Heinz Mauelshagen <heinzm at redhat.com>
> > Addresses callers' (insert_in*cache()) requirement that alloc_entry()
> > return NULL when an entry isn't able to be allocated.
>  
> What is the code path that leads to the requirement for this patch?
> 
> > +++ b/drivers/md/dm-cache-policy-mq.c
> >  static struct entry *alloc_entry(struct mq_policy *mq)
> 
> > +	struct entry *e = NULL;
> >  
> >  	if (mq->nr_entries_allocated >= mq->nr_entries) {
> >  		BUG_ON(!list_empty(&mq->free));
> >  		return NULL;
> >  	}
> >  
> > -	e = list_entry(list_pop(&mq->free), struct entry, list);
> > -	INIT_LIST_HEAD(&e->list);
> > -	INIT_HLIST_NODE(&e->hlist);
> > +	if (!list_empty(&mq->free)) {
> > +		e = list_entry(list_pop(&mq->free), struct entry, list);
> > +		INIT_LIST_HEAD(&e->list);
> > +		INIT_HLIST_NODE(&e->hlist);
> > +		mq->nr_entries_allocated++;
> > +	}
> 
> In other words, under what circumstances is mq->nr_entries_allocated
> less then mq->nr_entries, yet the mq->free list is empty?
> 
> Is it better to apply a patch like this, or rather to fix whatever situation
> leads to those circumstances?  Has the bug/race always been there or is it a
> regression?

Fair questions, Heinz should explain further.

IIRC this change was needed as a prereq for the conversion of his
out-of-tree "background" policy to a shim (layered ontop of mq).

So will drop for now, can revisit if/when the need is clearer (e.g. when
background policy goes upstream).  TBD if we need it in the near-term,
but will table this for now.  Dropping patch until more context from
Heinz is provided.




More information about the dm-devel mailing list