Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Oct 2012 15:21:07 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r241444 - head/sys/cam
Message-ID:  <201210111521.q9BFL7v4043349@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Thu Oct 11 15:21:07 2012
New Revision: 241444
URL: http://svn.freebsd.org/changeset/base/241444

Log:
  Increase device CCB queue array size by CAM_RL_VALUES - 1 (4) elements.
  It is required to store extra recovery requests in case of bus resets.
  On ATA/SATA this fixes assertion panics on HEAD with INVARIANTS enabled or
  possible memory corruptions otherwise if timeout/reset happens when device
  CCB queue is already full.
  
  Reported by:	gibbs@
  MFC after:	1 week

Modified:
  head/sys/cam/cam_queue.c

Modified: head/sys/cam/cam_queue.c
==============================================================================
--- head/sys/cam/cam_queue.c	Thu Oct 11 13:25:09 2012	(r241443)
+++ head/sys/cam/cam_queue.c	Thu Oct 11 15:21:07 2012	(r241444)
@@ -314,7 +314,8 @@ cam_ccbq_resize(struct cam_ccbq *ccbq, i
 	 * same size once the outstanding entries have been processed.
 	 */
 	if (space_left < 0
-	 || camq_resize(&ccbq->queue, new_size) == CAM_REQ_CMP) {
+	 || camq_resize(&ccbq->queue, new_size + (CAM_RL_VALUES - 1)) ==
+	    CAM_REQ_CMP) {
 		ccbq->devq_openings += delta;
 		ccbq->dev_openings += delta;
 		return (CAM_REQ_CMP);
@@ -327,7 +328,7 @@ int
 cam_ccbq_init(struct cam_ccbq *ccbq, int openings)
 {
 	bzero(ccbq, sizeof(*ccbq));
-	if (camq_init(&ccbq->queue, openings) != 0) {
+	if (camq_init(&ccbq->queue, openings + (CAM_RL_VALUES - 1)) != 0) {
 		return (1);
 	}
 	ccbq->devq_openings = openings;



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