Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752095AbbEVEPS (ORCPT ); Fri, 22 May 2015 00:15:18 -0400 Received: from mail-ie0-f177.google.com ([209.85.223.177]:35519 "EHLO mail-ie0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750798AbbEVEPR (ORCPT ); Fri, 22 May 2015 00:15:17 -0400 MIME-Version: 1.0 In-Reply-To: References: <1432253553-17045-1-git-send-email-parav.pandit@avagotech.com> Date: Fri, 22 May 2015 09:45:16 +0530 Message-ID: Subject: Re: [PATCH] NVMe: Avoid interrupt disable during queue init. From: Parav Pandit To: Keith Busch Cc: linux-nvme@lists.infradead.org, Matthew Wilcox , Jens Axboe , linux-kernel@vger.kernel.org Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1310 Lines: 41 On Fri, May 22, 2015 at 1:04 AM, Keith Busch wrote: > On Thu, 21 May 2015, Parav Pandit wrote: >> >> Avoid diabling interrupt and holding q_lock for the queue >> which is just getting initialized. >> >> With this change, online_queues is also incremented without >> lock during queue setup stage. >> if Power management nvme_suspend() kicks in during queue setup time, >> per nvmeq based q_lock spinlock cannot protect device wide >> online_queues variable anyway. > > > The q_lock is held to protect polling from reading inconsistent data. ah, yes. I can see the nvme_kthread can poll the CQ while its getting created through the nvme_resume(). I think this opens up other issue. nvme_kthread() should, Instead of, struct nvme_queue *nvmeq = dev->queues[i]; it should do, struct nvme_queue *nvmeq = rcu_dereference(dev->queues[i]); And, nvme_alloc_queue() dev->queues[qid] = nvmeq; should be, rcu_assign_pointer(dev->queues[qid], nvmeq); Otherwise nvme_kthread could get stale value for elements of nvmeq. I will send patch for fix. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/