Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp4062692pxb; Mon, 27 Sep 2021 08:37:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz9tQXvGkZuGGX/As6ZDDYrrtlueCFbF2236MPAsk7Cff+ezfFcRlp1nBcQH19hweJrOGLH X-Received: by 2002:a50:cfc1:: with SMTP id i1mr567908edk.251.1632757069925; Mon, 27 Sep 2021 08:37:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632757069; cv=none; d=google.com; s=arc-20160816; b=ZhUEErY4ajqHkjs33knvPqFWOT4eb6tIYHy8fmQeQzNZDOdU6S3vwSjQIMDr6PEI0y gFCxnZwGSiVl1ayk2mwl/hIyURjEQ8zfmaY0BZaptZGiWX6rQl0tk1Re81yhRD2mmBGd nQJoJc4kLP8FCzRUftEkbOXIpomhMvMB9IxYBMBrWk+ofrw0oFHPWHhzRsRQsq+S4mVT tJ4IJE6aY3+GITiUpAsuVg9Sm/J0FGEA0Lr4lRLRigbp4VxFBs8bPKI9kZXoWci0jbEJ JbKfWL2QFLe21kF4mbNQqSQ8sIrN65SVpudwEJcoboJcpRLZcF+ckL9bNq1aVBwBi33f Gf7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=Xuu+FO2/4FD6w2J1cJMTNbiona40VhXiulrng+90tuI=; b=Z9JAF+5SDDhUJL42YRSamEv/hu6T/YApY2SDTsXBesJX4/g8mxL0E7XK66PfwPb6aO U4BMFxsedVOqj9fEIs6doV1w1/D0uhEonNgkr3JW/CDxmB2SdEd8J+5n9+sg2EWcxe25 CUAM7atI9T9/4XHpUcRu/25Lykzil9gl4XpxfQwn/b7jZZkuvkX+mCze+HZvlXMerOGo DIgbiMdRYBquHaV57ojKQPKE6cJ2jVawzBWNQU9E+Ai3/B1jqc2SD5naeFkck9k55shN QFM0+TgPVPrKRS+oHCzr2ZT6grrqT/9JeWhHg+X/sVhVWe+M0NDylAX6PkznDrlOhO1D mVcA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="Bbe6MG/s"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id x17si17299555eds.602.2021.09.27.08.37.22; Mon, 27 Sep 2021 08:37:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="Bbe6MG/s"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235213AbhI0PhU (ORCPT + 99 others); Mon, 27 Sep 2021 11:37:20 -0400 Received: from mail.kernel.org ([198.145.29.99]:41948 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234622AbhI0PhT (ORCPT ); Mon, 27 Sep 2021 11:37:19 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 43B40604DB; Mon, 27 Sep 2021 15:35:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1632756941; bh=Q9+I4wEImnOLr+V45cPev4boT5DC7GTCSjTGy4LHB8c=; h=From:To:Cc:Subject:Date:From; b=Bbe6MG/sIZlfd7j0Z7SWSkQNRe1rilXRFw6/rELmbymUmfJWXEPwYOcTIZdx+knMf mwl/ee5Ww5G5z1hWB2agF3rSHWiW+vpdgdtdeDfr1sqvAEurWy78Kj9MgjTw9KSgaA bTaTR3DR9D/0fWVatQa1zelJi6Lz03f/iF6k0oCZv687v7Iu9NHYC6AmHpB4+uPo2S iabiS62MQKVXD6HJHQAD4mAi4LkW9gOmj1abjn4V6Lv7KseWbHntQxbZnAyLY9Elyw ajlBTWDu3R0BpxQ0rQnHPSkMGKFJ+l1xud/nuZImTQ2SaBb6ilyPJWK0cCLL8Rbs3v pwecnp8mbF8gw== From: Keith Busch To: linux-nvme@lists.infradead.org, sagi@grimberg.me, hch@lst.de Cc: linux-kernel@vger.kernel.org, Keith Busch , Sven Peter , Orlando Chamberlain , Aditya Garg Subject: [PATCH] nvme: add command id quirk for apple controllers Date: Mon, 27 Sep 2021 08:35:39 -0700 Message-Id: <20210927153539.372986-1-kbusch@kernel.org> X-Mailer: git-send-email 2.25.4 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some apple controllers use the command id as an index to implementation specific data structures and will fail if the value is out of bounds. The nvme driver's recently introduced command sequence number breaks this controller. Provide a quirk so these spec incompliant controllers can function as before. The driver will not have the ability to detect bad completions when this quirk is used, but we weren't previously checking this anyway. The quirk bit was selected so that it can readily apply to stable. Fixes: e7006de6c2380 ("nvme: code command_id with a genctr for use-after-free validation") Link: https://bugzilla.kernel.org/show_bug.cgi?id=214509 Cc: Sven Peter Reported-by: Orlando Chamberlain Reported-by: Aditya Garg Signed-off-by: Keith Busch --- drivers/nvme/host/core.c | 4 +++- drivers/nvme/host/nvme.h | 6 ++++++ drivers/nvme/host/pci.c | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index e486845d2c7e..afbd47e16293 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -978,6 +978,7 @@ EXPORT_SYMBOL_GPL(nvme_cleanup_cmd); blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req) { struct nvme_command *cmd = nvme_req(req)->cmd; + struct nvme_ctrl *ctrl = nvme_req(req)->ctrl; blk_status_t ret = BLK_STS_OK; if (!(req->rq_flags & RQF_DONTPREP)) { @@ -1026,7 +1027,8 @@ blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req) return BLK_STS_IOERR; } - nvme_req(req)->genctr++; + if (!ctrl->quirks & NVME_QUIRK_SKIP_CID_GEN) + nvme_req(req)->genctr++; cmd->common.command_id = nvme_cid(req); trace_nvme_setup_cmd(req, cmd); return ret; diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 9871c0c9374c..ed79a6c7e804 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -138,6 +138,12 @@ enum nvme_quirks { * 48 bits. */ NVME_QUIRK_DMA_ADDRESS_BITS_48 = (1 << 16), + + /* + * The controller requires the command_id value be be limited, so skip + * encoding the generation sequence number. + */ + NVME_QUIRK_SKIP_CID_GEN = (1 << 17), }; /* diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index b82492cd7503..456a0e8a5718 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -3369,7 +3369,8 @@ static const struct pci_device_id nvme_id_table[] = { { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2005), .driver_data = NVME_QUIRK_SINGLE_VECTOR | NVME_QUIRK_128_BYTES_SQES | - NVME_QUIRK_SHARED_TAGS }, + NVME_QUIRK_SHARED_TAGS | + NVME_QUIRK_SKIP_CID_GEN }, { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_EXPRESS, 0xffffff) }, { 0, } -- 2.25.4