Xen 2017/10/26
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJZ8mhMAAoJEIlPj0hw4a6Q8qMP/ROGqSpgQwaXfTWasBW5saIM hrdHaXrztnuJYRXPYGWctBUoyAJihykdGFqo5PwL5hEgXtM/TOxT6G7tlKfSnRYQ MO6jAqoeKJC0V37npmSH/XtxcUiZRMdsXmD1kkS/8tMMjT9kRmK5U3hzCTuzlGMC rWdBN5XyCEvdZ5zAHhbaTnDaWXXClHQzpI+jg2PCSf4wPoET2MAL7bABV8e44Dq6 KVJi64V+rxLgbQ5WCgOwVY0abqox3t0UxbLrgO92Piafu4otA4foMJq3FKWzhEGr m/fZdyymtigOLXtWI6r3nvjfDjD+mVcbe1QJh/zl9wau8rKU4FtJXSBISvN1ZxHh Auw7hKEjn7Dx6Xi72SX+hwUihEDcHdgdQdn45gFpD8yDpGbA5i1GMbXa3uXVC1aZ ZwzLS2aSGOtr5n+1J5BfpNSMoQlaYtdHuYLAFYhHYZne00wAYBByJZCqMGn9H++i h8lc4OmjuNeAHL6AVau09WRruDLjk+MmDav0rKRItXiNXpFjJkoMnRlAmNCIhSRb 18D/gHySZtJJ/o86rSaBmAS0EPw8dYR3kwgsSFOws6fxjZ2PbMWMyElunk2VEMbq ELMr3/1ic4bhId2sDU312XLuUgH9UbMrEhJgDHNYclGStGyPhFLEzFST2QMf85ai BZ430fs0T1hKYwCOpGx2 =yQqI -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/sstabellini/tags/xen-20171026-tag' into staging Xen 2017/10/26 # gpg: Signature made Thu 26 Oct 2017 23:57:16 BST # gpg: using RSA key 0x894F8F4870E1AE90 # gpg: Good signature from "Stefano Stabellini <stefano.stabellini@eu.citrix.com>" # gpg: aka "Stefano Stabellini <sstabellini@kernel.org>" # Primary key fingerprint: D04E 33AB A51F 67BA 07D3 0AEA 894F 8F48 70E1 AE90 * remotes/sstabellini/tags/xen-20171026-tag: xen: Log errno rather than return value xen: dont try setting max grants multiple times xen: add a global indicator for grant copy being available Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
						commit
						a93ece47fd
					
				| @ -121,9 +121,6 @@ struct XenBlkDev { | ||||
|     unsigned int        persistent_gnt_count; | ||||
|     unsigned int        max_grants; | ||||
| 
 | ||||
|     /* Grant copy */ | ||||
|     gboolean            feature_grant_copy; | ||||
| 
 | ||||
|     /* qemu block driver */ | ||||
|     DriveInfo           *dinfo; | ||||
|     BlockBackend        *blk; | ||||
| @ -616,7 +613,7 @@ static void qemu_aio_complete(void *opaque, int ret) | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     if (ioreq->blkdev->feature_grant_copy) { | ||||
|     if (xen_feature_grant_copy) { | ||||
|         switch (ioreq->req.operation) { | ||||
|         case BLKIF_OP_READ: | ||||
|             /* in case of failure ioreq->aio_errors is increased */ | ||||
| @ -638,7 +635,7 @@ static void qemu_aio_complete(void *opaque, int ret) | ||||
|     } | ||||
| 
 | ||||
|     ioreq->status = ioreq->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_OKAY; | ||||
|     if (!ioreq->blkdev->feature_grant_copy) { | ||||
|     if (!xen_feature_grant_copy) { | ||||
|         ioreq_unmap(ioreq); | ||||
|     } | ||||
|     ioreq_finish(ioreq); | ||||
| @ -698,7 +695,7 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq) | ||||
| { | ||||
|     struct XenBlkDev *blkdev = ioreq->blkdev; | ||||
| 
 | ||||
|     if (ioreq->blkdev->feature_grant_copy) { | ||||
|     if (xen_feature_grant_copy) { | ||||
|         ioreq_init_copy_buffers(ioreq); | ||||
|         if (ioreq->req.nr_segments && (ioreq->req.operation == BLKIF_OP_WRITE || | ||||
|             ioreq->req.operation == BLKIF_OP_FLUSH_DISKCACHE) && | ||||
| @ -750,7 +747,7 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq) | ||||
|     } | ||||
|     default: | ||||
|         /* unknown operation (shouldn't happen -- parse catches this) */ | ||||
|         if (!ioreq->blkdev->feature_grant_copy) { | ||||
|         if (!xen_feature_grant_copy) { | ||||
|             ioreq_unmap(ioreq); | ||||
|         } | ||||
|         goto err; | ||||
| @ -1010,18 +1007,15 @@ static int blk_init(struct XenDevice *xendev) | ||||
| 
 | ||||
|     blkdev->file_blk  = BLOCK_SIZE; | ||||
| 
 | ||||
|     blkdev->feature_grant_copy = | ||||
|                 (xengnttab_grant_copy(blkdev->xendev.gnttabdev, 0, NULL) == 0); | ||||
| 
 | ||||
|     xen_pv_printf(&blkdev->xendev, 3, "grant copy operation %s\n", | ||||
|                   blkdev->feature_grant_copy ? "enabled" : "disabled"); | ||||
|                   xen_feature_grant_copy ? "enabled" : "disabled"); | ||||
| 
 | ||||
|     /* fill info
 | ||||
|      * blk_connect supplies sector-size and sectors | ||||
|      */ | ||||
|     xenstore_write_be_int(&blkdev->xendev, "feature-flush-cache", 1); | ||||
|     xenstore_write_be_int(&blkdev->xendev, "feature-persistent", | ||||
|                           !blkdev->feature_grant_copy); | ||||
|                           !xen_feature_grant_copy); | ||||
|     xenstore_write_be_int(&blkdev->xendev, "info", info); | ||||
| 
 | ||||
|     xenstore_write_be_int(&blkdev->xendev, "max-ring-page-order", | ||||
| @ -1226,6 +1220,12 @@ static int blk_connect(struct XenDevice *xendev) | ||||
|     /* Add on the number needed for the ring pages */ | ||||
|     max_grants += blkdev->nr_ring_ref; | ||||
| 
 | ||||
|     blkdev->xendev.gnttabdev = xengnttab_open(NULL, 0); | ||||
|     if (blkdev->xendev.gnttabdev == NULL) { | ||||
|         xen_pv_printf(xendev, 0, "xengnttab_open failed: %s\n", | ||||
|                       strerror(errno)); | ||||
|         return -1; | ||||
|     } | ||||
|     if (xengnttab_set_max_grants(blkdev->xendev.gnttabdev, max_grants)) { | ||||
|         xen_pv_printf(xendev, 0, "xengnttab_set_max_grants failed: %s\n", | ||||
|                       strerror(errno)); | ||||
| @ -1333,6 +1333,11 @@ static void blk_disconnect(struct XenDevice *xendev) | ||||
|         } | ||||
|         blkdev->feature_persistent = false; | ||||
|     } | ||||
| 
 | ||||
|     if (blkdev->xendev.gnttabdev) { | ||||
|         xengnttab_close(blkdev->xendev.gnttabdev); | ||||
|         blkdev->xendev.gnttabdev = NULL; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static int blk_free(struct XenDevice *xendev) | ||||
| @ -1340,9 +1345,7 @@ static int blk_free(struct XenDevice *xendev) | ||||
|     struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); | ||||
|     struct ioreq *ioreq; | ||||
| 
 | ||||
|     if (blkdev->blk || blkdev->sring) { | ||||
|         blk_disconnect(xendev); | ||||
|     } | ||||
|     blk_disconnect(xendev); | ||||
| 
 | ||||
|     while (!QLIST_EMPTY(&blkdev->freelist)) { | ||||
|         ioreq = QLIST_FIRST(&blkdev->freelist); | ||||
| @ -1369,7 +1372,6 @@ static void blk_event(struct XenDevice *xendev) | ||||
| 
 | ||||
| struct XenDevOps xen_blkdev_ops = { | ||||
|     .size       = sizeof(struct XenBlkDev), | ||||
|     .flags      = DEVOPS_FLAG_NEED_GNTDEV, | ||||
|     .alloc      = blk_alloc, | ||||
|     .init       = blk_init, | ||||
|     .initialise    = blk_connect, | ||||
|  | ||||
| @ -1446,7 +1446,7 @@ void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length) | ||||
|         if (rc) { | ||||
|             fprintf(stderr, | ||||
|                     "%s failed for "RAM_ADDR_FMT" ("RAM_ADDR_FMT"): %i, %s\n", | ||||
|                     __func__, start, nb_pages, rc, strerror(-rc)); | ||||
|                     __func__, start, nb_pages, errno, strerror(errno)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -44,6 +44,7 @@ BusState *xen_sysbus; | ||||
| /* public */ | ||||
| struct xs_handle *xenstore = NULL; | ||||
| const char *xen_protocol; | ||||
| bool xen_feature_grant_copy; | ||||
| 
 | ||||
| /* private */ | ||||
| static int debug; | ||||
| @ -519,6 +520,8 @@ void xenstore_update_fe(char *watch, struct XenDevice *xendev) | ||||
| 
 | ||||
| int xen_be_init(void) | ||||
| { | ||||
|     xengnttab_handle *gnttabdev; | ||||
| 
 | ||||
|     xenstore = xs_daemon_open(); | ||||
|     if (!xenstore) { | ||||
|         xen_pv_printf(NULL, 0, "can't connect to xenstored\n"); | ||||
| @ -532,6 +535,14 @@ int xen_be_init(void) | ||||
|         goto err; | ||||
|     } | ||||
| 
 | ||||
|     gnttabdev = xengnttab_open(NULL, 0); | ||||
|     if (gnttabdev != NULL) { | ||||
|         if (xengnttab_grant_copy(gnttabdev, 0, NULL) == 0) { | ||||
|             xen_feature_grant_copy = true; | ||||
|         } | ||||
|         xengnttab_close(gnttabdev); | ||||
|     } | ||||
| 
 | ||||
|     xen_sysdev = qdev_create(NULL, TYPE_XENSYSDEV); | ||||
|     qdev_init_nofail(xen_sysdev); | ||||
|     xen_sysbus = qbus_create(TYPE_XENSYSBUS, DEVICE(xen_sysdev), "xen-sysbus"); | ||||
|  | ||||
| @ -16,6 +16,7 @@ | ||||
| /* variables */ | ||||
| extern struct xs_handle *xenstore; | ||||
| extern const char *xen_protocol; | ||||
| extern bool xen_feature_grant_copy; | ||||
| extern DeviceState *xen_sysdev; | ||||
| extern BusState *xen_sysbus; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Peter Maydell
						Peter Maydell