Author: avg
Date: Wed Mar  6 09:22:10 2013
New Revision: 247876
URL: http://svnweb.freebsd.org/changeset/base/247876

Log:
  MFC r246247: x86 suspend/resume: suspend pics and pseudo-pics in reverse order

Modified:
  stable/8/sys/amd64/amd64/intr_machdep.c   (contents, props changed)
  stable/8/sys/amd64/include/intr_machdep.h
  stable/8/sys/i386/i386/intr_machdep.c   (contents, props changed)
  stable/8/sys/i386/include/intr_machdep.h
  stable/8/sys/x86/x86/local_apic.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/   (props changed)
  stable/8/sys/i386/   (props changed)
  stable/8/sys/x86/   (props changed)

Modified: stable/8/sys/amd64/amd64/intr_machdep.c
==============================================================================
--- stable/8/sys/amd64/amd64/intr_machdep.c     Wed Mar  6 09:16:01 2013        
(r247875)
+++ stable/8/sys/amd64/amd64/intr_machdep.c     Wed Mar  6 09:22:10 2013        
(r247876)
@@ -74,7 +74,7 @@ static int intrcnt_index;
 static struct intsrc *interrupt_sources[NUM_IO_INTS];
 static struct mtx intr_table_lock;
 static struct mtx intrcnt_lock;
-static STAILQ_HEAD(, pic) pics;
+static TAILQ_HEAD(pics_head, pic) pics;
 
 #ifdef SMP
 static int assign_cpu;
