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

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_ScalabilitySigned-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.comSigned-off-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
parent 5f7f7740
...@@ -35,3 +35,12 @@ Description: ...@@ -35,3 +35,12 @@ Description:
controls the duration in milliseconds that blkback will not controls the duration in milliseconds that blkback will not
cache any page not backed by a grant mapping. cache any page not backed by a grant mapping.
The default is 10ms. 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).
...@@ -473,6 +473,12 @@ static void xen_vbd_free(struct xen_vbd *vbd) ...@@ -473,6 +473,12 @@ static void xen_vbd_free(struct xen_vbd *vbd)
vbd->bdev = NULL; 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, static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
unsigned major, unsigned minor, int readonly, unsigned major, unsigned minor, int readonly,
int cdrom) int cdrom)
...@@ -518,6 +524,8 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, ...@@ -518,6 +524,8 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
if (q && blk_queue_secure_erase(q)) if (q && blk_queue_secure_erase(q))
vbd->discard_secure = true; vbd->discard_secure = true;
vbd->feature_gnt_persistent = feature_persistent;
pr_debug("Successful creation of handle=%04x (dom=%u)\n", pr_debug("Successful creation of handle=%04x (dom=%u)\n",
handle, blkif->domid); handle, blkif->domid);
return 0; return 0;
...@@ -905,7 +913,8 @@ static void connect(struct backend_info *be) ...@@ -905,7 +913,8 @@ static void connect(struct backend_info *be)
xen_blkbk_barrier(xbt, be, be->blkif->vbd.flush_support); 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) { if (err) {
xenbus_dev_fatal(dev, err, "writing %s/feature-persistent", xenbus_dev_fatal(dev, err, "writing %s/feature-persistent",
dev->nodename); dev->nodename);
...@@ -1066,7 +1075,6 @@ static int connect_ring(struct backend_info *be) ...@@ -1066,7 +1075,6 @@ static int connect_ring(struct backend_info *be)
{ {
struct xenbus_device *dev = be->dev; struct xenbus_device *dev = be->dev;
struct xen_blkif *blkif = be->blkif; struct xen_blkif *blkif = be->blkif;
unsigned int pers_grants;
char protocol[64] = ""; char protocol[64] = "";
int err, i; int err, i;
char *xspath; char *xspath;
...@@ -1092,9 +1100,11 @@ static int connect_ring(struct backend_info *be) ...@@ -1092,9 +1100,11 @@ static int connect_ring(struct backend_info *be)
xenbus_dev_fatal(dev, err, "unknown fe protocol %s", protocol); xenbus_dev_fatal(dev, err, "unknown fe protocol %s", protocol);
return -ENOSYS; return -ENOSYS;
} }
pers_grants = xenbus_read_unsigned(dev->otherend, "feature-persistent", if (blkif->vbd.feature_gnt_persistent)
0); blkif->vbd.feature_gnt_persistent =
blkif->vbd.feature_gnt_persistent = pers_grants; xenbus_read_unsigned(dev->otherend,
"feature-persistent", 0);
blkif->vbd.overflow_max_grants = 0; blkif->vbd.overflow_max_grants = 0;
/* /*
...@@ -1117,7 +1127,7 @@ static int connect_ring(struct backend_info *be) ...@@ -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, pr_info("%s: using %d queues, protocol %d (%s) %s\n", dev->nodename,
blkif->nr_rings, blkif->blk_protocol, protocol, 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 = xenbus_read_unsigned(dev->otherend,
"ring-page-order", 0); "ring-page-order", 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment