panic with CTL/FC at r251897 and beyond

Kenneth D. Merry ken at freebsd.org
Wed Sep 25 19:47:39 UTC 2013


On Wed, Sep 25, 2013 at 03:50:51 +0000, John wrote:
> Hi Folks,
> 
>    I've slowly been chasing down a panic with 9-stable and I've
> gotten to the point where the large mfc commits of r251897 and
> r251874 by Scott seem to be the culprit. I posted some info
> about this a few weeks back.
> 
>    The last working commit (involving cam) is r251852 by Alexander.
> This is the last commit where I can create and export a lun via
> FC and have the client use it.

Hmm, that's not good!

>    The problem I see is in cam/ctl/scsi_ctl.c:ctlfedone() at
> the end of the XPT_CONT_TARGET_IO: switch label:
> 
> /*
>  * Release the CTIO.  The ATIO will be sent back
>  * down to the SIM once we send status.
>  */
> softc->ccbs_freed++;
> xpt_release_ccb(done_ccb);
>                                 
> /* Call the backend move done callback */
> io->scsiio.be_move_done(io);
> 
>    be_move_done is null so the code branches to 0
> 
> 
>    Before I start trying to figure out the large number of
> changes in the above 2 commits (a pair of mass mfc's) I was
> hoping someone might have an idea of what is wrong and could
> provide some pointers. I'd also be curious to know if anyone
> is successfully using a recent 9-stable with CTL/FC and if
> so, how they have it configured.
> 
>    Fbsd-10 works correctly on the same hardware also.
> 
>    I can provide ssh access and serial console debugging
> if needed.

Try the attached patch.  I neglected to MFC it, and you'll certainly have
problems without it with the block backend.

The ramdisk backend should work okay without this patch, because it doesn't
use S/G lists by default.

It's possible that the be_move_done() pointer is getting overwritten by a
DMA.

Ken
-- 
Kenneth Merry
ken at FreeBSD.ORG
-------------- next part --------------
==== //depot/users/kenm/FreeBSD-stable/9/sys/cam/ctl/scsi_ctl.c#6 - /usr/home/kenm/perforce4/kenm/FreeBSD-stable/9/sys/cam/ctl/scsi_ctl.c ====
*** /tmp/tmp.38501.93	Wed Sep 25 13:33:36 2013
--- /usr/home/kenm/perforce4/kenm/FreeBSD-stable/9/sys/cam/ctl/scsi_ctl.c	Wed Sep 25 13:33:20 2013
***************
*** 916,922 ****
  				if (io->io_hdr.flags & CTL_FLAG_BUS_ADDR)
  					flags |= CAM_DATA_SG_PADDR;
  				else
! 					flags &= ~CAM_DATA_SG;
  				data_ptr = (uint8_t *)cam_sglist;
  				dxfer_len = io->scsiio.kern_data_len;
  			} else {
--- 916,922 ----
  				if (io->io_hdr.flags & CTL_FLAG_BUS_ADDR)
  					flags |= CAM_DATA_SG_PADDR;
  				else
! 					flags |= CAM_DATA_SG;
  				data_ptr = (uint8_t *)cam_sglist;
  				dxfer_len = io->scsiio.kern_data_len;
  			} else {
***************
*** 938,943 ****
--- 938,947 ----
  				data_ptr = sglist[*ti].addr;
  				dxfer_len = sglist[*ti].len;
  				csio->sglist_cnt = 0;
+ 				if (io->io_hdr.flags & CTL_FLAG_BUS_ADDR)
+ 					flags |= CAM_DATA_PADDR;
+ 				else
+ 					flags |= CAM_DATA_VADDR;
  				cmd_info->flags |= CTLFE_CMD_PIECEWISE;
  				(*ti)++;
  			}


More information about the freebsd-scsi mailing list