@@ -93,7 +93,7 @@ intr_pic_registered(struct pic *pic)
 {
        struct pic *p;
 
-       STAILQ_FOREACH(p, &pics, pics) {
+       TAILQ_FOREACH(p, &pics, pics) {
                if (p == pic)
                        return (1);
        }
@@ -115,7 +115,7 @@ intr_register_pic(struct pic *pic)
        if (intr_pic_registered(pic))
                error = EBUSY;
        else {
-               STAILQ_INSERT_TAIL(&pics, pic, pics);
+               TAILQ_INSERT_TAIL(&pics, pic, pics);
                error = 0;
        }
        mtx_unlock(&intr_table_lock);
@@ -278,7 +278,7 @@ intr_resume(void)
        atpic_reset();
 #endif
        mtx_lock(&intr_table_lock);
-       STAILQ_FOREACH(pic, &pics, pics) {
+       TAILQ_FOREACH(pic, &pics, pics) {
                if (pic->pic_resume != NULL)
                        pic->pic_resume(pic);
        }
@@ -291,7 +291,7 @@ intr_suspend(void)
        struct pic *pic;
 
        mtx_lock(&intr_table_lock);
-       STAILQ_FOREACH(pic, &pics, pics) {
+       TAILQ_FOREACH_REVERSE(pic, &pics, pics_head, pics) {
                if (pic->pic_suspend != NULL)
                        pic->pic_suspend(pic);
        }
@@ -372,7 +372,7 @@ intr_init(void *dummy __unused)
 
        intrcnt_setname("???", 0);
        intrcnt_index = 1;
-       STAILQ_INIT(&pics);
+       TAILQ_INIT(&pics);
        mtx_init(&intr_table_lock, "intr sources", NULL, MTX_DEF);
        mtx_init(&intrcnt_lock, "intrcnt", NULL, MTX_SPIN);
 }

Modified: stable/8/sys/amd64/include/intr_machdep.h
==============================================================================
--- stable/8/sys/amd64/include/intr_machdep.h   Wed Mar  6 09:16:01 2013        
(r247875)
+++ stable/8/sys/amd64/include/intr_machdep.h   Wed Mar  6 09:22:10 2013        
(r247876)
@@ -94,7 +94,7 @@ struct pic {
        int (*pic_config_intr)(struct intsrc *, enum intr_trigger,
            enum intr_polarity);
        int (*pic_assign_cpu)(struct intsrc *, u_int apic_id);
-       STAILQ_ENTRY(pic) pics;
+       TAILQ_ENTRY(pic) pics;
 };
 
 /* Flags for pic_disable_source() */

Modified: stable/8/sys/i386/i386/intr_machdep.c
==============================================================================
--- stable/8/sys/i386/i386/intr_machdep.c       Wed Mar  6 09:16:01 2013        
(r247875)
+++ stable/8/sys/i386/i386/intr_machdep.c       Wed Mar  6 09:22:10 2013        
(r247876)
@@ -65,7 +65,7 @@ static int intrcnt_index;
 static struct intsrc *interrupt_sources[NUM_IO_INTS];
 static struct mtx intr_table_lock;
 static struct mtx intrcnt_lock;
-static STAILQ_HEAD(, pic) pics;
+static TAILQ_HEAD(pics_head, pic) pics;
 
 #ifdef SMP
 static int assign_cpu;
@@ -84,7 +84,7 @@ intr_pic_registered(struct pic *pic)
 {
        struct pic *p;
 
-       STAILQ_FOREACH(p, &pics, pics) {
+       TAILQ_FOREACH(p, &pics, pics) {
                if (p == pic)
                        return (1);
        }
@@ -106,7 +106,7 @@ intr_register_pic(struct pic *pic)
        if (intr_pic_registered(pic))
                error = EBUSY;
        else {
-               STAILQ_INSERT_TAIL(&pics, pic, pics);
+               TAILQ_INSERT_TAIL(&pics, pic, pics);
                error = 0;
        }
        mtx_unlock(&intr_table_lock);
@@ -266,7 +266,7 @@ intr_resume(void)
        struct pic *pic;
 
        mtx_lock(&intr_table_lock);
-       STAILQ_FOREACH(pic, &pics, pics) {
+       TAILQ_FOREACH(pic, &pics, pics) {
                if (pic->pic_resume != NULL)
                        pic->pic_resume(pic);
        }
@@ -279,7 +279,7 @@ intr_suspend(void)
        struct pic *pic;
 
        mtx_lock(&intr_table_lock);
-       STAILQ_FOREACH(pic, &pics, pics) {
+       TAILQ_FOREACH_REVERSE(pic, &pics, pics_head, pics) {
                if (pic->pic_suspend != NULL)
                        pic->pic_suspend(pic);
        }
@@ -360,7 +360,7 @@ intr_init(void *dummy __unused)
 
        intrcnt_setname("???", 0);
        intrcnt_index = 1;
-       STAILQ_INIT(&pics);
+       TAILQ_INIT(&pics);
        mtx_init(&intr_table_lock, "intr sources", NULL, MTX_DEF);
        mtx_init(&intrcnt_lock, "intrcnt", NULL, MTX_SPIN);
 }

Modified: stable/8/sys/i386/include/intr_machdep.h
==============================================================================
--- stable/8/sys/i386/include/intr_machdep.h    Wed Mar  6 09:16:01 2013        
(r247875)
+++ stable/8/sys/i386/include/intr_machdep.h    Wed Mar  6 09:22:10 2013        
(r247876)
@@ -94,7 +94,7 @@ struct pic {
        int (*pic_config_intr)(struct intsrc *, enum intr_trigger,
            enum intr_polarity);
        int (*pic_assign_cpu)(struct intsrc *, u_int apic_id);
-       STAILQ_ENTRY(pic) pics;
+       TAILQ_ENTRY(pic) pics;
 };
 
 /* Flags for pic_disable_source() */

Modified: stable/8/sys/x86/x86/local_apic.c
==============================================================================
--- stable/8/sys/x86/x86/local_apic.c   Wed Mar  6 09:16:01 2013        
(r247875)
+++ stable/8/sys/x86/x86/local_apic.c   Wed Mar  6 09:22:10 2013        
(r247876)
@@ -1366,11 +1366,19 @@ apic_setup_io(void *dummy __unused)
 
        if (best_enum == NULL)
                return;
+
+       /*
+        * Local APIC must be registered before other PICs and pseudo PICs
+        * for proper suspend/resume order.
+        */
+#ifndef XEN
+       intr_register_pic(&lapic_pic);
+#endif
+
        retval = best_enum->apic_setup_io();
        if (retval != 0)
                printf("%s: Failed to setup I/O APICs: returned %d\n",
                    best_enum->apic_name, retval);
-
 #ifdef XEN
        return;
 #endif
@@ -1379,7 +1387,6 @@ apic_setup_io(void *dummy __unused)
         * properly program the LINT pins.
         */
        lapic_setup(1);
-       intr_register_pic(&lapic_pic);
        if (bootverbose)
                lapic_dump("BSP");
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to