From patchwork Thu Jul 2 09:24:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Javier_Gonz=C3=A1lez?= X-Patchwork-Id: 11638351 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 31DF9159A for ; Thu, 2 Jul 2020 09:25:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 18C2B20884 for ; Thu, 2 Jul 2020 09:25:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=javigon-com.20150623.gappssmtp.com header.i=@javigon-com.20150623.gappssmtp.com header.b="Eiz0lbAm" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727006AbgGBJZT (ORCPT ); Thu, 2 Jul 2020 05:25:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56630 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726092AbgGBJZS (ORCPT ); Thu, 2 Jul 2020 05:25:18 -0400 Received: from mail-ej1-x641.google.com (mail-ej1-x641.google.com [IPv6:2a00:1450:4864:20::641]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8AED4C08C5C1 for ; Thu, 2 Jul 2020 02:25:18 -0700 (PDT) Received: by mail-ej1-x641.google.com with SMTP id w6so28473418ejq.6 for ; Thu, 02 Jul 2020 02:25:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=RFQAZPjeEEYPnNvZUHiuMpATVhic2B+bZ8De7e+nmoI=; b=Eiz0lbAmK2GuapskPcLetUryfUEnrhbufhFxX+2rC0p89cws92fGcolnElsigE062O 42STEJ0EaxP+HGZjgYn2sA2VXzKeQmaGDZly3yGtEfZx4rvPKrlSpLBCf0EejmGJLsx4 bGhDx7WZz+Rz16H34AsqNZ+oX5ncXFR4IYAAhlxIwlNpWjmfUV3cYDvAJfLstA7wpBOy LTPx9bhOiQJ6Aeaw9g1fDQ8Ep3umS74Wkk6JbaMlrVeAm/BETjGAI7DhLJ2Btx+69X53 cmoiMyYc3EiIiujXbnX5nnQ9A+MfagAg1Gq8R05I33L1gvBMrfc6spvnnWlMldiCqX1U VM8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=RFQAZPjeEEYPnNvZUHiuMpATVhic2B+bZ8De7e+nmoI=; b=LicTHTpyFGD1Sh4DJ0M1qptkLVczlmn9/rrVPrJwM7sLIPEuMIzUIpXJ/RnEkQiCFZ PYoStdmfvK4kqNMwq6GeBWejdfEhNVrip72se2BgV263crRxTc6PZP/qOeuq7JpqjGJB r5E8v8fyJRQotafunKNKEFZGt0vMbJfhL+96Rnag8y8y2+KJ20cgsYmrkX8f9r73Lamz 1fXA39ndWAXk3zcjiFJ8EL0mEdX2FY2fjGoxe753UoNFNKOodSE59lTTkCi3ORc09Aka H2LAgcHaYiwClp0AtvPbgapIZ8IcH7iMHGiT84JJ1/wDvWgBdiDG9p7i7IWsYCwezNpz CLag== X-Gm-Message-State: AOAM532cLvA9PPZLwsw6BXmiNlo7glPl1dscDjuExsciZ+cJ/FPQzYHf medCunh//r80ojULIjPUY/hxUQ== X-Google-Smtp-Source: ABdhPJynySCUYW9OcsHXk9q3JwHz0Wmor0c6AIMY6LxpHHERrZ9Q1QmtUZAnZR2fonz7CQR0wbc2+g== X-Received: by 2002:a17:906:924d:: with SMTP id c13mr20309117ejx.518.1593681917258; Thu, 02 Jul 2020 02:25:17 -0700 (PDT) Received: from localhost.localdomain ([194.62.217.57]) by smtp.gmail.com with ESMTPSA id b18sm6569464ejl.52.2020.07.02.02.25.16 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 02 Jul 2020 02:25:16 -0700 (PDT) From: =?utf-8?q?Javier_Gonz=C3=A1lez?= To: linux-nvme@lists.infradead.org Cc: linux-block@vger.kernel.org, hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@kernel.dk, Damien.LeMoal@wdc.com, mb@lightnvm.io, Johannes.Thumshirn@wdc.com, =?utf-8?q?Javier_Gonz=C3=A1lez?= , SelvaKumar S , Kanchan Joshi , Nitesh Shetty Subject: [PATCH v3 1/4] block: Add zone flags to queue zone prop. Date: Thu, 2 Jul 2020 11:24:35 +0200 Message-Id: <20200702092438.63717-2-javier@javigon.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200702092438.63717-1-javier@javigon.com> References: <20200702092438.63717-1-javier@javigon.com> MIME-Version: 1.0 Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org From: Javier González As the zoned block device will have to deal with features that are optional for the backend device, add a flag field to inform the block layer about supported features. This builds on top of blk_zone_report_flags and extendes to the zone report code. Signed-off-by: Javier González Signed-off-by: SelvaKumar S Signed-off-by: Kanchan Joshi Signed-off-by: Nitesh Shetty --- block/blk-zoned.c | 3 ++- drivers/block/null_blk_zoned.c | 2 ++ drivers/nvme/host/zns.c | 1 + drivers/scsi/sd.c | 2 ++ include/linux/blkdev.h | 3 +++ 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/block/blk-zoned.c b/block/blk-zoned.c index 81152a260354..0f156e96e48f 100644 --- a/block/blk-zoned.c +++ b/block/blk-zoned.c @@ -312,7 +312,8 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode, return ret; rep.nr_zones = ret; - rep.flags = BLK_ZONE_REP_CAPACITY; + rep.flags = q->zone_flags; + if (copy_to_user(argp, &rep, sizeof(struct blk_zone_report))) return -EFAULT; return 0; diff --git a/drivers/block/null_blk_zoned.c b/drivers/block/null_blk_zoned.c index b05832eb21b2..957c2103f240 100644 --- a/drivers/block/null_blk_zoned.c +++ b/drivers/block/null_blk_zoned.c @@ -78,6 +78,8 @@ int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q) } q->limits.zoned = BLK_ZONED_HM; + q->zone_flags = BLK_ZONE_REP_CAPACITY; + blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q); blk_queue_required_elevator_features(q, ELEVATOR_F_ZBD_SEQ_WRITE); diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c index c08f6281b614..afe62dc27ff7 100644 --- a/drivers/nvme/host/zns.c +++ b/drivers/nvme/host/zns.c @@ -81,6 +81,7 @@ int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns, } q->limits.zoned = BLK_ZONED_HM; + q->zone_flags = BLK_ZONE_REP_CAPACITY; blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q); free_data: kfree(id); diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index d90fefffe31b..b9c920bace28 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -2967,6 +2967,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp) if (sdkp->device->type == TYPE_ZBC) { /* Host-managed */ q->limits.zoned = BLK_ZONED_HM; + q->zone_flags = BLK_ZONE_REP_CAPACITY; } else { sdkp->zoned = (buffer[8] >> 4) & 3; if (sdkp->zoned == 1 && !disk_has_partitions(sdkp->disk)) { @@ -2983,6 +2984,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp) "Drive-managed SMR disk\n"); } } + if (blk_queue_is_zoned(q) && sdkp->first_scan) sd_printk(KERN_NOTICE, sdkp, "Host-%s zoned block device\n", q->limits.zoned == BLK_ZONED_HM ? "managed" : "aware"); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 8fd900998b4e..3f2e3425fa53 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -512,12 +512,15 @@ struct request_queue { * Stacking drivers (device mappers) may or may not initialize * these fields. * + * Flags represent features as described by blk_zone_report_flags in blkzoned.h + * * Reads of this information must be protected with blk_queue_enter() / * blk_queue_exit(). Modifying this information is only allowed while * no requests are being processed. See also blk_mq_freeze_queue() and * blk_mq_unfreeze_queue(). */ unsigned int nr_zones; + unsigned int zone_flags; unsigned long *conv_zones_bitmap; unsigned long *seq_zones_wlock; #endif /* CONFIG_BLK_DEV_ZONED */ From patchwork Thu Jul 2 09:24:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Javier_Gonz=C3=A1lez?= X-Patchwork-Id: 11638353 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 66D1A6C1 for ; Thu, 2 Jul 2020 09:25:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 45DBB20771 for ; Thu, 2 Jul 2020 09:25:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=javigon-com.20150623.gappssmtp.com header.i=@javigon-com.20150623.gappssmtp.com header.b="lp5YikEv" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727921AbgGBJZU (ORCPT ); Thu, 2 Jul 2020 05:25:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726092AbgGBJZU (ORCPT ); Thu, 2 Jul 2020 05:25:20 -0400 Received: from mail-ed1-x541.google.com (mail-ed1-x541.google.com [IPv6:2a00:1450:4864:20::541]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AAE17C08C5C1 for ; Thu, 2 Jul 2020 02:25:19 -0700 (PDT) Received: by mail-ed1-x541.google.com with SMTP id a8so21681838edy.1 for ; Thu, 02 Jul 2020 02:25:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HP9ZU4c5mMewSGM3BDAdlue75oae6XIhcuq6h8w4GLc=; b=lp5YikEvUaavhxnWbW5PiUXDFLBn6Qu1tMctE+KIIWcfO5vHR2t7ynLozmxpVsWLIn 3PcaI3QJeWplIq+iax3nB1WP1FFt9DjzzdQzSOtIfaZyj9MpXKONS1VfrD0Olul0s4lQ krSn8HzIYBAastnbQPr9eY2mGb34lMXzAv6G6fl5xbcQM65+A8szM7HdGCf0qrKeBRNc 9scOrNL8+EFwddt60ae3Dg6D56Y1xhKvkbjQB14d9U2/DlQHsgvti/VbdQkA9n7nn+pd cetvDZab5exI7ghXIpO8W5Etb/9bVBoDo7b1jtLyqEE+FfVgHCoaDzXiA/dmvUiS+sZ/ Hj3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HP9ZU4c5mMewSGM3BDAdlue75oae6XIhcuq6h8w4GLc=; b=aRum9oE7e3d+RlUr6o0E21jJqYDMA8nGH9o+1wmpq+FfN6c7HVeFcqN0853OPGRK8g dvuRDdet4naAfIdt0+ptnOY/jTFkJvm8sJGZKEVslD9dgP3M34LbQTJny0BRDY6p6Ft+ EjeIlvgOF4mWcvqY5hoZLKD8HJJS8iQTLSWFq4G7rxk97kdvtz6oTJJQNLDavEZH5gC8 adhG5+8Y0JDAanUaC77pKTndcftaVmG3BxTK/Tg0ZrJupqlZdDae6WFukOAnp+vpzzgS E5eG2uL3qv0wN5XlFdK+Y0zyIGm0TxA9tT/GyK9xHyyd3GRcb1MDpmHUlc82zYoDPA8E C9bQ== X-Gm-Message-State: AOAM533i59IfBtmvoLXWycELjg4bh1mSrnoct7kR+qpYzJAhzVsPxl5C 7eXR5K0dWV5QHWr3CgGgz1CfDA== X-Google-Smtp-Source: ABdhPJy+cVgNo/BmuGac5AmZFP6rVVM2ink2VAsrJ7uDsRcPkXIh6wb5nBmJeyxh4ImSp2zkILbriw== X-Received: by 2002:a50:c8c9:: with SMTP id k9mr32651126edh.157.1593681918452; Thu, 02 Jul 2020 02:25:18 -0700 (PDT) Received: from localhost.localdomain ([194.62.217.57]) by smtp.gmail.com with ESMTPSA id b18sm6569464ejl.52.2020.07.02.02.25.17 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 02 Jul 2020 02:25:17 -0700 (PDT) From: =?utf-8?q?Javier_Gonz=C3=A1lez?= To: linux-nvme@lists.infradead.org Cc: linux-block@vger.kernel.org, hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@kernel.dk, Damien.LeMoal@wdc.com, mb@lightnvm.io, Johannes.Thumshirn@wdc.com, =?utf-8?q?Javier_Gonz=C3=A1lez?= , SelvaKumar S , Kanchan Joshi , Nitesh Shetty Subject: [PATCH v3 2/4] block: add support for zone offline transition Date: Thu, 2 Jul 2020 11:24:36 +0200 Message-Id: <20200702092438.63717-3-javier@javigon.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200702092438.63717-1-javier@javigon.com> References: <20200702092438.63717-1-javier@javigon.com> MIME-Version: 1.0 Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org From: Javier González Add support for offline transition on the zoned block device. Use the existing feature flags for the underlying driver to report support for the feature, as currently this transition is only supported in ZNS and not in ZAC/ZBC Signed-off-by: Javier González Signed-off-by: SelvaKumar S Signed-off-by: Kanchan Joshi Signed-off-by: Nitesh Shetty --- block/blk-core.c | 2 ++ block/blk-zoned.c | 8 +++++++- drivers/nvme/host/core.c | 3 +++ drivers/nvme/host/zns.c | 2 +- include/linux/blk_types.h | 3 +++ include/linux/blkdev.h | 1 - include/uapi/linux/blkzoned.h | 6 ++++++ 7 files changed, 22 insertions(+), 3 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 03252af8c82c..589cbdacc5ec 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -140,6 +140,7 @@ static const char *const blk_op_name[] = { REQ_OP_NAME(ZONE_CLOSE), REQ_OP_NAME(ZONE_FINISH), REQ_OP_NAME(ZONE_APPEND), + REQ_OP_NAME(ZONE_OFFLINE), REQ_OP_NAME(WRITE_SAME), REQ_OP_NAME(WRITE_ZEROES), REQ_OP_NAME(SCSI_IN), @@ -1030,6 +1031,7 @@ generic_make_request_checks(struct bio *bio) case REQ_OP_ZONE_OPEN: case REQ_OP_ZONE_CLOSE: case REQ_OP_ZONE_FINISH: + case REQ_OP_ZONE_OFFLINE: if (!blk_queue_is_zoned(q)) goto not_supported; break; diff --git a/block/blk-zoned.c b/block/blk-zoned.c index 0f156e96e48f..def43ef2b021 100644 --- a/block/blk-zoned.c +++ b/block/blk-zoned.c @@ -320,7 +320,8 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode, } /* - * BLKRESETZONE, BLKOPENZONE, BLKCLOSEZONE and BLKFINISHZONE ioctl processing. + * BLKRESETZONE, BLKOPENZONE, BLKCLOSEZONE, BLKFINISHZONE and BLKOFFLINEZONE + * ioctl processing. * Called from blkdev_ioctl. */ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode, @@ -363,6 +364,11 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode, case BLKFINISHZONE: op = REQ_OP_ZONE_FINISH; break; + case BLKOFFLINEZONE: + if (!(q->zone_flags & BLK_ZONE_SUP_OFFLINE)) + return -ENOTTY; + op = REQ_OP_ZONE_OFFLINE; + break; default: return -ENOTTY; } diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index e5f754889234..1f5c7fc3d2c9 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -776,6 +776,9 @@ blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req, case REQ_OP_ZONE_FINISH: ret = nvme_setup_zone_mgmt_send(ns, req, cmd, NVME_ZONE_FINISH); break; + case REQ_OP_ZONE_OFFLINE: + ret = nvme_setup_zone_mgmt_send(ns, req, cmd, NVME_ZONE_OFFLINE); + break; case REQ_OP_WRITE_ZEROES: ret = nvme_setup_write_zeroes(ns, req, cmd); break; diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c index afe62dc27ff7..bb6a33f52d53 100644 --- a/drivers/nvme/host/zns.c +++ b/drivers/nvme/host/zns.c @@ -81,7 +81,7 @@ int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns, } q->limits.zoned = BLK_ZONED_HM; - q->zone_flags = BLK_ZONE_REP_CAPACITY; + q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_SUP_OFFLINE; blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q); free_data: kfree(id); diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index ccb895f911b1..c0123c643e2f 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -316,6 +316,8 @@ enum req_opf { REQ_OP_ZONE_FINISH = 12, /* write data at the current zone write pointer */ REQ_OP_ZONE_APPEND = 13, + /* Transition a zone to offline */ + REQ_OP_ZONE_OFFLINE = 14, /* SCSI passthrough using struct scsi_request */ REQ_OP_SCSI_IN = 32, @@ -455,6 +457,7 @@ static inline bool op_is_zone_mgmt(enum req_opf op) case REQ_OP_ZONE_OPEN: case REQ_OP_ZONE_CLOSE: case REQ_OP_ZONE_FINISH: + case REQ_OP_ZONE_OFFLINE: return true; default: return false; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 3f2e3425fa53..e489b646486d 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -370,7 +370,6 @@ extern int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg); extern int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg); - #else /* CONFIG_BLK_DEV_ZONED */ static inline unsigned int blkdev_nr_zones(struct gendisk *disk) diff --git a/include/uapi/linux/blkzoned.h b/include/uapi/linux/blkzoned.h index 42c3366cc25f..8b7c4705cef7 100644 --- a/include/uapi/linux/blkzoned.h +++ b/include/uapi/linux/blkzoned.h @@ -77,9 +77,14 @@ enum blk_zone_cond { * enum blk_zone_report_flags - Feature flags of reported zone descriptors. * * @BLK_ZONE_REP_CAPACITY: Zone descriptor has capacity field. + * @BLK_ZONE_SUP_OFFLINE : Zone device supports explicit offline transition. */ enum blk_zone_report_flags { + /* Report feature flags */ BLK_ZONE_REP_CAPACITY = (1 << 0), + + /* Supported capabilities */ + BLK_ZONE_SUP_OFFLINE = (1 << 1), }; /** @@ -166,5 +171,6 @@ struct blk_zone_range { #define BLKOPENZONE _IOW(0x12, 134, struct blk_zone_range) #define BLKCLOSEZONE _IOW(0x12, 135, struct blk_zone_range) #define BLKFINISHZONE _IOW(0x12, 136, struct blk_zone_range) +#define BLKOFFLINEZONE _IOW(0x12, 137, struct blk_zone_range) #endif /* _UAPI_BLKZONED_H */ From patchwork Thu Jul 2 09:24:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Javier_Gonz=C3=A1lez?= X-Patchwork-Id: 11638355 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AB0616C1 for ; Thu, 2 Jul 2020 09:25:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 93D5E20884 for ; Thu, 2 Jul 2020 09:25:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=javigon-com.20150623.gappssmtp.com header.i=@javigon-com.20150623.gappssmtp.com header.b="yA+ecdF0" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728277AbgGBJZW (ORCPT ); Thu, 2 Jul 2020 05:25:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56638 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726092AbgGBJZV (ORCPT ); Thu, 2 Jul 2020 05:25:21 -0400 Received: from mail-ej1-x643.google.com (mail-ej1-x643.google.com [IPv6:2a00:1450:4864:20::643]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E92D0C08C5C1 for ; Thu, 2 Jul 2020 02:25:20 -0700 (PDT) Received: by mail-ej1-x643.google.com with SMTP id ga4so28414529ejb.11 for ; Thu, 02 Jul 2020 02:25:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=cAmJ/Zf7T+fcjgZyRga2M0NL/BcX+6gWE28VkxPctQQ=; b=yA+ecdF0MKqvSnlvD1xL45nrJ0zLStVUHAckg2WybnGxj6SK7eut+56N5TLtxONncM tC59Wy7XLrR4nZcbixSk7gwMOSCXgSGNIXeH0Ap9Ul2YtON7PR2ye1uGVh9Vzt8F195H CM4jmbj5QdGMF1mxEuy/ovR6A9M/if8SKdZDoq94m+HbzX4iPNMCJObH68yQa32kezce moJsn4/We7du7fghrkIu1+aeMt4n90zFI1JrnAIQLdaaXUDkmwfUEgLjFSrMzNj1Bo7/ dlWuh3LAOCcbwdO+5RpGwWY6puQHiVduqW3qiJv+6dElekvuHLZTLYjK2eqV2BuXfQa4 0G3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=cAmJ/Zf7T+fcjgZyRga2M0NL/BcX+6gWE28VkxPctQQ=; b=GaMqnUO1J0jn92i2TH088vTMwCOT3fNFzCBFuGYH/QQBxrE+uLnqQi2RIdXI7DKdaZ O1kFC1MHXftgpw1krUULa51XjpXEYoJHB/AO1g525Mwwp5S3TICueyObtJudSO+zgDrS UWDum13k7ii7bmVRjLy27J3ZcqQQKIbSX9VgfH1ZT7RNNvl+lvn8qGbqN1lT6vgiFLQY 8XKKHVb6v4GNTfrzYGNZnRE8u1PwNcMZtPvC8XMuNCoT4p707GjqPs2MDWlJQ7AviUmc o0LE9/P6cRu1HBFK/XSKkqUwpYCLzcHo1WM8lauKwni3ceJ3z/bBoiQQ3M+EiQLTvjgU 49tw== X-Gm-Message-State: AOAM530GH+mPKKk5CgeH9kl93YdJxCd/pYZRgaeX/qMphYOtpSNF9xSm rjMPQffkmPYIXlPgA9MTxEke/Q== X-Google-Smtp-Source: ABdhPJzJ5uSLlUU5QX1Eokd0XUUtn7xhOsOpkXZMNG7F65sNWszBNng61gY8N/jOiGyrGyQvMJTi1w== X-Received: by 2002:a17:907:41dc:: with SMTP id og20mr2553300ejb.183.1593681919699; Thu, 02 Jul 2020 02:25:19 -0700 (PDT) Received: from localhost.localdomain ([194.62.217.57]) by smtp.gmail.com with ESMTPSA id b18sm6569464ejl.52.2020.07.02.02.25.18 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 02 Jul 2020 02:25:19 -0700 (PDT) From: =?utf-8?q?Javier_Gonz=C3=A1lez?= To: linux-nvme@lists.infradead.org Cc: linux-block@vger.kernel.org, hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@kernel.dk, Damien.LeMoal@wdc.com, mb@lightnvm.io, Johannes.Thumshirn@wdc.com, =?utf-8?q?Javier_Gonz=C3=A1lez?= , SelvaKumar S , Kanchan Joshi , Nitesh Shetty Subject: [PATCH v3 3/4] nvme: Add consistency check for zone count Date: Thu, 2 Jul 2020 11:24:37 +0200 Message-Id: <20200702092438.63717-4-javier@javigon.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200702092438.63717-1-javier@javigon.com> References: <20200702092438.63717-1-javier@javigon.com> MIME-Version: 1.0 Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org From: Javier González Since the number of zones is calculated through the reported device capacity and the ZNS specification allows to report the total number of zones in the device, add an extra check to guarantee consistency between the device and the kernel. Also, fix a checkpatch warning: unsigned -> unsigned int in the process Signed-off-by: Javier González Signed-off-by: SelvaKumar S Signed-off-by: Kanchan Joshi Signed-off-by: Nitesh Shetty --- drivers/nvme/host/core.c | 2 +- drivers/nvme/host/nvme.h | 6 ++++-- drivers/nvme/host/zns.c | 39 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 1f5c7fc3d2c9..8b9c69172931 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1994,7 +1994,7 @@ static int __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id) case NVME_CSI_NVM: break; case NVME_CSI_ZNS: - ret = nvme_update_zone_info(disk, ns, lbaf); + ret = nvme_update_zone_info(disk, ns, lbaf, le64_to_cpu(id->nsze)); if (ret) return ret; break; diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 662f95fbd909..0c208f6cd335 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -407,6 +407,7 @@ struct nvme_ns { u32 sws; u8 pi_type; #ifdef CONFIG_BLK_DEV_ZONED + u64 nr_zones; u64 zsze; #endif unsigned long features; @@ -700,7 +701,7 @@ static inline void nvme_mpath_start_freeze(struct nvme_subsystem *subsys) #ifdef CONFIG_BLK_DEV_ZONED int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns, - unsigned lbaf); + unsigned int lbaf, sector_t nsze); int nvme_report_zones(struct gendisk *disk, sector_t sector, unsigned int nr_zones, report_zones_cb cb, void *data); @@ -720,7 +721,8 @@ static inline blk_status_t nvme_setup_zone_mgmt_send(struct nvme_ns *ns, static inline int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns, - unsigned lbaf) + unsigned int lbaf, + sector_t nsze) { dev_warn(ns->ctrl->device, "Please enable CONFIG_BLK_DEV_ZONED to support ZNS devices\n"); diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c index bb6a33f52d53..daf0d91bcdf6 100644 --- a/drivers/nvme/host/zns.c +++ b/drivers/nvme/host/zns.c @@ -32,13 +32,36 @@ static int nvme_set_max_append(struct nvme_ctrl *ctrl) return 0; } +static u64 nvme_zns_nr_zones(struct nvme_ns *ns) +{ + struct nvme_command c = { }; + struct nvme_zone_report report; + int buflen = sizeof(struct nvme_zone_report); + int ret; + + c.zmr.opcode = nvme_cmd_zone_mgmt_recv; + c.zmr.nsid = cpu_to_le32(ns->head->ns_id); + c.zmr.slba = cpu_to_le64(0); + c.zmr.numd = cpu_to_le32(nvme_bytes_to_numd(buflen)); + c.zmr.zra = NVME_ZRA_ZONE_REPORT; + c.zmr.zrasf = NVME_ZRASF_ZONE_REPORT_ALL; + c.zmr.pr = 0; + + ret = nvme_submit_sync_cmd(ns->queue, &c, &report, buflen); + if (ret) + return ret; + + return le64_to_cpu(report.nr_zones); +} + int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns, - unsigned lbaf) + unsigned int lbaf, sector_t nsze) { struct nvme_effects_log *log = ns->head->effects; struct request_queue *q = disk->queue; struct nvme_command c = { }; struct nvme_id_ns_zns *id; + sector_t cap_nr_zones; int status; /* Driver requires zone append support */ @@ -80,6 +103,20 @@ int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns, goto free_data; } + ns->nr_zones = nvme_zns_nr_zones(ns); + if (!ns->nr_zones) { + status = -EINVAL; + goto free_data; + } + + cap_nr_zones = nvme_lba_to_sect(ns, le64_to_cpu(nsze)) >> ilog2(ns->zsze); + if (ns->nr_zones != cap_nr_zones) { + dev_err(ns->ctrl->device, "inconsistent zone count: %llu/%llu\n", + ns->nr_zones, cap_nr_zones); + status = -EINVAL; + goto free_data; + } + q->limits.zoned = BLK_ZONED_HM; q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_SUP_OFFLINE; blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q); From patchwork Thu Jul 2 09:24:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Javier_Gonz=C3=A1lez?= X-Patchwork-Id: 11638357 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 73B476C1 for ; Thu, 2 Jul 2020 09:25:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 58F6D2088E for ; Thu, 2 Jul 2020 09:25:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=javigon-com.20150623.gappssmtp.com header.i=@javigon-com.20150623.gappssmtp.com header.b="foGWa1ds" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726092AbgGBJZX (ORCPT ); Thu, 2 Jul 2020 05:25:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56646 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728184AbgGBJZW (ORCPT ); Thu, 2 Jul 2020 05:25:22 -0400 Received: from mail-ed1-x541.google.com (mail-ed1-x541.google.com [IPv6:2a00:1450:4864:20::541]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 264CDC08C5C1 for ; Thu, 2 Jul 2020 02:25:22 -0700 (PDT) Received: by mail-ed1-x541.google.com with SMTP id dg28so22871753edb.3 for ; Thu, 02 Jul 2020 02:25:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=seRLkTJ1ew4YebKz5kRgT9SUY7OCSuZACxJCKoWfuZU=; b=foGWa1dsgrf7XlkYun30ylm+oVae2e0vGCrDEY5d+yLiehK3nXxUKrq94J0D6UZGfO A5IkWYJ2ie2kUDHv1jyVIP0NklwVMJS0vBb3CXHU04K73WGCo1sCGKcNNW56WNUZNqHq cUQskNEhasm+hFP0VQamaDobvqMr9h5sotB6Hf3Zliy2TEvCpKuhSuYk75BjKFBl0pWX SPGh5qLgn95pKj4hFpPVZEvSoYSJUAEl9Vi07OFZMY7cmH+Dmgdb7NuGq52/DPyLdUQ4 xpwmH7dU3ghroDzNRO1uGM5Nq66F9ncYt/yFDSLwP5LTwNglE1tuga8v2buo9OuZRQ9g wg1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=seRLkTJ1ew4YebKz5kRgT9SUY7OCSuZACxJCKoWfuZU=; b=iOAk0x8UJ1/osw8W4e0U1YmiLjIbXH2mVBtffMeytdXEOigZQJBLmduQUw/hFyjOSc wfGBh7S2if2J/EtJZoHt7Ql5P0COfMvzO+25IaxRi6y5YgQk1F2wWbecPENS5koLleNi N2/u1MvrtUNrwgwtJp9QoUJU1lW7aPoimqL7bomxbWFGeU5GfHP8mwIHZRNAaLXIcA4P AS5AzCZeovfdUCoDae+gTDzn7FDoccYr6HJIpRPYzUmtjb5K+8aLGjBQ19eCvLCv0DDy UZDwHCYhwE2GkBlruwSb0zloxRbPJWp26GICerSaXarXzKatunRBEKALY8YTUAWkYWLo uUFw== X-Gm-Message-State: AOAM532jjl027loTNclBr8FhkiN9EDGBsCCl90tMkwZiCO8/G6wIpu3L xI5ltmFLQTacsrv42FYXn2KdeA== X-Google-Smtp-Source: ABdhPJxTEh6o6QgeknmvbHZn321/KVXjaNE5zNnvEz1twZV4AdY5tcuAThmt+lLBqhFL79C5Yj0YuA== X-Received: by 2002:a05:6402:1d18:: with SMTP id dg24mr34180761edb.33.1593681920863; Thu, 02 Jul 2020 02:25:20 -0700 (PDT) Received: from localhost.localdomain ([194.62.217.57]) by smtp.gmail.com with ESMTPSA id b18sm6569464ejl.52.2020.07.02.02.25.19 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 02 Jul 2020 02:25:20 -0700 (PDT) From: =?utf-8?q?Javier_Gonz=C3=A1lez?= To: linux-nvme@lists.infradead.org Cc: linux-block@vger.kernel.org, hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@kernel.dk, Damien.LeMoal@wdc.com, mb@lightnvm.io, Johannes.Thumshirn@wdc.com, =?utf-8?q?Javier_Gonz=C3=A1lez?= , SelvaKumar S , Kanchan Joshi , Nitesh Shetty Subject: [PATCH v3 4/4] block: add attributes to zone report Date: Thu, 2 Jul 2020 11:24:38 +0200 Message-Id: <20200702092438.63717-5-javier@javigon.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200702092438.63717-1-javier@javigon.com> References: <20200702092438.63717-1-javier@javigon.com> MIME-Version: 1.0 Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org From: Javier González Add zone attributes field to the blk_zone structure. Use ZNS attributes as base for zoned block devices and add the current atributes in ZAC/ZBC. Signed-off-by: Javier González Signed-off-by: SelvaKumar S Signed-off-by: Kanchan Joshi Signed-off-by: Nitesh Shetty --- drivers/nvme/host/zns.c | 3 ++- drivers/scsi/sd.c | 2 +- drivers/scsi/sd_zbc.c | 8 ++++++-- include/uapi/linux/blkzoned.h | 26 +++++++++++++++++++++++++- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c index daf0d91bcdf6..926904d1827b 100644 --- a/drivers/nvme/host/zns.c +++ b/drivers/nvme/host/zns.c @@ -118,7 +118,7 @@ int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns, } q->limits.zoned = BLK_ZONED_HM; - q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_SUP_OFFLINE; + q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_REP_CAPACITY | BLK_ZONE_SUP_OFFLINE; blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q); free_data: kfree(id); @@ -197,6 +197,7 @@ static int nvme_zone_parse_entry(struct nvme_ns *ns, zone.capacity = nvme_lba_to_sect(ns, le64_to_cpu(entry->zcap)); zone.start = nvme_lba_to_sect(ns, le64_to_cpu(entry->zslba)); zone.wp = nvme_lba_to_sect(ns, le64_to_cpu(entry->wp)); + zone.attr = entry->za; return cb(&zone, idx, data); } diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index b9c920bace28..63270598aa76 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -2967,7 +2967,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp) if (sdkp->device->type == TYPE_ZBC) { /* Host-managed */ q->limits.zoned = BLK_ZONED_HM; - q->zone_flags = BLK_ZONE_REP_CAPACITY; + q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_REP_ATTR; } else { sdkp->zoned = (buffer[8] >> 4) & 3; if (sdkp->zoned == 1 && !disk_has_partitions(sdkp->disk)) { diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c index 183a20720da9..51c7f82b59c5 100644 --- a/drivers/scsi/sd_zbc.c +++ b/drivers/scsi/sd_zbc.c @@ -53,10 +53,14 @@ static int sd_zbc_parse_report(struct scsi_disk *sdkp, u8 *buf, zone.type = buf[0] & 0x0f; zone.cond = (buf[1] >> 4) & 0xf; - if (buf[1] & 0x01) + if (buf[1] & 0x01) { + zone.attr |= BLK_ZONE_ATTR_NRW; zone.reset = 1; - if (buf[1] & 0x02) + } + if (buf[1] & 0x02) { + zone.attr |= BLK_ZONE_ATTR_NSQ; zone.non_seq = 1; + } zone.len = logical_to_sectors(sdp, get_unaligned_be64(&buf[8])); zone.capacity = zone.len; diff --git a/include/uapi/linux/blkzoned.h b/include/uapi/linux/blkzoned.h index 8b7c4705cef7..b48b8cb129a2 100644 --- a/include/uapi/linux/blkzoned.h +++ b/include/uapi/linux/blkzoned.h @@ -77,16 +77,39 @@ enum blk_zone_cond { * enum blk_zone_report_flags - Feature flags of reported zone descriptors. * * @BLK_ZONE_REP_CAPACITY: Zone descriptor has capacity field. + * @BLK_ZONE_REP_ATTR: Zone attributes reported. * @BLK_ZONE_SUP_OFFLINE : Zone device supports explicit offline transition. */ enum blk_zone_report_flags { /* Report feature flags */ BLK_ZONE_REP_CAPACITY = (1 << 0), + BLK_ZONE_REP_ATTR = (1 << 2), /* Supported capabilities */ BLK_ZONE_SUP_OFFLINE = (1 << 1), }; +/** + * enum blk_zone_attr - Zone Attributes + * + * Attributes of the zone. Reported in struct blk_zone -> attr + * + * @BLK_ZONE_ATTR_ZFC: Zone Finished by Controller due to a zone active excursion + * @BLK_ZONE_ATTR_FZR: Finish Zone Recommended required by controller + * @BLK_ZONE_ATTR_RZR: Reset Zone Recommended required by controller + * @BLK_ZONE_ATTR_NSQ: Non Sequential zone + * @BLK_ZONE_ATTR_NRW: Need Reset Write Pointer required by controller + * @BLK_ZONE_ATTR_ZDEV: Zone Descriptor Extension Valid in zone report + */ +enum blk_zone_attr { + BLK_ZONE_ATTR_ZFC = 1 << 0, + BLK_ZONE_ATTR_FZR = 1 << 1, + BLK_ZONE_ATTR_RZR = 1 << 2, + BLK_ZONE_ATTR_NSQ = 1 << 3, + BLK_ZONE_ATTR_NRW = 1 << 4, + BLK_ZONE_ATTR_ZDEV = 1 << 7, +}; + /** * struct blk_zone - Zone descriptor for BLKREPORTZONE ioctl. * @@ -113,7 +136,8 @@ struct blk_zone { __u8 cond; /* Zone condition */ __u8 non_seq; /* Non-sequential write resources active */ __u8 reset; /* Reset write pointer recommended */ - __u8 resv[4]; + __u8 attr; /* Zone attributes */ + __u8 resv[3]; __u64 capacity; /* Zone capacity in number of sectors */ __u8 reserved[24]; };