scsi-target and the buffer cache

Scott Long scottl at samsco.org
Wed Dec 7 20:36:10 PST 2005


Eric Anderson wrote:
> Nate Lawson wrote:
> 
>> Scott Long wrote:
>>
>>> Eric Anderson wrote:
>>>
>>>> Nate Lawson wrote:
>>>>
>>>>> Eric Anderson wrote:
>>>>>
>>>>>> I'm curious about whether a target mode device would use the 
>>>>>> buffer cache or not.  Here's a scenario:
>>>>>>
>>>>>> Host A: has fibre channel host adapter, in target mode, large 
>>>>>> memory pool, and another fiber channel host adapter connecting to 
>>>>>> fibre channel block device.
>>>>>> Host B: Fibre channel host adapter, connecting to Host A.  'sees' 
>>>>>> the target mode block device created by Host A.
>>>>>>
>>>>>> Will Host A use the buffer cache to cache blocks between the real 
>>>>>> block device, and the shared target mode device?
>>>>>> What about if Host A put a filesystem on the block device, created 
>>>>>> a single file the size of the filesystem, and shared that 
>>>>>> filesystem via a target mode device to Host B?
>>>>>> What I'm wanting is a box (FreeBSD?) that can be placed between a 
>>>>>> fibre channel block device (like a RAID array), and a fibre 
>>>>>> channel host using that block device, and act as a block cache for 
>>>>>> that device, using the FreeBSD's memory.  If it had a significant 
>>>>>> amount of memory, this could be very useful.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> If you use the example scsi_target usermode 
>>>>> (usr/share/examples/scsi_target), then the buffer cache will be 
>>>>> used since its reads/writes are from usermode like normal.  If you 
>>>>> don't want that behavior, you can set O_DIRECT in the open() call 
>>>>> of the backing store file.
>>>>>
>>>>> If you chose to modify the kernel side, you'd have to make sure 
>>>>> your accesses were through the VOP layer and then it would be cached.
>>>>>
>>>>> You should check to be sure the target mode performance meets your 
>>>>> expectations also.
>>>>>
>>>>
>>>> I guess I would be using the user mode tool, unless there's another 
>>>> way?  Your comment on performance also makes me a little worried 
>>>> about that now - do you think I would see a large performance hit?
>>>> Thanks!
>>>> Eric
>>>>
>>>>
>>>
>>> The way the target mode stack works in FreeBSD is that the kernel 
>>> provides some of the basic services, but the actual target emulator
>>> is meant to live in userland.  The userland program responds to
>>> events from the kernel via the select interface.  This generally
>>> works pretty well.  However, it does mean that control has to
>>> cross the kernel-userland boundary at least once for every event.
>>>
>>> What I'd suggest doing is prototyping your target emulator in userland
>>> and evaluating the performance there, and then moving it to the kernel
>>> if you _really_ need more performance.
>>
>>
>>
>> Agree 100%.  While having it in usermode means there are boundary 
>> crossings that increase per-transaction latency, the actual bulk data 
>> transfer is via zero-copy IO and you should be able to exceed the data 
>> transfer rates of several 10K RPM drives on decent hardware.
>>
> 
> 
> Ok, great.. Now, will scsi_target work ok with raw devices, or only 
> files?  (although I'm not sure theres all that much difference really).
> 
> Thanks!!
> Eric
> 
> 

You can write your userland code to use whatever files or devices you
want.  Are you talking about the scs_target.c code in
/usr/share/examples?  That's just a skeletal example that you can use
as a starting point for your own work.

Scott

Scott


More information about the freebsd-hackers mailing list