Author: royger
Date: Tue Mar 21 09:38:59 2017
New Revision: 315676
URL: https://svnweb.freebsd.org/changeset/base/315676

Log:
  MFC r314840:
  
  xen: add support for canceled suspend
  
  Submitted by: Liuyingdong <liuyingd...@huawei.com>
  Reviewed by:  royger

Modified:
  stable/10/sys/dev/xen/blkfront/blkfront.c
  stable/10/sys/dev/xen/control/control.c
  stable/10/sys/dev/xen/netfront/netfront.c
  stable/10/sys/xen/xen-os.h
  stable/10/sys/xen/xenbus/xenbusb.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/xen/blkfront/blkfront.c
==============================================================================
--- stable/10/sys/dev/xen/blkfront/blkfront.c   Tue Mar 21 09:27:24 2017        
(r315675)
+++ stable/10/sys/dev/xen/blkfront/blkfront.c   Tue Mar 21 09:38:59 2017        
(r315676)
@@ -1533,6 +1533,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/10/sys/dev/xen/control/control.c
==============================================================================
--- stable/10/sys/dev/xen/control/control.c     Tue Mar 21 09:27:24 2017        
(r315675)
+++ stable/10/sys/dev/xen/control/control.c     Tue Mar 21 09:38:59 2017        
(r315676)
@@ -151,6 +151,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/xen/xenvar.h>
 #include <machine/xen/xenfunc.h>
 
+bool xen_suspend_cancelled;
 /*--------------------------- Forward Declarations --------------------------*/
 /** Function signature for shutdown event handlers. */
 typedef        void (xctrl_shutdown_handler_t)(void);
@@ -341,7 +342,6 @@ xctrl_suspend()
 #ifdef SMP
        cpuset_t cpu_suspend_map;
 #endif
-       int suspend_cancelled;
 
        EVENTHANDLER_INVOKE(power_suspend_early);
        xs_lock();
@@ -396,16 +396,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();
+       if (!xen_suspend_cancelled) {
+               gnttab_resume();
+       }
 
 #ifdef SMP
        /* Send an IPI_BITMAP in case there are pending bitmap IPIs. */

Modified: stable/10/sys/dev/xen/netfront/netfront.c
==============================================================================
--- stable/10/sys/dev/xen/netfront/netfront.c   Tue Mar 21 09:27:24 2017        
(r315675)
+++ stable/10/sys/dev/xen/netfront/netfront.c   Tue Mar 21 09:38:59 2017        
(r315676)
@@ -509,6 +509,15 @@ netfront_resume(device_t dev)
 {
        struct netfront_info *info = device_get_softc(dev);
 
+       if (xen_suspend_cancelled) {
+               XN_RX_LOCK(info);
+               XN_TX_LOCK(info);
+               netfront_carrier_on(info);
+               XN_TX_UNLOCK(info);
+               XN_RX_UNLOCK(info);
+               return (0);
+       }
+
        info->xn_resume = true;
        netif_disconnect_backend(info);
        return (0);

Modified: stable/10/sys/xen/xen-os.h
==============================================================================
--- stable/10/sys/xen/xen-os.h  Tue Mar 21 09:27:24 2017        (r315675)
+++ stable/10/sys/xen/xen-os.h  Tue Mar 21 09:38:59 2017        (r315676)
@@ -57,6 +57,8 @@ extern int xen_disable_pv_disks;
 extern int xen_disable_pv_nics;
 #endif
 
+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/10/sys/xen/xenbus/xenbusb.c
==============================================================================
--- stable/10/sys/xen/xenbus/xenbusb.c  Tue Mar 21 09:27:24 2017        
(r315675)
+++ stable/10/sys/xen/xenbus/xenbusb.c  Tue Mar 21 09:38:59 2017        
(r315676)
@@ -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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to