Jens Axboe wrote:
> On Thu, Mar 17 2005, Jens Axboe wrote:
>> On Thu, Mar 17 2005, [EMAIL PROTECTED] wrote:
>>> Jens Axboe wrote:
>>>> On Wed, Mar 16 2005, [EMAIL PROTECTED] wrote:
>>>>> Jens Axboe wrote:
>>>>>> On Wed, Mar 16 2005, [EMAIL PROTECTED] wrote:
>>>>>>> Hayes, Stuart wrote:
>>>>>>>> This patch will map the sg buffers to kernel virtual memory
>>>>>>>> space in the functions idescsi_input_buffers() and
>>>>>>>> idescsi_output_buffers(). Without this patch, idescsi passes a
>>>>>>>> null pointer to atapi_input_bytes() and atapi_output_bytes()
>>>>>>>> when sg pages are in high memory (i686 architecture).
>>>>>>>> 
>>>>>>>> I'm attaching as a file, too, as the text will certainly be
>>>>>>>> wrapped. 
>>>>>>>> 
>>>>>>>> (Sorry for the subject rename--I'm trying to use the correct
>>>>>>>> format for patch emails.) 
>>>>>>>> 
>>>>>>>> Thanks
>>>>>>>> Stuart
>>>>>>> 
>>>>>>> And, while there's another high memory/kmap patch question on
>>>>>>> this list... 
>>>>>>> 
>>>>>>> Is there some reason nobody seems interested in this patch
>>>>>>> (except Jens--thanks for the help!)?  I'm kind of new to
>>>>>>> sending in patches, and I'm not sure if I'm just not waiting
>>>>>>> long enough, or if there is a problem with this patch...
>>>>>>> 
>>>>>>> But really, we're getting a null pointer dereference oops when
>>>>>>> using ATAPI tape drives (with ide-scsi) without this patch...
>>>>>> 
>>>>>> Sorry, that did seem to get dropped on the floor. Actually I'm
>>>>>> wondering why you are seeing highmem pages there in the first
>>>>>> place, it would be easier/better just to limit ide-scsi to
>>>>>> non-highmem pages. That would remove the need to add any work
>>>>>> arounds in the driver.
>>>>> 
>>>>> I think we're seeing highmem pages in the sg list because that's
>>>>> where the user memory was when st_write() was called.
>>>>> 
>>>>> The sg list is set up when st_write(), which calls
>>>>> setup_buffering(), which calls st_map_user_pages()... this just
>>>>> sets up the sg pages to point directly to the user memory.  So,
>>>>> by the time ide-scsi comes into the picture, the sg list is
>>>>> already set up to point to high memory pages.
>>>>> 
>>>>> Are you suggesting that ide-scsi should change the dma_mask for
>>>>> the device so that st_map_user_pages() won't let sg pages point
>>>>> to high memory?  Or is there something else I'm missing?
>>>> 
>>>> I think that is a bug, this effectively bypasses whatever
>>>> restrictions the scsi host adapter has said about memory limits.
>>>> It is a problem because the request doesn't come from the block
>>>> layer (which handles all of this). 
>>>> 
>>>> I would much prefer fixing that real issue!
>>> 
>>> By "whatever restrictions the scsi host adapter has said about
>>> memory limits", are you referring to the dma_boundary or the
>>> dma_mask?  I'm don't know any other ways a host adapter can specify
>>> memory limits. 
>>> 
>>> I wasn't complete in my statement above, though--st_map_user_pages()
>>> does prevent the sg list from pointing to pages that are above the
>>> "max_pfn" for the device (it gets max_pfn from
>>> scsi_calculate_bounce_ limit()), and that appears to be working ok.
>>> But, even though max_pfn is 0xfffff (so that the maximum physical
>>> address of any sg page won't be over 4G (0xffffffff)), there are
>>> apparently high memory pages that are below physical address of 4G
>>> (0xffffffff), but are still considered high memory.
>>> 
>>> So the entire first 4G of memory isn't low memory... for example, on
>>> my box, pfn 0xfbc3c, with physical address 0xfbc3c000, has the
>>> PG_highmem bit set in &(page)->flags.  Because of this, when
>>> ide-scsi needs to do PIO, it needs to do a kmap_atomic().
>>> 
>>> Am I completely missing your point?
>> 
>> Ok good, so st isn't broken at least. You are not missing my point,
>> but maybe you don't realize that highmem pages doesn't refer to any
>> specific address in memory - it refers to pages that don't have a
>> virtual mapping, so depending on the kernel config that can be
>> anywhere between ~900MB and 2GB (typicall). ide-scsi should just use
>> blk_max_low_pfn as the bounce limit, that will work all the time.
> 
> IOW, one way to solve this would be to add an shost->bounce_high flag
> and add something ala 
> 
>         if (shost->bounce_high)
>                 return BLK_BOUNCE_HIGH;
> 
> to scsi_calculate_bounce_limit()

Yes, I could easily implement that.  I had been trying to figure out how
to go about implementing what you said--I was looking at making
idescsi_attach change the dma_mask that scsi_calculate_bounce_limit() 
currently looks at, but it wasn't looking very pretty.

Unfortunately, I won't be able to do that fix with a DKMS driver on an
existing kernel... but that's not really relevant to this list.

I'll try this out and send in a patch.

Thanks!
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to