Author: mav
Date: Thu Nov 17 21:07:56 2011
New Revision: 227637
URL: http://svn.freebsd.org/changeset/base/227637

Log:
  Introduce CAM_SIM_POLLED SIM flag, indicating that it works in polling mode.
  It blocks CAM SWI usage on requests completion, unneeded because of polling
  and denied during kernel dumping because of blocked scheduler.
  
  Before r198899 there was periph flag CAM_PERIPH_POLLED, but that was wrong,
  because there is whole SIM is polled or handled by SWI, not a single periph.
  
  Tested by:    kib
  MFC after:    1 month

Modified:
  head/sys/cam/cam_sim.h
  head/sys/cam/cam_xpt.c

Modified: head/sys/cam/cam_sim.h
==============================================================================
--- head/sys/cam/cam_sim.h      Thu Nov 17 21:06:53 2011        (r227636)
+++ head/sys/cam/cam_sim.h      Thu Nov 17 21:07:56 2011        (r227637)
@@ -104,7 +104,8 @@ struct cam_sim {
        u_int32_t               flags;
 #define        CAM_SIM_REL_TIMEOUT_PENDING     0x01
 #define        CAM_SIM_MPSAFE                  0x02
-#define CAM_SIM_ON_DONEQ               0x04
+#define        CAM_SIM_ON_DONEQ                0x04
+#define        CAM_SIM_POLLED                  0x08
        struct callout          callout;
        struct cam_devq         *devq;  /* Device Queue to use for this SIM */
        int                     refcount; /* References to the SIM. */

Modified: head/sys/cam/cam_xpt.c
==============================================================================
--- head/sys/cam/cam_xpt.c      Thu Nov 17 21:06:53 2011        (r227636)
+++ head/sys/cam/cam_xpt.c      Thu Nov 17 21:07:56 2011        (r227637)
@@ -2957,6 +2957,9 @@ xpt_polled_action(union ccb *start_ccb)
 
        mtx_assert(sim->mtx, MA_OWNED);
 
+       /* Don't use ISR for this SIM while polling. */
+       sim->flags |= CAM_SIM_POLLED;
+
        /*
         * Steal an opening so that no other queued requests
         * can get it before us while we simulate interrupts.
@@ -2996,6 +2999,9 @@ xpt_polled_action(union ccb *start_ccb)
        } else {
                start_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
        }
+
+       /* We will use CAM ISR for this SIM again. */
+       sim->flags &= ~CAM_SIM_POLLED;
 }
 
 /*
@@ -4224,7 +4230,7 @@ xpt_done(union ccb *done_ccb)
                TAILQ_INSERT_TAIL(&sim->sim_doneq, &done_ccb->ccb_h,
                    sim_links.tqe);
                done_ccb->ccb_h.pinfo.index = CAM_DONEQ_INDEX;
-               if ((sim->flags & CAM_SIM_ON_DONEQ) == 0) {
+               if ((sim->flags & (CAM_SIM_ON_DONEQ | CAM_SIM_POLLED)) == 0) {
                        mtx_lock(&cam_simq_lock);
                        first = TAILQ_EMPTY(&cam_simq);
                        TAILQ_INSERT_TAIL(&cam_simq, sim, links);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to