From nobody Mon Apr 29 03:24:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555531014; cv=none; d=zoho.com; s=zohoarc; b=YDh2pSRjRslym5LqdE13PJ0xvx1Ueu3mHoAYptl0nBjMYlOtgygOpTf5xbOT8B070Xo5lZpYOU3bALP6x3HtgAhmz4qaCp70WREFBmUhgQY6OUvrPSArw7spGkkAyEcQUDIESAFE+N3LxHqK9G+kOW8bWRrPfoL4PoyNp30GOX0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555531014; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=kEM8cNQ+D6ok3rH1/UGlLSe9D0SHJxUm8cy6yRvajYA=; b=f0TIAqjfSRC3z6uPCFpNK0sxuP15WI8y5xmIsefGPoNlzsY+As1eWzXfz22JVpR5+I5R7QjenP3qhcjSzoINLD3VAI8sYyVOv98iNYc0am6PFQ47fDSV2WQ8wczZQzRR/euiiXm+VDY1B4TjjBHccVATaQSF0KFusFggKhDUg8s= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555531014526728.0810451260697; Wed, 17 Apr 2019 12:56:54 -0700 (PDT) Received: from localhost ([127.0.0.1]:58920 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hGqfr-0002RF-Gc for importer@patchew.org; Wed, 17 Apr 2019 15:56:51 -0400 Received: from eggs.gnu.org ([209.51.188.92]:43397) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hGqdK-0000YW-IJ for qemu-devel@nongnu.org; Wed, 17 Apr 2019 15:54:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hGqdJ-00070V-OH for qemu-devel@nongnu.org; Wed, 17 Apr 2019 15:54:14 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57550) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hGqdH-0006yd-LN; Wed, 17 Apr 2019 15:54:11 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E10572D80F; Wed, 17 Apr 2019 19:54:10 +0000 (UTC) Received: from maximlenovopc.usersys.redhat.com (unknown [10.35.206.34]) by smtp.corp.redhat.com (Postfix) with ESMTP id 043745D6A6; Wed, 17 Apr 2019 19:54:08 +0000 (UTC) From: Maxim Levitsky To: qemu-block@nongnu.org Date: Wed, 17 Apr 2019 22:53:51 +0300 Message-Id: <20190417195355.16123-2-mlevitsk@redhat.com> In-Reply-To: <20190417195355.16123-1-mlevitsk@redhat.com> References: <20190417195355.16123-1-mlevitsk@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 17 Apr 2019 19:54:10 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 1/5] block/nvme: don't flip CQ phase bits X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , Max Reitz , qemu-devel@nongnu.org, Maxim Levitsky Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Phase bits are only set by the hardware to indicate new completions and not by the device driver. Signed-off-by: Maxim Levitsky --- block/nvme.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/block/nvme.c b/block/nvme.c index 0684bbd077..2d208000df 100644 --- a/block/nvme.c +++ b/block/nvme.c @@ -340,8 +340,6 @@ static bool nvme_process_completion(BDRVNVMeState *s, N= VMeQueuePair *q) qemu_mutex_lock(&q->lock); c->cid =3D cpu_to_le16(0); q->inflight--; - /* Flip Phase Tag bit. */ - c->status =3D cpu_to_le16(le16_to_cpu(c->status) ^ 0x1); progress =3D true; } if (progress) { --=20 2.17.2 From nobody Mon Apr 29 03:24:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555530999; cv=none; d=zoho.com; s=zohoarc; b=OUv72Sub26v9ckr2pC+2t/3A9HnKvY7ZalJ+4tVPRcrSoNN0IgQUKjbclXXSlMaVOUkVS1bV1pWMoof6kx9il/35Qh8g8rGBSzT0SXiAkz0pKdoMbIbTmurO8PUWBIhwEDBmHT01B+XCAa7opsnlq3BIHIrn+bXsPKLmtkqSTfs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555530999; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=48PRL0uDcAkPlo9Zgc+lEMs3oanqMBSqMsPCzze73xY=; b=euprNm75XzG6BJVlJNqlqpN+qrf7WN7AvAZPUn2KvPO9qOnJHm3+WP5jCM5NRoqisk/zB972nWyn4tCFYEsjfzXv/Zp8XBqnZk4bmrQEORBpuf00YwjAK/I9fKQJtPHDBBbDEovb2chIy/NsxCgHM1DLFpLGH4PK7KE4nZl7H0M= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555530999202661.791531858064; Wed, 17 Apr 2019 12:56:39 -0700 (PDT) Received: from localhost ([127.0.0.1]:58918 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hGqfZ-0002Co-3Y for importer@patchew.org; Wed, 17 Apr 2019 15:56:33 -0400 Received: from eggs.gnu.org ([209.51.188.92]:43422) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hGqdM-0000aF-Gc for qemu-devel@nongnu.org; Wed, 17 Apr 2019 15:54:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hGqdL-00071r-Mp for qemu-devel@nongnu.org; Wed, 17 Apr 2019 15:54:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58856) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hGqdJ-000709-Oh; Wed, 17 Apr 2019 15:54:13 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F3C0C3001764; Wed, 17 Apr 2019 19:54:12 +0000 (UTC) Received: from maximlenovopc.usersys.redhat.com (unknown [10.35.206.34]) by smtp.corp.redhat.com (Postfix) with ESMTP id 49A715D6A6; Wed, 17 Apr 2019 19:54:11 +0000 (UTC) From: Maxim Levitsky To: qemu-block@nongnu.org Date: Wed, 17 Apr 2019 22:53:52 +0300 Message-Id: <20190417195355.16123-3-mlevitsk@redhat.com> In-Reply-To: <20190417195355.16123-1-mlevitsk@redhat.com> References: <20190417195355.16123-1-mlevitsk@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Wed, 17 Apr 2019 19:54:13 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 2/5] block/nvme: fix doorbell stride X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , Max Reitz , qemu-devel@nongnu.org, Maxim Levitsky Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Fix the math involving non standard doorbell stride Signed-off-by: Maxim Levitsky --- block/nvme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/nvme.c b/block/nvme.c index 2d208000df..208242cf1f 100644 --- a/block/nvme.c +++ b/block/nvme.c @@ -216,7 +216,7 @@ static NVMeQueuePair *nvme_create_queue_pair(BlockDrive= rState *bs, error_propagate(errp, local_err); goto fail; } - q->cq.doorbell =3D &s->regs->doorbells[idx * 2 * s->doorbell_scale + 1= ]; + q->cq.doorbell =3D &s->regs->doorbells[(idx * 2 + 1) * s->doorbell_sca= le]; =20 return q; fail: --=20 2.17.2 From nobody Mon Apr 29 03:24:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555531156; cv=none; d=zoho.com; s=zohoarc; b=ZvU0PI157zEr6hotxq4OCM+qW/glIJcTTbdYO/wx33iXcqATo7866Ig2YqjYrwDsyXjbkDMeyPsWhycycjhp+Hxseh9Zhw1BESbdJLULsoe8olEwQexiExS9SuniGrdyTAMwxsREU8D1Py4uwxjIJMcmKAAciUVc9SEnfSsR0rY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555531156; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=8kQ9u6yzNAgBjSaGuEnC5xysD1VUeStkJtKdEuPfiLU=; b=obN7WOcSU3z6zqvB19epvzU8O0LdWADNBXwNNBYkQW+tlj97s+fVTVXHhUDE8iKjTgMGrcq0UBuvAxSEWQh7CjCSbVTcS/N2U2T2k6u5ugVlJGg/eleypYcbOLG/JlkQWeCe4SaPbsc011JE2lgAs2S+E4gXifMLcFq/WN9wAZk= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555531156477514.4550276404161; Wed, 17 Apr 2019 12:59:16 -0700 (PDT) Received: from localhost ([127.0.0.1]:58949 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hGqi8-0004Pp-FO for importer@patchew.org; Wed, 17 Apr 2019 15:59:12 -0400 Received: from eggs.gnu.org ([209.51.188.92]:43469) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hGqdQ-0000d5-Bn for qemu-devel@nongnu.org; Wed, 17 Apr 2019 15:54:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hGqdP-00074O-8p for qemu-devel@nongnu.org; Wed, 17 Apr 2019 15:54:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55290) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hGqdL-00071T-QZ; Wed, 17 Apr 2019 15:54:16 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 141223199396; Wed, 17 Apr 2019 19:54:15 +0000 (UTC) Received: from maximlenovopc.usersys.redhat.com (unknown [10.35.206.34]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5D5375D6A6; Wed, 17 Apr 2019 19:54:13 +0000 (UTC) From: Maxim Levitsky To: qemu-block@nongnu.org Date: Wed, 17 Apr 2019 22:53:53 +0300 Message-Id: <20190417195355.16123-4-mlevitsk@redhat.com> In-Reply-To: <20190417195355.16123-1-mlevitsk@redhat.com> References: <20190417195355.16123-1-mlevitsk@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Wed, 17 Apr 2019 19:54:15 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 3/5] block/nvme: support larger that 512 bytes sector devices X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , Max Reitz , qemu-devel@nongnu.org, Maxim Levitsky Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Currently the driver hardcodes the sector size to 512, and doesn't check the underlying device Also fail if underlying nvme device is formatted with metadata as this needs special support. Signed-off-by: Maxim Levitsky --- block/nvme.c | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/block/nvme.c b/block/nvme.c index 208242cf1f..0b1da54574 100644 --- a/block/nvme.c +++ b/block/nvme.c @@ -101,8 +101,11 @@ typedef struct { size_t doorbell_scale; bool write_cache_supported; EventNotifier irq_notifier; + uint64_t nsze; /* Namespace size reported by identify command */ int nsid; /* The namespace id to read/write data. */ + size_t blkshift; + uint64_t max_transfer; bool plugged; =20 @@ -415,8 +418,9 @@ static void nvme_identify(BlockDriverState *bs, int nam= espace, Error **errp) BDRVNVMeState *s =3D bs->opaque; NvmeIdCtrl *idctrl; NvmeIdNs *idns; + NvmeLBAF *lbaf; uint8_t *resp; - int r; + int r, hwsect_size; uint64_t iova; NvmeCmd cmd =3D { .opcode =3D NVME_ADM_CMD_IDENTIFY, @@ -463,7 +467,22 @@ static void nvme_identify(BlockDriverState *bs, int na= mespace, Error **errp) } =20 s->nsze =3D le64_to_cpu(idns->nsze); + lbaf =3D &idns->lbaf[NVME_ID_NS_FLBAS_INDEX(idns->flbas)]; + + if (lbaf->ms) { + error_setg(errp, "Namespaces with metadata are not yet supported"); + goto out; + } + + hwsect_size =3D 1 << lbaf->ds; + + if (hwsect_size < BDRV_SECTOR_BITS || hwsect_size > s->page_size) { + error_setg(errp, "Namespace has unsupported block size (%d)", + hwsect_size); + goto out; + } =20 + s->blkshift =3D lbaf->ds; out: qemu_vfio_dma_unmap(s->vfio, resp); qemu_vfree(resp); @@ -782,8 +801,17 @@ fail: static int64_t nvme_getlength(BlockDriverState *bs) { BDRVNVMeState *s =3D bs->opaque; + return s->nsze << s->blkshift; +} + =20 - return s->nsze << BDRV_SECTOR_BITS; +static int nvme_probe_blocksizes(BlockDriverState *bs, BlockSizes *bsz) +{ + BDRVNVMeState *s =3D bs->opaque; + assert(s->blkshift >=3D 9); + bsz->phys =3D 1 << s->blkshift; + bsz->log =3D 1 << s->blkshift; + return 0; } =20 /* Called with s->dma_map_lock */ @@ -914,13 +942,14 @@ static coroutine_fn int nvme_co_prw_aligned(BlockDriv= erState *bs, BDRVNVMeState *s =3D bs->opaque; NVMeQueuePair *ioq =3D s->queues[1]; NVMeRequest *req; - uint32_t cdw12 =3D (((bytes >> BDRV_SECTOR_BITS) - 1) & 0xFFFF) | + + uint32_t cdw12 =3D (((bytes >> s->blkshift) - 1) & 0xFFFF) | (flags & BDRV_REQ_FUA ? 1 << 30 : 0); NvmeCmd cmd =3D { .opcode =3D is_write ? NVME_CMD_WRITE : NVME_CMD_READ, .nsid =3D cpu_to_le32(s->nsid), - .cdw10 =3D cpu_to_le32((offset >> BDRV_SECTOR_BITS) & 0xFFFFFFFF), - .cdw11 =3D cpu_to_le32(((offset >> BDRV_SECTOR_BITS) >> 32) & 0xFF= FFFFFF), + .cdw10 =3D cpu_to_le32((offset >> s->blkshift) & 0xFFFFFFFF), + .cdw11 =3D cpu_to_le32(((offset >> s->blkshift) >> 32) & 0xFFFFFFF= F), .cdw12 =3D cpu_to_le32(cdw12), }; NVMeCoData data =3D { @@ -1151,6 +1180,7 @@ static BlockDriver bdrv_nvme =3D { .bdrv_file_open =3D nvme_file_open, .bdrv_close =3D nvme_close, .bdrv_getlength =3D nvme_getlength, + .bdrv_probe_blocksizes =3D nvme_probe_blocksizes, =20 .bdrv_co_preadv =3D nvme_co_preadv, .bdrv_co_pwritev =3D nvme_co_pwritev, --=20 2.17.2 From nobody Mon Apr 29 03:24:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555530985; cv=none; d=zoho.com; s=zohoarc; b=VjhSMbpT82abDc2GXzuva3nxbJsD4ixswh7ZKR1yJuVnyn5kSzEMeS5W+iItUR+GEI4P7LybKZ08eiRQZ7abj5HVyXg3Vd4q45Fofcay5Tr4kmO1FKjscPfBMmApCtr4WUdQy84IqaBIampbgkUbOc25CtDARTE5ZvxAhKpVKCU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555530985; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=GEsuZzQwPtF0PeP/ZdrFRsJnfYZbAD+zdBTMo1sRO6M=; b=El+sN7l1DqvLcBNeDreZN463jqoMf449veghtqIQ+AvgEzSVr9dpxQy43BHiLRIsnlM33eUT32nxgJX3TGzxscwTps9ycQKdMkq3+hGQxHJYd0Oky/L7lGh507sHbUk2fiHL8RV9d92Js5CJkr8wCUbWccwXL5RH4aUv8/VCmNQ= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555530985386669.2936093453541; Wed, 17 Apr 2019 12:56:25 -0700 (PDT) Received: from localhost ([127.0.0.1]:58916 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hGqfO-0001w1-6J for importer@patchew.org; Wed, 17 Apr 2019 15:56:22 -0400 Received: from eggs.gnu.org ([209.51.188.92]:43494) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hGqdT-0000eX-31 for qemu-devel@nongnu.org; Wed, 17 Apr 2019 15:54:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hGqdR-00076A-Nq for qemu-devel@nongnu.org; Wed, 17 Apr 2019 15:54:23 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49298) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hGqdN-000734-U7; Wed, 17 Apr 2019 15:54:18 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 29980308FC20; Wed, 17 Apr 2019 19:54:17 +0000 (UTC) Received: from maximlenovopc.usersys.redhat.com (unknown [10.35.206.34]) by smtp.corp.redhat.com (Postfix) with ESMTP id 728535D6A6; Wed, 17 Apr 2019 19:54:15 +0000 (UTC) From: Maxim Levitsky To: qemu-block@nongnu.org Date: Wed, 17 Apr 2019 22:53:54 +0300 Message-Id: <20190417195355.16123-5-mlevitsk@redhat.com> In-Reply-To: <20190417195355.16123-1-mlevitsk@redhat.com> References: <20190417195355.16123-1-mlevitsk@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Wed, 17 Apr 2019 19:54:17 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 4/5] block/nvme: add support for write zeros X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , Max Reitz , qemu-devel@nongnu.org, Maxim Levitsky Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Maxim Levitsky --- block/nvme.c | 69 +++++++++++++++++++++++++++++++++++++++++++- block/trace-events | 1 + include/block/nvme.h | 19 +++++++++++- 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/block/nvme.c b/block/nvme.c index 0b1da54574..35b925899f 100644 --- a/block/nvme.c +++ b/block/nvme.c @@ -109,6 +109,8 @@ typedef struct { uint64_t max_transfer; bool plugged; =20 + bool supports_write_zeros; + CoMutex dma_map_lock; CoQueue dma_flush_queue; =20 @@ -457,6 +459,10 @@ static void nvme_identify(BlockDriverState *bs, int na= mespace, Error **errp) s->max_transfer =3D MIN_NON_ZERO(s->max_transfer, s->page_size / sizeof(uint64_t) * s->page_size); =20 + + + s->supports_write_zeros =3D (idctrl->oncs & NVME_ONCS_WRITE_ZEROS) != =3D 0; + memset(resp, 0, 4096); =20 cmd.cdw10 =3D 0; @@ -469,6 +475,11 @@ static void nvme_identify(BlockDriverState *bs, int na= mespace, Error **errp) s->nsze =3D le64_to_cpu(idns->nsze); lbaf =3D &idns->lbaf[NVME_ID_NS_FLBAS_INDEX(idns->flbas)]; =20 + if (NVME_ID_NS_DLFEAT_WRITE_ZEROS(idns->dlfeat) && + NVME_ID_NS_DLFEAT_READ_BEHAVIOR(idns->dlfeat) =3D=3D + NVME_ID_NS_DLFEAT_READ_BEHAVIOR_ZEROS) + bs->supported_write_flags |=3D BDRV_REQ_MAY_UNMAP; + if (lbaf->ms) { error_setg(errp, "Namespaces with metadata are not yet supported"); goto out; @@ -763,6 +774,8 @@ static int nvme_file_open(BlockDriverState *bs, QDict *= options, int flags, int ret; BDRVNVMeState *s =3D bs->opaque; =20 + bs->supported_write_flags =3D BDRV_REQ_FUA; + opts =3D qemu_opts_create(&runtime_opts, NULL, 0, &error_abort); qemu_opts_absorb_qdict(opts, options, &error_abort); device =3D qemu_opt_get(opts, NVME_BLOCK_OPT_DEVICE); @@ -791,7 +804,6 @@ static int nvme_file_open(BlockDriverState *bs, QDict *= options, int flags, goto fail; } } - bs->supported_write_flags =3D BDRV_REQ_FUA; return 0; fail: nvme_close(bs); @@ -1080,6 +1092,58 @@ static coroutine_fn int nvme_co_flush(BlockDriverSta= te *bs) } =20 =20 +static coroutine_fn int nvme_co_pwrite_zeroes(BlockDriverState *bs, + int64_t offset, int bytes, BdrvRequestFlags flags) +{ + BDRVNVMeState *s =3D bs->opaque; + NVMeQueuePair *ioq =3D s->queues[1]; + NVMeRequest *req; + + if (!s->supports_write_zeros) { + return -ENOTSUP; + } + + uint32_t cdw12 =3D ((bytes >> s->blkshift) - 1) & 0xFFFF; + + NvmeCmd cmd =3D { + .opcode =3D NVME_CMD_WRITE_ZEROS, + .nsid =3D cpu_to_le32(s->nsid), + .cdw10 =3D cpu_to_le32((offset >> s->blkshift) & 0xFFFFFFFF), + .cdw11 =3D cpu_to_le32(((offset >> s->blkshift) >> 32) & 0xFFFFFFF= F), + }; + + NVMeCoData data =3D { + .ctx =3D bdrv_get_aio_context(bs), + .ret =3D -EINPROGRESS, + }; + + if (flags & BDRV_REQ_MAY_UNMAP) { + cdw12 |=3D (1 << 25); + } + + if (flags & BDRV_REQ_FUA) { + cdw12 |=3D (1 << 30); + } + + cmd.cdw12 =3D cpu_to_le32(cdw12); + + trace_nvme_write_zeros(s, offset, bytes, flags); + assert(s->nr_queues > 1); + req =3D nvme_get_free_req(ioq); + assert(req); + + nvme_submit_command(s, ioq, req, &cmd, nvme_rw_cb, &data); + + data.co =3D qemu_coroutine_self(); + while (data.ret =3D=3D -EINPROGRESS) { + qemu_coroutine_yield(); + } + + trace_nvme_rw_done(s, true, offset, bytes, data.ret); + return data.ret; +} + + static int nvme_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue, Error **errp) { @@ -1184,6 +1248,9 @@ static BlockDriver bdrv_nvme =3D { =20 .bdrv_co_preadv =3D nvme_co_preadv, .bdrv_co_pwritev =3D nvme_co_pwritev, + + .bdrv_co_pwrite_zeroes =3D nvme_co_pwrite_zeroes, + .bdrv_co_flush_to_disk =3D nvme_co_flush, .bdrv_reopen_prepare =3D nvme_reopen_prepare, =20 diff --git a/block/trace-events b/block/trace-events index 7335a42540..943a58569f 100644 --- a/block/trace-events +++ b/block/trace-events @@ -144,6 +144,7 @@ nvme_submit_command_raw(int c0, int c1, int c2, int c3,= int c4, int c5, int c6, nvme_handle_event(void *s) "s %p" nvme_poll_cb(void *s) "s %p" nvme_prw_aligned(void *s, int is_write, uint64_t offset, uint64_t bytes, i= nt flags, int niov) "s %p is_write %d offset %"PRId64" bytes %"PRId64" flag= s %d niov %d" +nvme_write_zeros(void *s, uint64_t offset, uint64_t bytes, int flags) "s %= p offset %"PRId64" bytes %"PRId64" flags %d" nvme_qiov_unaligned(const void *qiov, int n, void *base, size_t size, int = align) "qiov %p n %d base %p size 0x%zx align 0x%x" nvme_prw_buffered(void *s, uint64_t offset, uint64_t bytes, int niov, int = is_write) "s %p offset %"PRId64" bytes %"PRId64" niov %d is_write %d" nvme_rw_done(void *s, int is_write, uint64_t offset, uint64_t bytes, int r= et) "s %p is_write %d offset %"PRId64" bytes %"PRId64" ret %d" diff --git a/include/block/nvme.h b/include/block/nvme.h index 0eae6f9f15..edf8e90557 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -653,12 +653,29 @@ typedef struct NvmeIdNs { uint8_t mc; uint8_t dpc; uint8_t dps; - uint8_t res30[98]; + + uint8_t nmic; + uint8_t rescap; + uint8_t fpi; + uint8_t dlfeat; + + uint8_t res30[94]; NvmeLBAF lbaf[16]; uint8_t res192[192]; uint8_t vs[3712]; } NvmeIdNs; =20 + +/*Deallocate Logical Block Features*/ +#define NVME_ID_NS_DLFEAT_GUARD_CRC(dlfeat) ((dlfeat) & 0x10) +#define NVME_ID_NS_DLFEAT_WRITE_ZEROS(dlfeat) ((dlfeat) & 0x04) + +#define NVME_ID_NS_DLFEAT_READ_BEHAVIOR(dlfeat) ((dlfeat) & 0x3) +#define NVME_ID_NS_DLFEAT_READ_BEHAVIOR_UNDEFINED 0 +#define NVME_ID_NS_DLFEAT_READ_BEHAVIOR_ZEROS 1 +#define NVME_ID_NS_DLFEAT_READ_BEHAVIOR_ONES 2 + + #define NVME_ID_NS_NSFEAT_THIN(nsfeat) ((nsfeat & 0x1)) #define NVME_ID_NS_FLBAS_EXTENDED(flbas) ((flbas >> 4) & 0x1) #define NVME_ID_NS_FLBAS_INDEX(flbas) ((flbas & 0xf)) --=20 2.17.2 From nobody Mon Apr 29 03:24:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555531148; cv=none; d=zoho.com; s=zohoarc; b=O9oyOl3U7PNELqUmFibQYM3gUBtS9dYDO3j5rTuzg68+uVHXQQXmTW4xzTpYC6WEPVUm4/6lmt3DVNx4RGX2jz6Rlg6/bGenPhAr9uyisd5MXi2M9A5LVrMG00EX973jnNdJ0JCwvdccro8vGnmZBA73/hpNxlSSSHdXHjKUUtY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555531148; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=BCRFsVAnWJBKjK+ewtlro6OtN1rtCyzGL1SWhxqlQUM=; b=XDOHvndpn5+YTQORb0zynPAgus0e643gaZhE5k4W4Zeeu4VknKHt0AdSVMyCLkAB60x9KOl6W44Am1wN4YGL4hOCPAxWNT0Ed178hgeOaoAOXD9OQIV1ST6z+4/exJScPJHCQrwEiyb4q505HmuFn2xDQfVKIs5TtfEOl84e9uY= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 155553114866075.1804340709624; Wed, 17 Apr 2019 12:59:08 -0700 (PDT) Received: from localhost ([127.0.0.1]:58947 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hGqhs-0004Eg-IZ for importer@patchew.org; Wed, 17 Apr 2019 15:58:56 -0400 Received: from eggs.gnu.org ([209.51.188.92]:43513) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hGqdT-0000hG-RU for qemu-devel@nongnu.org; Wed, 17 Apr 2019 15:54:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hGqdS-00076i-N8 for qemu-devel@nongnu.org; Wed, 17 Apr 2019 15:54:23 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55304) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hGqdQ-00074Z-0P; Wed, 17 Apr 2019 15:54:20 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3BE313199387; Wed, 17 Apr 2019 19:54:19 +0000 (UTC) Received: from maximlenovopc.usersys.redhat.com (unknown [10.35.206.34]) by smtp.corp.redhat.com (Postfix) with ESMTP id 867BE5D6A6; Wed, 17 Apr 2019 19:54:17 +0000 (UTC) From: Maxim Levitsky To: qemu-block@nongnu.org Date: Wed, 17 Apr 2019 22:53:55 +0300 Message-Id: <20190417195355.16123-6-mlevitsk@redhat.com> In-Reply-To: <20190417195355.16123-1-mlevitsk@redhat.com> References: <20190417195355.16123-1-mlevitsk@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Wed, 17 Apr 2019 19:54:19 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 5/5] block/nvme: add support for discard X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , Max Reitz , qemu-devel@nongnu.org, Maxim Levitsky Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Maxim Levitsky --- block/nvme.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++ block/trace-events | 2 ++ 2 files changed, 82 insertions(+) diff --git a/block/nvme.c b/block/nvme.c index 35b925899f..b83912c627 100644 --- a/block/nvme.c +++ b/block/nvme.c @@ -110,6 +110,7 @@ typedef struct { bool plugged; =20 bool supports_write_zeros; + bool supports_discard; =20 CoMutex dma_map_lock; CoQueue dma_flush_queue; @@ -462,6 +463,7 @@ static void nvme_identify(BlockDriverState *bs, int nam= espace, Error **errp) =20 =20 s->supports_write_zeros =3D (idctrl->oncs & NVME_ONCS_WRITE_ZEROS) != =3D 0; + s->supports_discard =3D (idctrl->oncs & NVME_ONCS_DSM) !=3D 0; =20 memset(resp, 0, 4096); =20 @@ -1144,6 +1146,83 @@ static coroutine_fn int nvme_co_pwrite_zeroes(BlockD= riverState *bs, } =20 =20 +static int coroutine_fn nvme_co_pdiscard(BlockDriverState *bs, + int64_t offset, int bytes) +{ + BDRVNVMeState *s =3D bs->opaque; + NVMeQueuePair *ioq =3D s->queues[1]; + NVMeRequest *req; + NvmeDsmRange *buf; + QEMUIOVector local_qiov; + int r; + + NvmeCmd cmd =3D { + .opcode =3D NVME_CMD_DSM, + .nsid =3D cpu_to_le32(s->nsid), + .cdw10 =3D 0, /*number of ranges - 0 based*/ + .cdw11 =3D cpu_to_le32(1 << 2), /*deallocate bit*/ + }; + + NVMeCoData data =3D { + .ctx =3D bdrv_get_aio_context(bs), + .ret =3D -EINPROGRESS, + }; + + if (!s->supports_discard) { + return -ENOTSUP; + } + + assert(s->nr_queues > 1); + + buf =3D qemu_try_blockalign0(bs, 4096); + if (!buf) { + return -ENOMEM; + } + + buf->nlb =3D bytes >> s->blkshift; + buf->slba =3D offset >> s->blkshift; + buf->cattr =3D 0; + + qemu_iovec_init(&local_qiov, 1); + qemu_iovec_add(&local_qiov, buf, 4096); + + req =3D nvme_get_free_req(ioq); + assert(req); + + qemu_co_mutex_lock(&s->dma_map_lock); + r =3D nvme_cmd_map_qiov(bs, &cmd, req, &local_qiov); + qemu_co_mutex_unlock(&s->dma_map_lock); + + if (r) { + req->busy =3D false; + return r; + } + + trace_nvme_dsm(s, offset, bytes); + + nvme_submit_command(s, ioq, req, &cmd, nvme_rw_cb, &data); + + data.co =3D qemu_coroutine_self(); + while (data.ret =3D=3D -EINPROGRESS) { + qemu_coroutine_yield(); + } + + qemu_co_mutex_lock(&s->dma_map_lock); + r =3D nvme_cmd_unmap_qiov(bs, &local_qiov); + qemu_co_mutex_unlock(&s->dma_map_lock); + if (r) { + return r; + } + + trace_nvme_dsm_done(s, offset, bytes, data.ret); + + qemu_iovec_destroy(&local_qiov); + qemu_vfree(buf); + return data.ret; + +} + + static int nvme_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue, Error **errp) { @@ -1250,6 +1329,7 @@ static BlockDriver bdrv_nvme =3D { .bdrv_co_pwritev =3D nvme_co_pwritev, =20 .bdrv_co_pwrite_zeroes =3D nvme_co_pwrite_zeroes, + .bdrv_co_pdiscard =3D nvme_co_pdiscard, =20 .bdrv_co_flush_to_disk =3D nvme_co_flush, .bdrv_reopen_prepare =3D nvme_reopen_prepare, diff --git a/block/trace-events b/block/trace-events index 943a58569f..e55ac5c40b 100644 --- a/block/trace-events +++ b/block/trace-events @@ -148,6 +148,8 @@ nvme_write_zeros(void *s, uint64_t offset, uint64_t byt= es, int flags) "s %p offs nvme_qiov_unaligned(const void *qiov, int n, void *base, size_t size, int = align) "qiov %p n %d base %p size 0x%zx align 0x%x" nvme_prw_buffered(void *s, uint64_t offset, uint64_t bytes, int niov, int = is_write) "s %p offset %"PRId64" bytes %"PRId64" niov %d is_write %d" nvme_rw_done(void *s, int is_write, uint64_t offset, uint64_t bytes, int r= et) "s %p is_write %d offset %"PRId64" bytes %"PRId64" ret %d" +nvme_dsm(void *s, uint64_t offset, uint64_t bytes) "s %p offset %"PRId64" = bytes %"PRId64"" +nvme_dsm_done(void *s, uint64_t offset, uint64_t bytes, int ret) "s %p off= set %"PRId64" bytes %"PRId64" ret %d" nvme_dma_map_flush(void *s) "s %p" nvme_free_req_queue_wait(void *q) "q %p" nvme_cmd_map_qiov(void *s, void *cmd, void *req, void *qiov, int entries) = "s %p cmd %p req %p qiov %p entries %d" --=20 2.17.2