Re: [RFC 4/8] scsi-ml: scsi_sgtable implementation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jens Axboe wrote:
> On Wed, Jul 18 2007, Boaz Harrosh wrote:
>> FUJITA Tomonori wrote:
>>> From: Mike Christie <michaelc@xxxxxxxxxxx>
>>> Subject: Re: [RFC 4/8] scsi-ml: scsi_sgtable implementation
>>> Date: Thu, 12 Jul 2007 14:09:44 -0500
>>>
>>>> Boaz Harrosh wrote:
>>>>> +/*
>>>>> + * Should fit within a single page.
>>>>> + */
>>>>> +enum { SCSI_MAX_SG_SEGMENTS =
>>>>> +	((PAGE_SIZE - sizeof(struct scsi_sgtable)) /
>>>>> +	sizeof(struct scatterlist)) };
>>>>> +
>>>>> +enum { SG_MEMPOOL_NR =
>>>>> +	(SCSI_MAX_SG_SEGMENTS >= 7) +
>>>>> +	(SCSI_MAX_SG_SEGMENTS >= 15) +
>>>>> +	(SCSI_MAX_SG_SEGMENTS >= 31) +
>>>>> +	(SCSI_MAX_SG_SEGMENTS >= 63) +
>>>>> +	(SCSI_MAX_SG_SEGMENTS >= 127) +
>>>>> +	(SCSI_MAX_SG_SEGMENTS >= 255) +
>>>>> +	(SCSI_MAX_SG_SEGMENTS >= 511)
>>>>> +};
>>>>>  
>>>> What does SCSI_MAX_SG_SEGMENTS end up being on x86 now? On x86_64 or 
>>>> some other arch, we were going over a page when doing 
>>>> SCSI_MAX_PHYS_SEGMENTS of 256 right?
>>> Seems that 170 with x86 and 127 with x86_64.
>>>
>> with scsi_sgtable we get one less than now
>>
>> Arch                      | SCSI_MAX_SG_SEGMENTS =  | sizeof(struct scatterlist)
>> --------------------------|-------------------------|---------------------------
>> x86_64                    | 127                     |32
>> i386 CONFIG_HIGHMEM64G=y  | 204                     |20
>> i386 other                | 255                     |16
>>
>> What's nice about this code is that now finally it is
>> automatically calculated in compile time. Arch people
>> don't have the headache "did I break SCSI-ml?". 
>> For example observe the current bug with i386 
>> CONFIG_HIGHMEM64G=y.
>>
>> The same should be done with BIO's. Than ARCHs with big
>> pages can gain even more.
>>
>>>> What happened to Jens's scatter list chaining and how does this relate 
>>>> to it then?
>>> With Jens' sglist, we can set SCSI_MAX_SG_SEGMENTS to whatever we
>>> want. We can remove the above code.
>>>
>>> We need to push this and Jens' sglist together in one merge window, I
>>> think.
>> No Tomo the above does not go away. What goes away is maybe:
> 
> It does go away, since we can just set it to some safe value and use
> chaining to get us where we want.
In my patches SCSI_MAX_PHYS_SEGMENTS has went away it does not exist
anymore.

The new SCSI_MAX_SG_SEGMENTS (your name by the way) is right there
and is calculated to maximize allocation in one page.
(I guess the right name is SCSI_MAX_PHYS_SEGMENTS_IN_A_PAGE)
which will be needed in both your patches and mine.

> 
>>  	blk_queue_max_hw_segments(q, shost->sg_tablesize);
>> -	blk_queue_max_phys_segments(q, SCSI_MAX_SG_SEGMENTS);
>>  	blk_queue_max_sectors(q, shost->max_sectors);
>>
The reporting above is not needed and can be what ever block layer
considers safe/optimized.

>> I'm working on a convergence patches that will do scsi_sg_pools cleanup
>> which is common to both our patches, than scsi_sgtable, and than 
>> sg-chaining on top of that. I hope it gets accepted. 
>> The sg-chaining is much much simpler over scsi_sgtables.
> 
> Sorry, I don't follow this paragraph at all. What is the scsi_sgtables
> change you are referring to? And how does it make sg chaining so much
> simpler?
> 
> I guess my problem is that I don't know what problem this scsi_sgtables
> you refer to is fixing?
> 

scsi_sgtable is a solution proposed by James Bottomley where all I/O members 
of struct scsi_cmnd and the resid member, which need to be duplicated for 
bidirectional transfers, can be allocated together with the sg-list they are
pointing to. This way when bidi comes, the all structure can be duplicated
with minimal change to code, and with no extra baggage when bidi is not
used.
This was the all motivation for the data accessors and cleanup, swiping through
the entire scsi tree. So when implementation changes drivers do not change with
them. Now meanwhile moving over drivers code we (well Tomo mostly) removed the
old !use_sg code path, and also abstracted the 2 major hot spots of above
usages with scsi_dma_{un,}map, and the scsi_for_each_sg. Actually that one
was changed from the original definition to match you macro.

Since scsi_sgtable is an encapsulation of the actual scatterlist array together
with the sg_count bufflen and pool_index, it gives code a nice clean OO touch,
and makes handling very easy, thats all. It only simplifies things at the scsi-ml
level.

I hope that helps a bit. Thanks
Boaz

-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux