git: 428ebb7cd9f5 - main - pst: improve shutdown_post_sync handler

From: Mitchell Horne <mhorne_at_FreeBSD.org>
Date: Thu, 23 Nov 2023 16:07:57 UTC
The branch main has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=428ebb7cd9f51afb6809bf81cf21a05e0fd93ff4

commit 428ebb7cd9f51afb6809bf81cf21a05e0fd93ff4
Author:     Mitchell Horne <mhorne@FreeBSD.org>
AuthorDate: 2023-11-23 15:59:05 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2023-11-23 16:07:42 +0000

    pst: improve shutdown_post_sync handler
    
    It is desirable to shut down the raid controller even in the face of a
    panic. In the SCHEDULER_STOPPED() case, set the interrupt mask bits so
    that we request a polled wait, rather than sleep(), from
    iop_queue_wait_msg().
    
    Tweak the function name and signature.
    
    Reviewed by:    markj
    MFC after:      2 weeks
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D42337
---
 sys/dev/pst/pst-iop.c  |  2 +-
 sys/dev/pst/pst-raid.c | 14 +++++++++-----
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/sys/dev/pst/pst-iop.c b/sys/dev/pst/pst-iop.c
index f9921a564333..43ced2401d2c 100644
--- a/sys/dev/pst/pst-iop.c
+++ b/sys/dev/pst/pst-iop.c
@@ -432,7 +432,7 @@ iop_queue_wait_msg(struct iop_softc *sc, int mfa, struct i2o_basic_message *msg)
     int status, timeout = 10000;
 
     mtx_lock(&sc->mtx);
-    if (!(sc->reg->oqueue_intr_mask & 0x08)) {
+    if ((sc->reg->oqueue_intr_mask & I20_OUT_INTR_QUEUE) == 0) {
         msg->transaction_context = (u_int32_t)&request;
         msg->initiator_context = (u_int32_t)iop_done;
         sc->reg->iqueue = mfa;
diff --git a/sys/dev/pst/pst-raid.c b/sys/dev/pst/pst-raid.c
index 4e9c4fb724bc..4f9279462ee8 100644
--- a/sys/dev/pst/pst-raid.c
+++ b/sys/dev/pst/pst-raid.c
@@ -73,7 +73,7 @@ struct pst_request {
 static disk_strategy_t pststrategy;
 static int pst_probe(device_t);
 static int pst_attach(device_t);
-static int pst_shutdown(device_t);
+static void pst_shutdown_post_sync(device_t, int);
 static void pst_start(struct pst_softc *);
 static void pst_done(struct iop_softc *, u_int32_t, struct i2o_single_reply *);
 static int pst_rw(struct pst_request *);
@@ -170,18 +170,23 @@ pst_attach(device_t dev)
 	   name, psc->info->capacity/(512*255*63), 255, 63,
 	   device_get_nameunit(psc->iop->dev));
 
-    EVENTHANDLER_REGISTER(shutdown_post_sync, pst_shutdown,
+    EVENTHANDLER_REGISTER(shutdown_post_sync, pst_shutdown_post_sync,
 			  dev, SHUTDOWN_PRI_FIRST);
     return 0;
 }
 
-static int
-pst_shutdown(device_t dev)
+static void
+pst_shutdown_post_sync(device_t dev, int howto __unused)
 {
     struct pst_softc *psc = device_get_softc(dev);
     struct i2o_bsa_cache_flush_message *msg;
     int mfa;
 
+    if (SCHEDULER_STOPPED()) {
+	/* Request polled shutdown. */
+	psc->reg->oqueue_intr_mask = 0xffffffff;
+    }
+
     mfa = iop_get_mfa(psc->iop);
     msg = (struct i2o_bsa_cache_flush_message *)(psc->iop->ibase + mfa);
     bzero(msg, sizeof(struct i2o_bsa_cache_flush_message));
@@ -194,7 +199,6 @@ pst_shutdown(device_t dev)
     msg->control_flags = 0x0; /* 0x80 = post progress reports */
     if (iop_queue_wait_msg(psc->iop, mfa, (struct i2o_basic_message *)msg))
 	printf("pst: shutdown failed!\n");
-    return 0;
 }
 
 static void