From nobody Fri Apr 3 08:56:15 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1576ECAAA1 for ; Thu, 15 Sep 2022 16:49:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229953AbiIOQtF (ORCPT ); Thu, 15 Sep 2022 12:49:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49914 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229881AbiIOQs6 (ORCPT ); Thu, 15 Sep 2022 12:48:58 -0400 Received: from mail-pg1-x52a.google.com (mail-pg1-x52a.google.com [IPv6:2607:f8b0:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 037947FF88 for ; Thu, 15 Sep 2022 09:48:45 -0700 (PDT) Received: by mail-pg1-x52a.google.com with SMTP id g4so17877748pgc.0 for ; Thu, 15 Sep 2022 09:48:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date; bh=8dGdE7yXwxpNJrtc0jzeOng2rxu8z4FK39IlQ5rLaw4=; b=EbErGLA/VINLfRbp4zcUbZBx85wcqmWWZ+b0wvu85Q2UUUeZQBQzI+ibcnOvQrL1/1 SpTBeWGXbbH7aJQQssASqOwJ392q4ULOBRqDM6uMUsq9W98Jxjsk1XvASOhF/X7whgnI cQc9io4mtSftKYU7SXF5cXqbt8EGpd2/X9S3E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date; bh=8dGdE7yXwxpNJrtc0jzeOng2rxu8z4FK39IlQ5rLaw4=; b=czYaXjn5EhMhDQ9pxNA2F4JE9Ah8TyAU69Cq+Pnfeww6VzXtibSg+I5as/1/WoIUqg vzdfQMLOOuerzHL1WC9gU0TCEbXrqYkSGY6rDCKjpP1kXGOdYV/wjTmKfnMWjwdikzMc 6ISAOvv8ftV+IBWG/qfywxpXyZOCl9YPpmaoU0Sd2j664I6PKLrLg8ppkdOsWSqsvegR AIvZr/y6DtNEw5EVfm1T9E8BdkfN5lYWwsNmecmDtEVO6yTbTJzMzKqNGSivqdv2bM0T RB9dIjlCBtRFTUInDBgfqIencEtIHDzuBv72FaG03sDIteck0lNrAovkMlEawVy+OHE3 dhrA== X-Gm-Message-State: ACrzQf2SRysYvwafcAfo7szTUlhxpKjtmNHrlHQpITKasx2ZpgqQKDOx 6IF7eAaQpI8EQBd/mFaOEkKyAw== X-Google-Smtp-Source: AMsMyM4ZjbUOIq/Q41w/OvvKUkmXpRr0bP+C56mI+0JSOF5eLhseKC9OgxfT03jMUgCb5sBQJ9O12g== X-Received: by 2002:a63:1d25:0:b0:437:ec38:bd0e with SMTP id d37-20020a631d25000000b00437ec38bd0emr675973pgd.478.1663260525220; Thu, 15 Sep 2022 09:48:45 -0700 (PDT) Received: from sarthakkukreti-glaptop.hsd1.ca.comcast.net ([2601:647:4200:b5b0:3af2:34b2:a98a:a652]) by smtp.gmail.com with ESMTPSA id o4-20020a170902bcc400b00177ee563b6dsm13174970pls.33.2022.09.15.09.48.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Sep 2022 09:48:44 -0700 (PDT) From: Sarthak Kukreti X-Google-Original-From: Sarthak Kukreti To: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org Cc: Jens Axboe , "Michael S . Tsirkin" , Jason Wang , Paolo Bonzini , Stefan Hajnoczi , Alasdair Kergon , Mike Snitzer , Theodore Ts'o , Andreas Dilger , Bart Van Assche , Daniil Lunev , Evan Green , Gwendal Grignou , Sarthak Kukreti Subject: [PATCH RFC 3/8] virtio_blk: Add support for provision requests Date: Thu, 15 Sep 2022 09:48:21 -0700 Message-Id: <20220915164826.1396245-4-sarthakkukreti@google.com> X-Mailer: git-send-email 2.37.2.789.g6183377224-goog In-Reply-To: <20220915164826.1396245-1-sarthakkukreti@google.com> References: <20220915164826.1396245-1-sarthakkukreti@google.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Sarthak Kukreti Adds support for provision requests. Provision requests act like the inverse of discards. Signed-off-by: Sarthak Kukreti --- drivers/block/virtio_blk.c | 48 +++++++++++++++++++++++++++++++++ include/uapi/linux/virtio_blk.h | 9 +++++++ 2 files changed, 57 insertions(+) diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 30255fcaf181..eacc2bffe1d1 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -178,6 +178,39 @@ static int virtblk_setup_discard_write_zeroes(struct r= equest *req, bool unmap) return 0; } =20 +static int virtblk_setup_provision(struct request *req) +{ + unsigned short segments =3D blk_rq_nr_discard_segments(req); + unsigned short n =3D 0; + + struct virtio_blk_discard_write_zeroes *range; + struct bio *bio; + u32 flags =3D 0; + + range =3D kmalloc_array(segments, sizeof(*range), GFP_ATOMIC); + if (!range) + return -ENOMEM; + + __rq_for_each_bio(bio, req) { + u64 sector =3D bio->bi_iter.bi_sector; + u32 num_sectors =3D bio->bi_iter.bi_size >> SECTOR_SHIFT; + + range[n].flags =3D cpu_to_le32(flags); + range[n].num_sectors =3D cpu_to_le32(num_sectors); + range[n].sector =3D cpu_to_le64(sector); + n++; + } + + WARN_ON_ONCE(n !=3D segments); + + req->special_vec.bv_page =3D virt_to_page(range); + req->special_vec.bv_offset =3D offset_in_page(range); + req->special_vec.bv_len =3D sizeof(*range) * segments; + req->rq_flags |=3D RQF_SPECIAL_PAYLOAD; + + return 0; +} + static void virtblk_unmap_data(struct request *req, struct virtblk_req *vb= r) { if (blk_rq_nr_phys_segments(req)) @@ -243,6 +276,9 @@ static blk_status_t virtblk_setup_cmd(struct virtio_dev= ice *vdev, case REQ_OP_DRV_IN: type =3D VIRTIO_BLK_T_GET_ID; break; + case REQ_OP_PROVISION: + type =3D VIRTIO_BLK_T_PROVISION; + break; default: WARN_ON_ONCE(1); return BLK_STS_IOERR; @@ -256,6 +292,11 @@ static blk_status_t virtblk_setup_cmd(struct virtio_de= vice *vdev, return BLK_STS_RESOURCE; } =20 + if (type =3D=3D VIRTIO_BLK_T_PROVISION) { + if (virtblk_setup_provision(req)) + return BLK_STS_RESOURCE; + } + return 0; } =20 @@ -1075,6 +1116,12 @@ static int virtblk_probe(struct virtio_device *vdev) blk_queue_max_write_zeroes_sectors(q, v ? v : UINT_MAX); } =20 + if (virtio_has_feature(vdev, VIRTIO_BLK_F_PROVISION)) { + virtio_cread(vdev, struct virtio_blk_config, + max_provision_sectors, &v); + q->limits.max_provision_sectors =3D v ? v : UINT_MAX; + } + virtblk_update_capacity(vblk, false); virtio_device_ready(vdev); =20 @@ -1177,6 +1224,7 @@ static unsigned int features[] =3D { VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE, VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_TOPOLOGY, VIRTIO_BLK_F_CONFIG_WCE, VIRTIO_BLK_F_MQ, VIRTIO_BLK_F_DISCARD, VIRTIO_BLK_F_WRITE_ZEROES, + VIRTIO_BLK_F_PROVISION, }; =20 static struct virtio_driver virtio_blk =3D { diff --git a/include/uapi/linux/virtio_blk.h b/include/uapi/linux/virtio_bl= k.h index d888f013d9ff..184f8cf6d185 100644 --- a/include/uapi/linux/virtio_blk.h +++ b/include/uapi/linux/virtio_blk.h @@ -40,6 +40,7 @@ #define VIRTIO_BLK_F_MQ 12 /* support more than one vq */ #define VIRTIO_BLK_F_DISCARD 13 /* DISCARD is supported */ #define VIRTIO_BLK_F_WRITE_ZEROES 14 /* WRITE ZEROES is supported */ +#define VIRTIO_BLK_F_PROVISION 15 /* provision is supported */ =20 /* Legacy feature bits */ #ifndef VIRTIO_BLK_NO_LEGACY @@ -120,6 +121,11 @@ struct virtio_blk_config { */ __u8 write_zeroes_may_unmap; =20 + /* + * The maximum number of sectors in a provision request. + */ + __virtio32 max_provision_sectors; + __u8 unused1[3]; } __attribute__((packed)); =20 @@ -155,6 +161,9 @@ struct virtio_blk_config { /* Write zeroes command */ #define VIRTIO_BLK_T_WRITE_ZEROES 13 =20 +/* Provision command */ +#define VIRTIO_BLK_T_PROVISION 14 + #ifndef VIRTIO_BLK_NO_LEGACY /* Barrier before this op. */ #define VIRTIO_BLK_T_BARRIER 0x80000000 --=20 2.31.0