From: "Matias Bjørling" <mb@lightnvm.io>
To: "Javier González" <jg@lightnvm.io>
Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org,
"Javier González" <javier@cnexlabs.com>
Subject: Re: [PATCH] lightnvm: update closed list out of interrupt context
Date: Tue, 26 Jan 2016 14:12:29 +0100 [thread overview]
Message-ID: <56A770BD.8050602@lightnvm.io> (raw)
In-Reply-To: <1453723113-30664-1-git-send-email-javier@javigon.com>
On 01/25/2016 12:58 PM, Javier González wrote:
> When an I/O finishes, full blocks are moved from the open to the closed
> list - a lock is taken to protect the list. This happens at the moment
> in the interrupt context, which is not correct.
>
> This patch moves this logic to the GC workqueue instead, thus avoiding
> holding a spinlock in an atomic context.
>
> Signed-off-by: Javier González <javier@cnexlabs.com>
> ---
> drivers/lightnvm/rrpc.c | 23 ++++++++++-------------
> 1 file changed, 10 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
> index d8c7595..e2710da 100644
> --- a/drivers/lightnvm/rrpc.c
> +++ b/drivers/lightnvm/rrpc.c
> @@ -497,12 +497,21 @@ static void rrpc_gc_queue(struct work_struct *work)
> struct rrpc *rrpc = gcb->rrpc;
> struct rrpc_block *rblk = gcb->rblk;
> struct nvm_lun *lun = rblk->parent->lun;
> + struct nvm_block *blk = rblk->parent;
> struct rrpc_lun *rlun = &rrpc->luns[lun->id - rrpc->lun_offset];
>
> spin_lock(&rlun->lock);
> list_add_tail(&rblk->prio, &rlun->prio_list);
> spin_unlock(&rlun->lock);
>
> + spin_lock(&lun->lock);
> + lun->nr_open_blocks--;
> + lun->nr_closed_blocks++;
> + blk->state &= ~NVM_BLK_ST_OPEN;
> + blk->state |= NVM_BLK_ST_CLOSED;
> + list_move_tail(&rblk->list, &rlun->closed_list);
> + spin_unlock(&lun->lock);
> +
> mempool_free(gcb, rrpc->gcb_pool);
> pr_debug("nvm: block '%lu' is full, allow GC (sched)\n",
> rblk->parent->id);
> @@ -666,20 +675,8 @@ static void rrpc_end_io_write(struct rrpc *rrpc, struct rrpc_rq *rrqd,
> lun = rblk->parent->lun;
>
> cmnt_size = atomic_inc_return(&rblk->data_cmnt_size);
> - if (unlikely(cmnt_size == rrpc->dev->pgs_per_blk)) {
> - struct nvm_block *blk = rblk->parent;
> - struct rrpc_lun *rlun = rblk->rlun;
> -
> - spin_lock(&lun->lock);
> - lun->nr_open_blocks--;
> - lun->nr_closed_blocks++;
> - blk->state &= ~NVM_BLK_ST_OPEN;
> - blk->state |= NVM_BLK_ST_CLOSED;
> - list_move_tail(&rblk->list, &rlun->closed_list);
> - spin_unlock(&lun->lock);
> -
> + if (unlikely(cmnt_size == rrpc->dev->pgs_per_blk))
> rrpc_run_gc(rrpc, rblk);
> - }
> }
> }
>
>
Thanks, applied. I have updated the patch text a bit and added Fixes:
field to mark the patch a fix for the ff0e498b "lightnvm: manage open
and closed blocks separately".
prev parent reply other threads:[~2016-01-26 13:12 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-25 11:58 [PATCH] lightnvm: update closed list out of interrupt context Javier González
2016-01-26 13:12 ` Matias Bjørling [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56A770BD.8050602@lightnvm.io \
--to=mb@lightnvm.io \
--cc=javier@cnexlabs.com \
--cc=jg@lightnvm.io \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.