Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 Jan 2012 17:36:14 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r229297 - stable/9/sys/cam
Message-ID:  <201201021736.q02HaEXw077699@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Mon Jan  2 17:36:14 2012
New Revision: 229297
URL: http://svn.freebsd.org/changeset/base/229297

Log:
  MFC r227637:
  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.

Modified:
  stable/9/sys/cam/cam_sim.h
  stable/9/sys/cam/cam_xpt.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/amd64/include/xen/   (props changed)
  stable/9/sys/boot/   (props changed)
  stable/9/sys/boot/i386/efi/   (props changed)
  stable/9/sys/boot/ia64/efi/   (props changed)
  stable/9/sys/boot/ia64/ski/   (props changed)
  stable/9/sys/boot/powerpc/boot1.chrp/   (props changed)
  stable/9/sys/boot/powerpc/ofw/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)
  stable/9/sys/conf/   (props changed)
  stable/9/sys/contrib/dev/acpica/   (props changed)
  stable/9/sys/contrib/octeon-sdk/   (props changed)
  stable/9/sys/contrib/pf/   (props changed)
  stable/9/sys/contrib/x86emu/   (props changed)

Modified: stable/9/sys/cam/cam_sim.h
==============================================================================
--- stable/9/sys/cam/cam_sim.h	Mon Jan  2 17:31:28 2012	(r229296)
+++ stable/9/sys/cam/cam_sim.h	Mon Jan  2 17:36:14 2012	(r229297)
@@ -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: stable/9/sys/cam/cam_xpt.c
==============================================================================
--- stable/9/sys/cam/cam_xpt.c	Mon Jan  2 17:31:28 2012	(r229296)
+++ stable/9/sys/cam/cam_xpt.c	Mon Jan  2 17:36:14 2012	(r229297)
@@ -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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201201021736.q02HaEXw077699>