diff options
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index b6e6d801768b..1a7e8d811a08 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -34,6 +34,13 @@ | |||
| 34 | #define SG_MEMPOOL_NR ARRAY_SIZE(scsi_sg_pools) | 34 | #define SG_MEMPOOL_NR ARRAY_SIZE(scsi_sg_pools) |
| 35 | #define SG_MEMPOOL_SIZE 2 | 35 | #define SG_MEMPOOL_SIZE 2 |
| 36 | 36 | ||
| 37 | /* | ||
| 38 | * The maximum number of SG segments that we will put inside a scatterlist | ||
| 39 | * (unless chaining is used). Should ideally fit inside a single page, to | ||
| 40 | * avoid a higher order allocation. | ||
| 41 | */ | ||
| 42 | #define SCSI_MAX_SG_SEGMENTS 128 | ||
| 43 | |||
| 37 | struct scsi_host_sg_pool { | 44 | struct scsi_host_sg_pool { |
| 38 | size_t size; | 45 | size_t size; |
| 39 | char *name; | 46 | char *name; |
| @@ -45,9 +52,15 @@ struct scsi_host_sg_pool { | |||
| 45 | static struct scsi_host_sg_pool scsi_sg_pools[] = { | 52 | static struct scsi_host_sg_pool scsi_sg_pools[] = { |
| 46 | SP(8), | 53 | SP(8), |
| 47 | SP(16), | 54 | SP(16), |
| 55 | #if (SCSI_MAX_SG_SEGMENTS > 16) | ||
| 48 | SP(32), | 56 | SP(32), |
| 57 | #if (SCSI_MAX_SG_SEGMENTS > 32) | ||
| 49 | SP(64), | 58 | SP(64), |
| 59 | #if (SCSI_MAX_SG_SEGMENTS > 64) | ||
| 50 | SP(128), | 60 | SP(128), |
| 61 | #endif | ||
| 62 | #endif | ||
| 63 | #endif | ||
| 51 | }; | 64 | }; |
| 52 | #undef SP | 65 | #undef SP |
| 53 | 66 | ||
| @@ -685,13 +698,6 @@ static struct scsi_cmnd *scsi_end_request(struct scsi_cmnd *cmd, int uptodate, | |||
| 685 | } | 698 | } |
| 686 | 699 | ||
| 687 | /* | 700 | /* |
| 688 | * The maximum number of SG segments that we will put inside a scatterlist | ||
| 689 | * (unless chaining is used). Should ideally fit inside a single page, to | ||
| 690 | * avoid a higher order allocation. | ||
| 691 | */ | ||
| 692 | #define SCSI_MAX_SG_SEGMENTS 128 | ||
| 693 | |||
| 694 | /* | ||
| 695 | * Like SCSI_MAX_SG_SEGMENTS, but for archs that have sg chaining. This limit | 701 | * Like SCSI_MAX_SG_SEGMENTS, but for archs that have sg chaining. This limit |
| 696 | * is totally arbitrary, a setting of 2048 will get you at least 8mb ios. | 702 | * is totally arbitrary, a setting of 2048 will get you at least 8mb ios. |
| 697 | */ | 703 | */ |
| @@ -708,15 +714,21 @@ static inline unsigned int scsi_sgtable_index(unsigned short nents) | |||
| 708 | case 9 ... 16: | 714 | case 9 ... 16: |
| 709 | index = 1; | 715 | index = 1; |
| 710 | break; | 716 | break; |
| 717 | #if (SCSI_MAX_SG_SEGMENTS > 16) | ||
| 711 | case 17 ... 32: | 718 | case 17 ... 32: |
| 712 | index = 2; | 719 | index = 2; |
| 713 | break; | 720 | break; |
| 721 | #if (SCSI_MAX_SG_SEGMENTS > 32) | ||
| 714 | case 33 ... 64: | 722 | case 33 ... 64: |
| 715 | index = 3; | 723 | index = 3; |
| 716 | break; | 724 | break; |
| 717 | case 65 ... SCSI_MAX_SG_SEGMENTS: | 725 | #if (SCSI_MAX_SG_SEGMENTS > 64) |
| 726 | case 65 ... 128: | ||
| 718 | index = 4; | 727 | index = 4; |
| 719 | break; | 728 | break; |
| 729 | #endif | ||
| 730 | #endif | ||
| 731 | #endif | ||
| 720 | default: | 732 | default: |
| 721 | printk(KERN_ERR "scsi: bad segment count=%d\n", nents); | 733 | printk(KERN_ERR "scsi: bad segment count=%d\n", nents); |
| 722 | BUG(); | 734 | BUG(); |
