Commit aac8a70d authored by SeongJae Park's avatar SeongJae Park Committed by Boris Ostrovsky
Browse files

xen-blkback: add a parameter for disabling of persistent grants

Persistent grants feature provides high scalability.  On some small
systems, however, it could incur data copy overheads[1] and thus it is
required to be disabled.  But, there is no option to disable it.  For
the reason, this commit adds a module parameter for disabling of the
feature.

[1] https://wiki.xen.org/wiki/Xen_4.3_Block_Protocol_Scalability



Signed-off-by: default avatarAnthony Liguori <aliguori@amazon.com>
Signed-off-by: default avatarSeongJae Park <sjpark@amazon.de>
Reviewed-by: default avatarJuergen Gross <jgross@suse.com>
Acked-by: default avatarRoger Pau Monné <roger.pau@citrix.com>
Link: https://lore.kernel.org/r/20200923061841.20531-2-sjpark@amazon.com


Signed-off-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
parent 5f7f7740
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -35,3 +35,12 @@ Description:
                controls the duration in milliseconds that blkback will not
                cache any page not backed by a grant mapping.
                The default is 10ms.

What:           /sys/module/xen_blkback/parameters/feature_persistent
Date:           September 2020
KernelVersion:  5.10
Contact:        SeongJae Park <sjpark@amazon.de>
Description:
                Whether to enable the persistent grants feature or not.  Note
                that this option only takes effect on newly created backends.
                The default is Y (enable).
+16 −6
Original line number Diff line number Diff line
@@ -473,6 +473,12 @@ static void xen_vbd_free(struct xen_vbd *vbd)
	vbd->bdev = NULL;
}

/* Enable the persistent grants feature. */
static bool feature_persistent = true;
module_param(feature_persistent, bool, 0644);
MODULE_PARM_DESC(feature_persistent,
		"Enables the persistent grants feature");

static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
			  unsigned major, unsigned minor, int readonly,
			  int cdrom)
@@ -518,6 +524,8 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
	if (q && blk_queue_secure_erase(q))
		vbd->discard_secure = true;

	vbd->feature_gnt_persistent = feature_persistent;

	pr_debug("Successful creation of handle=%04x (dom=%u)\n",
		handle, blkif->domid);
	return 0;
@@ -905,7 +913,8 @@ again:

	xen_blkbk_barrier(xbt, be, be->blkif->vbd.flush_support);

	err = xenbus_printf(xbt, dev->nodename, "feature-persistent", "%u", 1);
	err = xenbus_printf(xbt, dev->nodename, "feature-persistent", "%u",
			be->blkif->vbd.feature_gnt_persistent);
	if (err) {
		xenbus_dev_fatal(dev, err, "writing %s/feature-persistent",
				 dev->nodename);
@@ -1066,7 +1075,6 @@ static int connect_ring(struct backend_info *be)
{
	struct xenbus_device *dev = be->dev;
	struct xen_blkif *blkif = be->blkif;
	unsigned int pers_grants;
	char protocol[64] = "";
	int err, i;
	char *xspath;
@@ -1092,9 +1100,11 @@ static int connect_ring(struct backend_info *be)
		xenbus_dev_fatal(dev, err, "unknown fe protocol %s", protocol);
		return -ENOSYS;
	}
	pers_grants = xenbus_read_unsigned(dev->otherend, "feature-persistent",
					   0);
	blkif->vbd.feature_gnt_persistent = pers_grants;
	if (blkif->vbd.feature_gnt_persistent)
		blkif->vbd.feature_gnt_persistent =
			xenbus_read_unsigned(dev->otherend,
					"feature-persistent", 0);

	blkif->vbd.overflow_max_grants = 0;

	/*
@@ -1117,7 +1127,7 @@ static int connect_ring(struct backend_info *be)

	pr_info("%s: using %d queues, protocol %d (%s) %s\n", dev->nodename,
		 blkif->nr_rings, blkif->blk_protocol, protocol,
		 pers_grants ? "persistent grants" : "");
		 blkif->vbd.feature_gnt_persistent ? "persistent grants" : "");

	ring_page_order = xenbus_read_unsigned(dev->otherend,
					       "ring-page-order", 0);