From nobody Mon Oct 6 20:26:59 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1561390476; cv=none; d=zoho.com; s=zohoarc; b=euAzUYLWOQIK8U7o7eiRXxmyfbotNYEV1wyXHKi5tZnundGbr2fhejAbwPSgSdvIy/uL2h3tk4LKhQCzMhxr3B/fwjNkSatB9sWqsbOwcROotoK2K7KOwBWcrX7Ahbj63b0hWJzQ0u6EKsuCUS3lGk4YarRVxRBhWWju7bfQoa0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1561390476; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Ulz/NBJ+4Bm+sTlR2WdfGeOrhMuOseOKXqZI5fUUagg=; b=b6Y7hRIsbdKfkgsvG5vYFkt8Y3CiLZxgpVvHE7G/fWTQUIrTVNsiFHnWtATD6m7eVMTiMuORmFtZwRoMt1Ev2TVD/MPTx5aVC1rZxheMLt9YMHFy0zFMVZuvj12XSKxjkHXN/lxIEq8ES6qf8rdXgsY+FkR3AvsovSxLR/vRTg4= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1561390476175131.18648012787855; Mon, 24 Jun 2019 08:34:36 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hfQy0-00024X-1e; Mon, 24 Jun 2019 15:33:12 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hfQxz-00024D-35 for xen-devel@lists.xenproject.org; Mon, 24 Jun 2019 15:33:11 +0000 Received: from esa3.hc3370-68.iphmx.com (unknown [216.71.145.155]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 5e75be73-9695-11e9-8980-bc764e045a96; Mon, 24 Jun 2019 15:33:09 +0000 (UTC) X-Inumbo-ID: 5e75be73-9695-11e9-8980-bc764e045a96 Authentication-Results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=anthony.perard@citrix.com; spf=Pass smtp.mailfrom=anthony.perard@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of anthony.perard@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="anthony.perard@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa3.hc3370-68.iphmx.com: domain of anthony.perard@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="anthony.perard@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ~all" Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="anthony.perard@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: DtRLvqc0OQttJbGxfrj2CMu3fCO0USvAN3kY8b2v+tCf975QkKMKnJE+tZweePJZvR6fLSO/VB Tfu7LGadR4xMXIg5ZLlfUsOo+YJ789K7tTy5qCfGamVQ/L2NEJ4gu9oLfC/YcllM0OlXFZ5Wbw jzlUYU9KlM2Us6DiTgRJFGpNAPnxxu81Dl5bGxZbABVFZc9dBjS19HfZJCFororxxITS6tKLfE vW7BOsRreuN1vaM/gCl24H6K8lWmdphl+ub1aiXMmYRiHnhZUmLW2n0+WU3E0VZHraDtpj9ZJY O5k= X-SBRS: 2.7 X-MesageID: 2148095 X-Ironport-Server: esa3.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.63,412,1557201600"; d="scan'208";a="2148095" From: Anthony PERARD To: Date: Mon, 24 Jun 2019 16:32:50 +0100 Message-ID: <20190624153257.20163-2-anthony.perard@citrix.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190624153257.20163-1-anthony.perard@citrix.com> References: <20190624153257.20163-1-anthony.perard@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PULL 1/8] xen-block: support feature-large-sector-size X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Anthony PERARD , xen-devel@lists.xenproject.org, Peter Maydell Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" From: Paul Durrant A recent Xen commit [1] clarified the semantics of sector based quantities used in the blkif protocol such that it is now safe to create a xen-block device with a logical_block_size !=3D 512, as long as the device only connects to a frontend advertizing 'feature-large-block-size'. This patch modifies xen-block accordingly. It also uses a stack variable for the BlockBackend in xen_block_realize() to avoid repeated dereferencing of the BlockConf pointer, and changes the parameters of xen_block_dataplane_create() so that the BlockBackend pointer and sector size are passed expicitly rather than implicitly via the BlockConf. These modifications have been tested against a recent Windows PV XENVBD driver [2] using a xen-disk device with a 4kB logical block size. [1] http://xenbits.xen.org/gitweb/?p=3Dxen.git;a=3Dcommit;h=3D67e1c050e36b2= c9900cca83618e56189effbad98 [2] https://winpvdrvbuild.xenproject.org:8080/job/XENVBD-master/126 Signed-off-by: Paul Durrant Reviewed-by: Anthony PERARD Message-Id: <20190409164038.25484-1-paul.durrant@citrix.com> [Edited error message] Signed-off-by: Anthony PERARD --- hw/block/dataplane/xen-block.c | 25 ++++++++++++---------- hw/block/dataplane/xen-block.h | 3 ++- hw/block/xen-block.c | 38 +++++++++++++++++++++------------- 3 files changed, 40 insertions(+), 26 deletions(-) diff --git a/hw/block/dataplane/xen-block.c b/hw/block/dataplane/xen-block.c index f7ad452bbd..6da5c77fbb 100644 --- a/hw/block/dataplane/xen-block.c +++ b/hw/block/dataplane/xen-block.c @@ -58,6 +58,7 @@ struct XenBlockDataPlane { int requests_inflight; unsigned int max_requests; BlockBackend *blk; + unsigned int sector_size; QEMUBH *bh; IOThread *iothread; AioContext *ctx; @@ -167,7 +168,7 @@ static int xen_block_parse_request(XenBlockRequest *req= uest) goto err; } =20 - request->start =3D request->req.sector_number * XEN_BLKIF_SECTOR_SIZE; + request->start =3D request->req.sector_number * dataplane->sector_size; for (i =3D 0; i < request->req.nr_segments; i++) { if (i =3D=3D BLKIF_MAX_SEGMENTS_PER_REQUEST) { error_report("error: nr_segments too big"); @@ -177,14 +178,14 @@ static int xen_block_parse_request(XenBlockRequest *r= equest) error_report("error: first > last sector"); goto err; } - if (request->req.seg[i].last_sect * XEN_BLKIF_SECTOR_SIZE >=3D + if (request->req.seg[i].last_sect * dataplane->sector_size >=3D XC_PAGE_SIZE) { error_report("error: page crossing"); goto err; } =20 len =3D (request->req.seg[i].last_sect - - request->req.seg[i].first_sect + 1) * XEN_BLKIF_SECTOR_SIZE; + request->req.seg[i].first_sect + 1) * dataplane->sector_siz= e; request->size +=3D len; } if (request->start + request->size > blk_getlength(dataplane->blk)) { @@ -218,17 +219,17 @@ static int xen_block_copy_request(XenBlockRequest *re= quest) if (to_domain) { segs[i].dest.foreign.ref =3D request->req.seg[i].gref; segs[i].dest.foreign.offset =3D request->req.seg[i].first_sect= * - XEN_BLKIF_SECTOR_SIZE; + dataplane->sector_size; segs[i].source.virt =3D virt; } else { segs[i].source.foreign.ref =3D request->req.seg[i].gref; segs[i].source.foreign.offset =3D request->req.seg[i].first_se= ct * - XEN_BLKIF_SECTOR_SIZE; + dataplane->sector_size; segs[i].dest.virt =3D virt; } segs[i].len =3D (request->req.seg[i].last_sect - request->req.seg[i].first_sect + 1) * - XEN_BLKIF_SECTOR_SIZE; + dataplane->sector_size; virt +=3D segs[i].len; } =20 @@ -336,12 +337,12 @@ static bool xen_block_split_discard(XenBlockRequest *= request, =20 /* Wrap around, or overflowing byte limit? */ if (sec_start + sec_count < sec_count || - sec_start + sec_count > INT64_MAX / XEN_BLKIF_SECTOR_SIZE) { + sec_start + sec_count > INT64_MAX / dataplane->sector_size) { return false; } =20 - byte_offset =3D sec_start * XEN_BLKIF_SECTOR_SIZE; - byte_remaining =3D sec_count * XEN_BLKIF_SECTOR_SIZE; + byte_offset =3D sec_start * dataplane->sector_size; + byte_remaining =3D sec_count * dataplane->sector_size; =20 do { byte_chunk =3D byte_remaining > BDRV_REQUEST_MAX_BYTES ? @@ -625,13 +626,15 @@ static void xen_block_dataplane_event(void *opaque) } =20 XenBlockDataPlane *xen_block_dataplane_create(XenDevice *xendev, - BlockConf *conf, + BlockBackend *blk, + unsigned int sector_size, IOThread *iothread) { XenBlockDataPlane *dataplane =3D g_new0(XenBlockDataPlane, 1); =20 dataplane->xendev =3D xendev; - dataplane->blk =3D conf->blk; + dataplane->blk =3D blk; + dataplane->sector_size =3D sector_size; =20 QLIST_INIT(&dataplane->inflight); QLIST_INIT(&dataplane->freelist); diff --git a/hw/block/dataplane/xen-block.h b/hw/block/dataplane/xen-block.h index d6fa6d26dd..76dcd51c3d 100644 --- a/hw/block/dataplane/xen-block.h +++ b/hw/block/dataplane/xen-block.h @@ -15,7 +15,8 @@ typedef struct XenBlockDataPlane XenBlockDataPlane; =20 XenBlockDataPlane *xen_block_dataplane_create(XenDevice *xendev, - BlockConf *conf, + BlockBackend *blk, + unsigned int sector_size, IOThread *iothread); void xen_block_dataplane_destroy(XenBlockDataPlane *dataplane); void xen_block_dataplane_start(XenBlockDataPlane *dataplane, diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c index 4de537aef4..8f224ef81d 100644 --- a/hw/block/xen-block.c +++ b/hw/block/xen-block.c @@ -52,11 +52,25 @@ static void xen_block_connect(XenDevice *xendev, Error = **errp) XenBlockDevice *blockdev =3D XEN_BLOCK_DEVICE(xendev); const char *type =3D object_get_typename(OBJECT(blockdev)); XenBlockVdev *vdev =3D &blockdev->props.vdev; + BlockConf *conf =3D &blockdev->props.conf; + unsigned int feature_large_sector_size; unsigned int order, nr_ring_ref, *ring_ref, event_channel, protocol; char *str; =20 trace_xen_block_connect(type, vdev->disk, vdev->partition); =20 + if (xen_device_frontend_scanf(xendev, "feature-large-sector-size", "%u= ", + &feature_large_sector_size) !=3D 1) { + feature_large_sector_size =3D 0; + } + + if (feature_large_sector_size !=3D 1 && + conf->logical_block_size !=3D XEN_BLKIF_SECTOR_SIZE) { + error_setg(errp, "logical_block_size !=3D %u not supported by fron= tend", + XEN_BLKIF_SECTOR_SIZE); + return; + } + if (xen_device_frontend_scanf(xendev, "ring-page-order", "%u", &order) !=3D 1) { nr_ring_ref =3D 1; @@ -150,7 +164,7 @@ static void xen_block_set_size(XenBlockDevice *blockdev) const char *type =3D object_get_typename(OBJECT(blockdev)); XenBlockVdev *vdev =3D &blockdev->props.vdev; BlockConf *conf =3D &blockdev->props.conf; - int64_t sectors =3D blk_getlength(conf->blk) / XEN_BLKIF_SECTOR_SIZE; + int64_t sectors =3D blk_getlength(conf->blk) / conf->logical_block_siz= e; XenDevice *xendev =3D XEN_DEVICE(blockdev); =20 trace_xen_block_size(type, vdev->disk, vdev->partition, sectors); @@ -185,6 +199,7 @@ static void xen_block_realize(XenDevice *xendev, Error = **errp) const char *type =3D object_get_typename(OBJECT(blockdev)); XenBlockVdev *vdev =3D &blockdev->props.vdev; BlockConf *conf =3D &blockdev->props.conf; + BlockBackend *blk =3D conf->blk; Error *local_err =3D NULL; =20 if (vdev->type =3D=3D XEN_BLOCK_VDEV_TYPE_INVALID) { @@ -206,8 +221,8 @@ static void xen_block_realize(XenDevice *xendev, Error = **errp) * The blkif protocol does not deal with removable media, so it must * always be present, even for CDRom devices. */ - assert(conf->blk); - if (!blk_is_inserted(conf->blk)) { + assert(blk); + if (!blk_is_inserted(blk)) { error_setg(errp, "device needs media, but drive is empty"); return; } @@ -224,26 +239,20 @@ static void xen_block_realize(XenDevice *xendev, Erro= r **errp) =20 blkconf_blocksizes(conf); =20 - if (conf->logical_block_size !=3D XEN_BLKIF_SECTOR_SIZE) { - error_setg(errp, "logical_block_size !=3D %u not supported", - XEN_BLKIF_SECTOR_SIZE); - return; - } - if (conf->logical_block_size > conf->physical_block_size) { error_setg( errp, "logical_block_size > physical_block_size not supported"= ); return; } =20 - blk_set_dev_ops(conf->blk, &xen_block_dev_ops, blockdev); - blk_set_guest_block_size(conf->blk, conf->logical_block_size); + blk_set_dev_ops(blk, &xen_block_dev_ops, blockdev); + blk_set_guest_block_size(blk, conf->logical_block_size); =20 if (conf->discard_granularity =3D=3D -1) { conf->discard_granularity =3D conf->physical_block_size; } =20 - if (blk_get_flags(conf->blk) & BDRV_O_UNMAP) { + if (blk_get_flags(blk) & BDRV_O_UNMAP) { xen_device_backend_printf(xendev, "feature-discard", "%u", 1); xen_device_backend_printf(xendev, "discard-granularity", "%u", conf->discard_granularity); @@ -260,12 +269,13 @@ static void xen_block_realize(XenDevice *xendev, Erro= r **errp) blockdev->device_type); =20 xen_device_backend_printf(xendev, "sector-size", "%u", - XEN_BLKIF_SECTOR_SIZE); + conf->logical_block_size); =20 xen_block_set_size(blockdev); =20 blockdev->dataplane =3D - xen_block_dataplane_create(xendev, conf, blockdev->props.iothread); + xen_block_dataplane_create(xendev, blk, conf->logical_block_size, + blockdev->props.iothread); } =20 static void xen_block_frontend_changed(XenDevice *xendev, --=20 Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel