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: Anthony Liguori <aliguori@amazon.com> Signed-off-by: SeongJae Park <sjpark@amazon.de> Reviewed-by: Juergen Gross <jgross@suse.com> Acked-by: Roger Pau Monné <roger.pau@citrix.com> Link: https://lore.kernel.org/r/20200923061841.20531-2-sjpark@amazon.com Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
This commit is contained in:
parent
5f7f77400a
commit
aac8a70db2
2 changed files with 25 additions and 6 deletions
|
@ -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)
|
||||||
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,
|
||||||
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 @@ again:
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue