svn commit: r315668 - in stable/11/sys: dev/xen/blkfront dev/xen/control dev/xen/netfront xen xen/xenbus
Roger Pau Monné
royger at FreeBSD.org
Tue Mar 21 08:38:14 UTC 2017
Author: royger
Date: Tue Mar 21 08:38:12 2017
New Revision: 315668
URL: https://svnweb.freebsd.org/changeset/base/315668
Log:
MFC r314840:
xen: add support for canceled suspend
Submitted by: Liuyingdong <liuyingdong at huawei.com>
Reviewed by: royger
Modified:
stable/11/sys/dev/xen/blkfront/blkfront.c
stable/11/sys/dev/xen/control/control.c
stable/11/sys/dev/xen/netfront/netfront.c
stable/11/sys/xen/xen-os.h
stable/11/sys/xen/xenbus/xenbusb.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/dev/xen/blkfront/blkfront.c
==============================================================================
--- stable/11/sys/dev/xen/blkfront/blkfront.c Tue Mar 21 08:36:25 2017 (r315667)
+++ stable/11/sys/dev/xen/blkfront/blkfront.c Tue Mar 21 08:38:12 2017 (r315668)
@@ -1537,6 +1537,11 @@ xbd_resume(device_t dev)
{
struct xbd_softc *sc = device_get_softc(dev);
+ if (xen_suspend_cancelled) {
+ sc->xbd_state = XBD_STATE_CONNECTED;
+ return (0);
+ }
+
DPRINTK("xbd_resume: %s\n", xenbus_get_node(dev));
xbd_free(sc);
Modified: stable/11/sys/dev/xen/control/control.c
==============================================================================
--- stable/11/sys/dev/xen/control/control.c Tue Mar 21 08:36:25 2017 (r315667)
+++ stable/11/sys/dev/xen/control/control.c Tue Mar 21 08:38:12 2017 (r315668)
@@ -148,6 +148,7 @@ __FBSDID("$FreeBSD$");
#include <xen/xenbus/xenbusvar.h>
+bool xen_suspend_cancelled;
/*--------------------------- Forward Declarations --------------------------*/
/** Function signature for shutdown event handlers. */
typedef void (xctrl_shutdown_handler_t)(void);
@@ -196,7 +197,6 @@ xctrl_suspend()
#ifdef SMP
cpuset_t cpu_suspend_map;
#endif
- int suspend_cancelled;
EVENTHANDLER_INVOKE(power_suspend_early);
xs_lock();
@@ -269,16 +269,20 @@ xctrl_suspend()
intr_suspend();
xen_hvm_suspend();
- suspend_cancelled = HYPERVISOR_suspend(0);
+ xen_suspend_cancelled = !!HYPERVISOR_suspend(0);
- xen_hvm_resume(suspend_cancelled != 0);
- intr_resume(suspend_cancelled != 0);
+ if (!xen_suspend_cancelled) {
+ xen_hvm_resume(false);
+ }
+ intr_resume(xen_suspend_cancelled != 0);
enable_intr();
/*
* Reset grant table info.
*/
- gnttab_resume(NULL);
+ if (!xen_suspend_cancelled) {
+ gnttab_resume(NULL);
+ }
#ifdef SMP
if (!CPU_EMPTY(&cpu_suspend_map)) {
Modified: stable/11/sys/dev/xen/netfront/netfront.c
==============================================================================
--- stable/11/sys/dev/xen/netfront/netfront.c Tue Mar 21 08:36:25 2017 (r315667)
+++ stable/11/sys/dev/xen/netfront/netfront.c Tue Mar 21 08:38:12 2017 (r315668)
@@ -439,6 +439,20 @@ static int
netfront_resume(device_t dev)
{
struct netfront_info *info = device_get_softc(dev);
+ u_int i;
+
+ if (xen_suspend_cancelled) {
+ for (i = 0; i < info->num_queues; i++) {
+ XN_RX_LOCK(&info->rxq[i]);
+ XN_TX_LOCK(&info->txq[i]);
+ }
+ netfront_carrier_on(info);
+ for (i = 0; i < info->num_queues; i++) {
+ XN_RX_UNLOCK(&info->rxq[i]);
+ XN_TX_UNLOCK(&info->txq[i]);
+ }
+ return (0);
+ }
netif_disconnect_backend(info);
return (0);
Modified: stable/11/sys/xen/xen-os.h
==============================================================================
--- stable/11/sys/xen/xen-os.h Tue Mar 21 08:36:25 2017 (r315667)
+++ stable/11/sys/xen/xen-os.h Tue Mar 21 08:38:12 2017 (r315668)
@@ -56,6 +56,8 @@ extern char *console_page;
extern int xen_disable_pv_disks;
extern int xen_disable_pv_nics;
+extern bool xen_suspend_cancelled;
+
enum xen_domain_type {
XEN_NATIVE, /* running on bare hardware */
XEN_PV_DOMAIN, /* running in a PV domain */
Modified: stable/11/sys/xen/xenbus/xenbusb.c
==============================================================================
--- stable/11/sys/xen/xenbus/xenbusb.c Tue Mar 21 08:36:25 2017 (r315667)
+++ stable/11/sys/xen/xenbus/xenbusb.c Tue Mar 21 08:38:12 2017 (r315668)
@@ -791,6 +791,11 @@ xenbusb_resume(device_t dev)
if (device_get_state(kids[i]) == DS_NOTPRESENT)
continue;
+ if (xen_suspend_cancelled) {
+ DEVICE_RESUME(kids[i]);
+ continue;
+ }
+
ivars = device_get_ivars(kids[i]);
xs_unregister_watch(&ivars->xd_otherend_watch);
More information about the svn-src-all
mailing list