Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
SUSE:SLE-12-SP1:GA
xen.4507
qemu-xen-upstream-blkif-discard.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File qemu-xen-upstream-blkif-discard.patch of Package xen.4507
References: FATE#316071 Subject: qemu-upstream: add discard support for xen_disk Git-commit: f31352041bdde436c3f6d07e1525a42e48dec215 Implement discard support for xen_disk. It makes use of the existing discard code in qemu. The discard support is enabled unconditionally. The tool stack may provide a property "discard-enable" in the backend node to optionally disable discard support. This is helpful in case the backing file was intentionally created non-sparse to avoid fragmentation. v2: rename xenstore property from discard_enable to discard-enable move discard_req to case BLKIF_OP_DISCARD Signed-off-by: Olaf Hering <olaf@aepfle.de> --- tools/qemu-xen-dir-remote/hw/block/xen_blkif.h | 12 ++++++++++ tools/qemu-xen-dir-remote/hw/block/xen_disk.c | 30 +++++++++++++++++++++++++ 2 files changed, 42 insertions(+) Index: xen-4.4.3-testing/tools/qemu-xen-dir-remote/hw/block/xen_blkif.h =================================================================== --- xen-4.4.3-testing.orig/tools/qemu-xen-dir-remote/hw/block/xen_blkif.h +++ xen-4.4.3-testing/tools/qemu-xen-dir-remote/hw/block/xen_blkif.h @@ -79,6 +79,12 @@ static inline void blkif_get_x86_32_req( dst->handle = src->handle; dst->id = src->id; dst->sector_number = src->sector_number; + if (src->operation == BLKIF_OP_DISCARD) { + struct blkif_request_discard *s = (void *)src; + struct blkif_request_discard *d = (void *)dst; + d->nr_sectors = s->nr_sectors; + return; + } /* prevent the compiler from optimizing the code and using src->nr_segments instead */ barrier(); if (n > dst->nr_segments) @@ -96,6 +102,12 @@ static inline void blkif_get_x86_64_req( dst->handle = src->handle; dst->id = src->id; dst->sector_number = src->sector_number; + if (src->operation == BLKIF_OP_DISCARD) { + struct blkif_request_discard *s = (void *)src; + struct blkif_request_discard *d = (void *)dst; + d->nr_sectors = s->nr_sectors; + return; + } /* prevent the compiler from optimizing the code and using src->nr_segments instead */ barrier(); if (n > dst->nr_segments) Index: xen-4.4.3-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c =================================================================== --- xen-4.4.3-testing.orig/tools/qemu-xen-dir-remote/hw/block/xen_disk.c +++ xen-4.4.3-testing/tools/qemu-xen-dir-remote/hw/block/xen_disk.c @@ -121,6 +121,7 @@ struct XenBlkDev { int requests_finished; /* Persistent grants extension */ + gboolean feature_discard; gboolean feature_persistent; GTree *persistent_gnts; GSList *persistent_regions; @@ -278,6 +279,8 @@ static int ioreq_parse(struct ioreq *ior case BLKIF_OP_WRITE: ioreq->prot = PROT_READ; /* from memory */ break; + case BLKIF_OP_DISCARD: + return 0; default: xen_be_printf(&blkdev->xendev, 0, "error: unknown operation (%d)\n", ioreq->req.operation); @@ -563,6 +566,16 @@ static int ioreq_runio_qemu_aio(struct i &ioreq->v, ioreq->v.size / BLOCK_SIZE, qemu_aio_complete, ioreq); break; + case BLKIF_OP_DISCARD: + { + struct blkif_request_discard *discard_req = (void *)&ioreq->req; + bdrv_acct_start(blkdev->bs, &ioreq->acct, discard_req->nr_sectors * BLOCK_SIZE, BDRV_ACCT_WRITE); + ioreq->aio_inflight++; + bdrv_aio_discard(blkdev->bs, + discard_req->sector_number, discard_req->nr_sectors, + qemu_aio_complete, ioreq); + break; + } default: /* unknown operation (shouldn't happen -- parse catches this) */ goto err; @@ -741,6 +754,19 @@ static void blk_alloc(struct XenDevice * } } +static void blk_parse_discard(struct XenBlkDev *blkdev) +{ + int enable; + + blkdev->feature_discard = true; + + if (xenstore_read_be_int(&blkdev->xendev, "discard-enable", &enable) == 0) + blkdev->feature_discard = !!enable; + + if (blkdev->feature_discard) + xenstore_write_be_int(&blkdev->xendev, "feature-discard", 1); +} + static int blk_init(struct XenDevice *xendev) { struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); @@ -808,6 +834,8 @@ static int blk_init(struct XenDevice *xe xenstore_write_be_int(&blkdev->xendev, "feature-persistent", 1); xenstore_write_be_int(&blkdev->xendev, "info", info); + blk_parse_discard(blkdev); + g_free(directiosafe); return 0; @@ -843,6 +871,8 @@ static int blk_connect(struct XenDevice qflags |= BDRV_O_RDWR; readonly = false; } + if (blkdev->feature_discard) + qflags |= BDRV_O_UNMAP; /* init qemu block driver */ index = (blkdev->xendev.dev - 202 * 256) / 16;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor