xen-netback: move netback_probe() and netback_remove() to the end...
...of xenbus.c This is a cosmetic function re-ordering to reduce churn in a subsequent patch. Some style fix-up was done to make checkpatch.pl happier. No functional change. Signed-off-by: Paul Durrant <pdurrant@amazon.com> Acked-by: Wei Liu <wei.liu@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5debb18f96
commit
92fbeb43b6
|
@ -195,185 +195,6 @@ static void xenvif_debugfs_delif(struct xenvif *vif)
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_DEBUG_FS */
|
#endif /* CONFIG_DEBUG_FS */
|
||||||
|
|
||||||
static int netback_remove(struct xenbus_device *dev)
|
|
||||||
{
|
|
||||||
struct backend_info *be = dev_get_drvdata(&dev->dev);
|
|
||||||
|
|
||||||
set_backend_state(be, XenbusStateClosed);
|
|
||||||
|
|
||||||
unregister_hotplug_status_watch(be);
|
|
||||||
if (be->vif) {
|
|
||||||
kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
|
|
||||||
xen_unregister_watchers(be->vif);
|
|
||||||
xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
|
|
||||||
xenvif_free(be->vif);
|
|
||||||
be->vif = NULL;
|
|
||||||
}
|
|
||||||
kfree(be->hotplug_script);
|
|
||||||
kfree(be);
|
|
||||||
dev_set_drvdata(&dev->dev, NULL);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Entry point to this code when a new device is created. Allocate the basic
|
|
||||||
* structures and switch to InitWait.
|
|
||||||
*/
|
|
||||||
static int netback_probe(struct xenbus_device *dev,
|
|
||||||
const struct xenbus_device_id *id)
|
|
||||||
{
|
|
||||||
const char *message;
|
|
||||||
struct xenbus_transaction xbt;
|
|
||||||
int err;
|
|
||||||
int sg;
|
|
||||||
const char *script;
|
|
||||||
struct backend_info *be = kzalloc(sizeof(struct backend_info),
|
|
||||||
GFP_KERNEL);
|
|
||||||
if (!be) {
|
|
||||||
xenbus_dev_fatal(dev, -ENOMEM,
|
|
||||||
"allocating backend structure");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
be->dev = dev;
|
|
||||||
dev_set_drvdata(&dev->dev, be);
|
|
||||||
|
|
||||||
be->state = XenbusStateInitialising;
|
|
||||||
err = xenbus_switch_state(dev, XenbusStateInitialising);
|
|
||||||
if (err)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
sg = 1;
|
|
||||||
|
|
||||||
do {
|
|
||||||
err = xenbus_transaction_start(&xbt);
|
|
||||||
if (err) {
|
|
||||||
xenbus_dev_fatal(dev, err, "starting transaction");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = xenbus_printf(xbt, dev->nodename, "feature-sg", "%d", sg);
|
|
||||||
if (err) {
|
|
||||||
message = "writing feature-sg";
|
|
||||||
goto abort_transaction;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4",
|
|
||||||
"%d", sg);
|
|
||||||
if (err) {
|
|
||||||
message = "writing feature-gso-tcpv4";
|
|
||||||
goto abort_transaction;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv6",
|
|
||||||
"%d", sg);
|
|
||||||
if (err) {
|
|
||||||
message = "writing feature-gso-tcpv6";
|
|
||||||
goto abort_transaction;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We support partial checksum setup for IPv6 packets */
|
|
||||||
err = xenbus_printf(xbt, dev->nodename,
|
|
||||||
"feature-ipv6-csum-offload",
|
|
||||||
"%d", 1);
|
|
||||||
if (err) {
|
|
||||||
message = "writing feature-ipv6-csum-offload";
|
|
||||||
goto abort_transaction;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We support rx-copy path. */
|
|
||||||
err = xenbus_printf(xbt, dev->nodename,
|
|
||||||
"feature-rx-copy", "%d", 1);
|
|
||||||
if (err) {
|
|
||||||
message = "writing feature-rx-copy";
|
|
||||||
goto abort_transaction;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We don't support rx-flip path (except old guests who don't
|
|
||||||
* grok this feature flag).
|
|
||||||
*/
|
|
||||||
err = xenbus_printf(xbt, dev->nodename,
|
|
||||||
"feature-rx-flip", "%d", 0);
|
|
||||||
if (err) {
|
|
||||||
message = "writing feature-rx-flip";
|
|
||||||
goto abort_transaction;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We support dynamic multicast-control. */
|
|
||||||
err = xenbus_printf(xbt, dev->nodename,
|
|
||||||
"feature-multicast-control", "%d", 1);
|
|
||||||
if (err) {
|
|
||||||
message = "writing feature-multicast-control";
|
|
||||||
goto abort_transaction;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = xenbus_printf(xbt, dev->nodename,
|
|
||||||
"feature-dynamic-multicast-control",
|
|
||||||
"%d", 1);
|
|
||||||
if (err) {
|
|
||||||
message = "writing feature-dynamic-multicast-control";
|
|
||||||
goto abort_transaction;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = xenbus_transaction_end(xbt, 0);
|
|
||||||
} while (err == -EAGAIN);
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
xenbus_dev_fatal(dev, err, "completing transaction");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Split event channels support, this is optional so it is not
|
|
||||||
* put inside the above loop.
|
|
||||||
*/
|
|
||||||
err = xenbus_printf(XBT_NIL, dev->nodename,
|
|
||||||
"feature-split-event-channels",
|
|
||||||
"%u", separate_tx_rx_irq);
|
|
||||||
if (err)
|
|
||||||
pr_debug("Error writing feature-split-event-channels\n");
|
|
||||||
|
|
||||||
/* Multi-queue support: This is an optional feature. */
|
|
||||||
err = xenbus_printf(XBT_NIL, dev->nodename,
|
|
||||||
"multi-queue-max-queues", "%u", xenvif_max_queues);
|
|
||||||
if (err)
|
|
||||||
pr_debug("Error writing multi-queue-max-queues\n");
|
|
||||||
|
|
||||||
err = xenbus_printf(XBT_NIL, dev->nodename,
|
|
||||||
"feature-ctrl-ring",
|
|
||||||
"%u", true);
|
|
||||||
if (err)
|
|
||||||
pr_debug("Error writing feature-ctrl-ring\n");
|
|
||||||
|
|
||||||
script = xenbus_read(XBT_NIL, dev->nodename, "script", NULL);
|
|
||||||
if (IS_ERR(script)) {
|
|
||||||
err = PTR_ERR(script);
|
|
||||||
xenbus_dev_fatal(dev, err, "reading script");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
be->hotplug_script = script;
|
|
||||||
|
|
||||||
|
|
||||||
/* This kicks hotplug scripts, so do it immediately. */
|
|
||||||
err = backend_create_xenvif(be);
|
|
||||||
if (err)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
abort_transaction:
|
|
||||||
xenbus_transaction_end(xbt, 1);
|
|
||||||
xenbus_dev_fatal(dev, err, "%s", message);
|
|
||||||
fail:
|
|
||||||
pr_debug("failed\n");
|
|
||||||
netback_remove(dev);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handle the creation of the hotplug script environment. We add the script
|
* Handle the creation of the hotplug script environment. We add the script
|
||||||
* and vif variables to the environment, for the benefit of the vif-* hotplug
|
* and vif variables to the environment, for the benefit of the vif-* hotplug
|
||||||
|
@ -1128,6 +949,180 @@ static int read_xenbus_vif_flags(struct backend_info *be)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int netback_remove(struct xenbus_device *dev)
|
||||||
|
{
|
||||||
|
struct backend_info *be = dev_get_drvdata(&dev->dev);
|
||||||
|
|
||||||
|
set_backend_state(be, XenbusStateClosed);
|
||||||
|
|
||||||
|
unregister_hotplug_status_watch(be);
|
||||||
|
if (be->vif) {
|
||||||
|
kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
|
||||||
|
xen_unregister_watchers(be->vif);
|
||||||
|
xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
|
||||||
|
xenvif_free(be->vif);
|
||||||
|
be->vif = NULL;
|
||||||
|
}
|
||||||
|
kfree(be->hotplug_script);
|
||||||
|
kfree(be);
|
||||||
|
dev_set_drvdata(&dev->dev, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entry point to this code when a new device is created. Allocate the basic
|
||||||
|
* structures and switch to InitWait.
|
||||||
|
*/
|
||||||
|
static int netback_probe(struct xenbus_device *dev,
|
||||||
|
const struct xenbus_device_id *id)
|
||||||
|
{
|
||||||
|
const char *message;
|
||||||
|
struct xenbus_transaction xbt;
|
||||||
|
int err;
|
||||||
|
int sg;
|
||||||
|
const char *script;
|
||||||
|
struct backend_info *be = kzalloc(sizeof(*be), GFP_KERNEL);
|
||||||
|
|
||||||
|
if (!be) {
|
||||||
|
xenbus_dev_fatal(dev, -ENOMEM,
|
||||||
|
"allocating backend structure");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
be->dev = dev;
|
||||||
|
dev_set_drvdata(&dev->dev, be);
|
||||||
|
|
||||||
|
be->state = XenbusStateInitialising;
|
||||||
|
err = xenbus_switch_state(dev, XenbusStateInitialising);
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
sg = 1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
err = xenbus_transaction_start(&xbt);
|
||||||
|
if (err) {
|
||||||
|
xenbus_dev_fatal(dev, err, "starting transaction");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = xenbus_printf(xbt, dev->nodename, "feature-sg", "%d", sg);
|
||||||
|
if (err) {
|
||||||
|
message = "writing feature-sg";
|
||||||
|
goto abort_transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4",
|
||||||
|
"%d", sg);
|
||||||
|
if (err) {
|
||||||
|
message = "writing feature-gso-tcpv4";
|
||||||
|
goto abort_transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv6",
|
||||||
|
"%d", sg);
|
||||||
|
if (err) {
|
||||||
|
message = "writing feature-gso-tcpv6";
|
||||||
|
goto abort_transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We support partial checksum setup for IPv6 packets */
|
||||||
|
err = xenbus_printf(xbt, dev->nodename,
|
||||||
|
"feature-ipv6-csum-offload",
|
||||||
|
"%d", 1);
|
||||||
|
if (err) {
|
||||||
|
message = "writing feature-ipv6-csum-offload";
|
||||||
|
goto abort_transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We support rx-copy path. */
|
||||||
|
err = xenbus_printf(xbt, dev->nodename,
|
||||||
|
"feature-rx-copy", "%d", 1);
|
||||||
|
if (err) {
|
||||||
|
message = "writing feature-rx-copy";
|
||||||
|
goto abort_transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We don't support rx-flip path (except old guests who
|
||||||
|
* don't grok this feature flag).
|
||||||
|
*/
|
||||||
|
err = xenbus_printf(xbt, dev->nodename,
|
||||||
|
"feature-rx-flip", "%d", 0);
|
||||||
|
if (err) {
|
||||||
|
message = "writing feature-rx-flip";
|
||||||
|
goto abort_transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We support dynamic multicast-control. */
|
||||||
|
err = xenbus_printf(xbt, dev->nodename,
|
||||||
|
"feature-multicast-control", "%d", 1);
|
||||||
|
if (err) {
|
||||||
|
message = "writing feature-multicast-control";
|
||||||
|
goto abort_transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = xenbus_printf(xbt, dev->nodename,
|
||||||
|
"feature-dynamic-multicast-control",
|
||||||
|
"%d", 1);
|
||||||
|
if (err) {
|
||||||
|
message = "writing feature-dynamic-multicast-control";
|
||||||
|
goto abort_transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = xenbus_transaction_end(xbt, 0);
|
||||||
|
} while (err == -EAGAIN);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
xenbus_dev_fatal(dev, err, "completing transaction");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Split event channels support, this is optional so it is not
|
||||||
|
* put inside the above loop.
|
||||||
|
*/
|
||||||
|
err = xenbus_printf(XBT_NIL, dev->nodename,
|
||||||
|
"feature-split-event-channels",
|
||||||
|
"%u", separate_tx_rx_irq);
|
||||||
|
if (err)
|
||||||
|
pr_debug("Error writing feature-split-event-channels\n");
|
||||||
|
|
||||||
|
/* Multi-queue support: This is an optional feature. */
|
||||||
|
err = xenbus_printf(XBT_NIL, dev->nodename,
|
||||||
|
"multi-queue-max-queues", "%u", xenvif_max_queues);
|
||||||
|
if (err)
|
||||||
|
pr_debug("Error writing multi-queue-max-queues\n");
|
||||||
|
|
||||||
|
err = xenbus_printf(XBT_NIL, dev->nodename,
|
||||||
|
"feature-ctrl-ring",
|
||||||
|
"%u", true);
|
||||||
|
if (err)
|
||||||
|
pr_debug("Error writing feature-ctrl-ring\n");
|
||||||
|
|
||||||
|
script = xenbus_read(XBT_NIL, dev->nodename, "script", NULL);
|
||||||
|
if (IS_ERR(script)) {
|
||||||
|
err = PTR_ERR(script);
|
||||||
|
xenbus_dev_fatal(dev, err, "reading script");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
be->hotplug_script = script;
|
||||||
|
|
||||||
|
/* This kicks hotplug scripts, so do it immediately. */
|
||||||
|
err = backend_create_xenvif(be);
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
abort_transaction:
|
||||||
|
xenbus_transaction_end(xbt, 1);
|
||||||
|
xenbus_dev_fatal(dev, err, "%s", message);
|
||||||
|
fail:
|
||||||
|
pr_debug("failed\n");
|
||||||
|
netback_remove(dev);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct xenbus_device_id netback_ids[] = {
|
static const struct xenbus_device_id netback_ids[] = {
|
||||||
{ "vif" },
|
{ "vif" },
|
||||||
{ "" }
|
{ "" }
|
||||||
|
|
Loading…
Reference in New Issue