diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 74 | 
1 files changed, 18 insertions, 56 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 4560713ecb1..e1c7eebfe90 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -8,6 +8,7 @@   */  #include <linux/bio.h> +#include <linux/bitops.h>  #include <linux/blkdev.h>  #include <linux/completion.h>  #include <linux/kernel.h> @@ -34,13 +35,6 @@  #define SG_MEMPOOL_NR		ARRAY_SIZE(scsi_sg_pools)  #define SG_MEMPOOL_SIZE		2 -/* - * The maximum number of SG segments that we will put inside a scatterlist - * (unless chaining is used). Should ideally fit inside a single page, to - * avoid a higher order allocation. - */ -#define SCSI_MAX_SG_SEGMENTS	128 -  struct scsi_host_sg_pool {  	size_t		size;  	char		*name; @@ -48,19 +42,26 @@ struct scsi_host_sg_pool {  	mempool_t	*pool;  }; -#define SP(x) { x, "sgpool-" #x } +#define SP(x) { x, "sgpool-" __stringify(x) } +#if (SCSI_MAX_SG_SEGMENTS < 32) +#error SCSI_MAX_SG_SEGMENTS is too small (must be 32 or greater) +#endif  static struct scsi_host_sg_pool scsi_sg_pools[] = {  	SP(8),  	SP(16), -#if (SCSI_MAX_SG_SEGMENTS > 16) -	SP(32),  #if (SCSI_MAX_SG_SEGMENTS > 32) -	SP(64), +	SP(32),  #if (SCSI_MAX_SG_SEGMENTS > 64) +	SP(64), +#if (SCSI_MAX_SG_SEGMENTS > 128)  	SP(128), +#if (SCSI_MAX_SG_SEGMENTS > 256) +#error SCSI_MAX_SG_SEGMENTS is too large (256 MAX)  #endif  #endif  #endif +#endif +	SP(SCSI_MAX_SG_SEGMENTS)  };  #undef SP @@ -692,42 +693,16 @@ static struct scsi_cmnd *scsi_end_request(struct scsi_cmnd *cmd, int error,  	return NULL;  } -/* - * Like SCSI_MAX_SG_SEGMENTS, but for archs that have sg chaining. This limit - * is totally arbitrary, a setting of 2048 will get you at least 8mb ios. - */ -#define SCSI_MAX_SG_CHAIN_SEGMENTS	2048 -  static inline unsigned int scsi_sgtable_index(unsigned short nents)  {  	unsigned int index; -	switch (nents) { -	case 1 ... 8: +	BUG_ON(nents > SCSI_MAX_SG_SEGMENTS); + +	if (nents <= 8)  		index = 0; -		break; -	case 9 ... 16: -		index = 1; -		break; -#if (SCSI_MAX_SG_SEGMENTS > 16) -	case 17 ... 32: -		index = 2; -		break; -#if (SCSI_MAX_SG_SEGMENTS > 32) -	case 33 ... 64: -		index = 3; -		break; -#if (SCSI_MAX_SG_SEGMENTS > 64) -	case 65 ... 128: -		index = 4; -		break; -#endif -#endif -#endif -	default: -		printk(KERN_ERR "scsi: bad segment count=%d\n", nents); -		BUG(); -	} +	else +		index = get_count_order(nents) - 3;  	return index;  } @@ -1603,20 +1578,7 @@ struct request_queue *__scsi_alloc_queue(struct Scsi_Host *shost,  	 * this limit is imposed by hardware restrictions  	 */  	blk_queue_max_hw_segments(q, shost->sg_tablesize); - -	/* -	 * In the future, sg chaining support will be mandatory and this -	 * ifdef can then go away. Right now we don't have all archs -	 * converted, so better keep it safe. -	 */ -#ifdef ARCH_HAS_SG_CHAIN -	if (shost->use_sg_chaining) -		blk_queue_max_phys_segments(q, SCSI_MAX_SG_CHAIN_SEGMENTS); -	else -		blk_queue_max_phys_segments(q, SCSI_MAX_SG_SEGMENTS); -#else -	blk_queue_max_phys_segments(q, SCSI_MAX_SG_SEGMENTS); -#endif +	blk_queue_max_phys_segments(q, SCSI_MAX_SG_CHAIN_SEGMENTS);  	blk_queue_max_sectors(q, shost->max_sectors);  	blk_queue_bounce_limit(q, scsi_calculate_bounce_limit(shost));  |