patch to add a tunable that disables ORDERED tag emission

Scott Long scottl at samsco.org
Tue Oct 31 03:34:53 UTC 2006


I recall that Gibbs was a strong believer in the ordered tag, should
probably get his input for this.

Scott


mjacob at freebsd.org wrote:
> 
> I could have sworn we talked about this some time back - ordered tag 
> usage really kills performance in a lot of cases, so let's have a 
> tunable where we can disable the emission of ORDERED tags at regular 
> intervals.
> 
> 
> ------------------------------------------------------------------------
> 
> ==== //depot/projects/newisp/cam/scsi/scsi_da.c#3 - /home/FreeBSD/p4/newisp/cam/scsi/scsi_da.c ====
> @@ -491,8 +491,14 @@
>  #define	DA_DEFAULT_RETRY	4
>  #endif
>  
> +#ifndef	DA_DEFAULT_SEND_ORDERED
> +#define	DA_DEFAULT_SEND_ORDERED	1
> +#endif
> +
> +
>  static int da_retry_count = DA_DEFAULT_RETRY;
>  static int da_default_timeout = DA_DEFAULT_TIMEOUT;
> +static int da_send_ordered = DA_DEFAULT_SEND_ORDERED;
>  
>  SYSCTL_NODE(_kern_cam, OID_AUTO, da, CTLFLAG_RD, 0,
>              "CAM Direct Access Disk driver");
> @@ -502,6 +508,9 @@
>  SYSCTL_INT(_kern_cam_da, OID_AUTO, default_timeout, CTLFLAG_RW,
>             &da_default_timeout, 0, "Normal I/O timeout (in seconds)");
>  TUNABLE_INT("kern.cam.da.default_timeout", &da_default_timeout);
> +SYSCTL_INT(_kern_cam_da, OID_AUTO, da_send_ordered, CTLFLAG_RW,
> +           &da_send_ordered, 0, "Send Ordered Tags");
> +TUNABLE_INT("kern.cam.da.da_send_ordered", &da_send_ordered);
>  
>  /*
>   * DA_ORDEREDTAG_INTERVAL determines how often, relative
> @@ -851,7 +860,7 @@
>  	if (status != CAM_REQ_CMP) {
>  		printf("da: Failed to attach master async callback "
>  		       "due to status 0x%x!\n", status);
> -	} else {
> +	} else if (da_send_ordered) {
>  
>  		/*
>  		 * Schedule a periodic event to occasionally send an
> @@ -1921,24 +1930,25 @@
>  {
>  	struct da_softc *softc;
>  	int s;
> +	if (da_send_ordered) {
> +		for (softc = SLIST_FIRST(&softc_list);
> +		     softc != NULL;
> +		     softc = SLIST_NEXT(softc, links)) {
> +			s = splsoftcam();
> +			if ((softc->ordered_tag_count == 0) 
> +			 && ((softc->flags & DA_FLAG_WENT_IDLE) == 0)) {
> +				softc->flags |= DA_FLAG_NEED_OTAG;
> +			}
> +			if (softc->outstanding_cmds > 0)
> +				softc->flags &= ~DA_FLAG_WENT_IDLE;
>  
> -	for (softc = SLIST_FIRST(&softc_list);
> -	     softc != NULL;
> -	     softc = SLIST_NEXT(softc, links)) {
> -		s = splsoftcam();
> -		if ((softc->ordered_tag_count == 0) 
> -		 && ((softc->flags & DA_FLAG_WENT_IDLE) == 0)) {
> -			softc->flags |= DA_FLAG_NEED_OTAG;
> +			softc->ordered_tag_count = 0;
> +			splx(s);
>  		}
> -		if (softc->outstanding_cmds > 0)
> -			softc->flags &= ~DA_FLAG_WENT_IDLE;
> -
> -		softc->ordered_tag_count = 0;
> -		splx(s);
> +		/* Queue us up again */
> +		timeout(dasendorderedtag, NULL,
> +			(da_default_timeout * hz) / DA_ORDEREDTAG_INTERVAL);
>  	}
> -	/* Queue us up again */
> -	timeout(dasendorderedtag, NULL,
> -		(da_default_timeout * hz) / DA_ORDEREDTAG_INTERVAL);
>  }
>  
>  /*
> ==== //depot/projects/newisp/dev/bge/if_bge.c#8 - /home/FreeBSD/p4/newisp/dev/bge/if_bge.c ====
> @@ -32,7 +32,7 @@
>   */
>  
>  #include <sys/cdefs.h>
> -__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.150 2006/10/03 09:31:49 glebius Exp $");
> +__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.151 2006/10/19 08:03:22 scottl Exp $");
>  
>  /*
>   * Broadcom BCM570x family gigabit ethernet driver for FreeBSD.
> @@ -1823,7 +1823,7 @@
>  	 * Allocate the parent bus DMA tag appropriate for PCI.
>  	 */
>  	error = bus_dma_tag_create(bus_get_dma_tag(sc->bge_dev),/* parent */
> -			PAGE_SIZE, 0,		/* alignment, boundary */
> +			1, 0,			/* alignment, boundary */
>  			BUS_SPACE_MAXADDR,	/* lowaddr */
>  			BUS_SPACE_MAXADDR,	/* highaddr */
>  			NULL, NULL,		/* filter, filterarg */
> @@ -2499,6 +2499,12 @@
>  		}
>  	}
>  
> +	/*
> +	 * Write the magic number to the firmware mailbox at 0xb50
> +         * so that the driver can synchronize with the firmware.
> +	 */
> +	bge_writemem_ind(sc, BGE_SOFTWARE_GENCOMM, BGE_MAGIC_NUMBER);
> +
>  	/* Issue global reset */
>  	bge_writereg_ind(sc, BGE_MISC_CFG, reset);
>  
> @@ -2535,11 +2541,6 @@
>  		CSR_WRITE_4(sc, BGE_MARB_MODE, BGE_MARBMODE_ENABLE);
>  
>  	/*
> -	 * Prevent PXE restart: write a magic number to the
> -	 * general communications memory at 0xB50.
> -	 */
> -	bge_writemem_ind(sc, BGE_SOFTWARE_GENCOMM, BGE_MAGIC_NUMBER);
> -	/*
>  	 * Poll the value location we just wrote until
>  	 * we see the 1's complement of the magic number.
>  	 * This indicates that the firmware initialization
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> freebsd-scsi at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-scsi
> To unsubscribe, send any mail to "freebsd-scsi-unsubscribe at freebsd.org"



More information about the freebsd-scsi mailing list