Subject: Re: [PATCH][RFC 23/23]: Support for zero-copy TCP transmit of user space data

From: Vladislav Bolkhovitin <[email-masked]>
Date: Wed, 24 Dec 2008 17:37:51 +0300

Evgeniy Polyakov, on 12/24/2008 12:38 AM wrote:
> On Tue, Dec 23, 2008 at 10:16:25PM +0300, Vladislav Bolkhovitin ([email-masked]) wrote:
>> Actually, there's another way, which seems to be a lot simpler. Alexey 
>> Kuznetsov privately suggested it to me.
>>
>> In skb_shared_info new pointer transaction_token would be added, which 
>> would point on:
>>
>> struct sk_transaction_token
>> {
>> 	atomic_t			io_count;
>> 	struct sk_transaction_token	*next;
>> 	unsigned long			token;
>> 	unsigned long			private;
>> 	void				(*finish_callback)(struct 
>> 	sk_transaction_token *);
>> };
>>
>> When skb is translated, transaction_token inherited. If 2 skb are merged 
>> (the same places where I put net_get_page's in my patch), the *older* 
>> token is inherited. This is the main point of this idea.
>>
>> Before starting new asynchronous send a client would open a new token. 
>> Everything sent then would receive that token. Finish_callback() would 
>> be called and the corresponding token freed, when io_count == 0 *AND* 
>> all previous tokens closed.
>>
>> This idea seems to be simpler, than even what Rusty implemented. Correct 
>> me, if I wrong. But, unfortunately, in the near future I will have no 
>> time to develop it.. :-(
> 
> Yes, it is simpler and cleaner, but it requires additional allocation.
> This is additional (and quite noticeble) overhead.

Not necessary requires. For instance, in iscsi-scst sk_transaction_token 
can (and should) be part of iSCSI cmd structure, so no additional 
allocations would be needed.

Thanks,
Vlad