From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965829AbcAZNMf (ORCPT ); Tue, 26 Jan 2016 08:12:35 -0500 Received: from mail-wm0-f42.google.com ([74.125.82.42]:34591 "EHLO mail-wm0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965035AbcAZNMc (ORCPT ); Tue, 26 Jan 2016 08:12:32 -0500 Subject: Re: [PATCH] lightnvm: update closed list out of interrupt context To: =?UTF-8?Q?Javier_Gonz=c3=a1lez?= References: <1453723113-30664-1-git-send-email-javier@javigon.com> Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, =?UTF-8?Q?Javier_Gonz=c3=a1lez?= From: =?UTF-8?Q?Matias_Bj=c3=b8rling?= Message-ID: <56A770BD.8050602@lightnvm.io> Date: Tue, 26 Jan 2016 14:12:29 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: <1453723113-30664-1-git-send-email-javier@javigon.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > --- > 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".