[openib-general] [PATCH 00/12] ofed_1_2 - Neighbour update support

Michael S. Tsirkin mst at mellanox.co.il
Thu Feb 1 15:33:18 PST 2007


> Quoting Steve Wise <swise at opengridcomputing.com>:
> Subject: Re: [PATCH 00/12] ofed_1_2 - Neighbour update support
> 
> On Fri, 2007-02-02 at 00:48 +0200, Michael S. Tsirkin wrote:
> > > > I can think of some more complicated approaches that might work better
> > > > for iwarp. Off the top of my head, our netevents implementation could
> > > > keep a reference on the skb, start a timer, check the users counter on skb and
> > > > call the notifier chain when it drops to 1. Let's sleep on it.
> > > > 
> 
> Remembering which skbs to check later requires more complication.  Here
> is one method to handle this and do what you suggest above.
> 
> In the snoop function:
> 
> Clone the skb and save the original skb ptr in the new skb->cb area.
> This area is ours to use on a freshly cloned skbuff.  Add this new skb
> ptr to a linked list of outstanding netevents to be processed later.
> Don't free the original skb passed in.  This keeps the reference on it
> like you proposed above.  Schedule a delayed work handler for a few
> ticks in the future.
> 
> In the delayed work handler:
> 
> Walk the pending netevents skb list.  For each pending skb, get the
> original skb ptr from the cloned skb->cb area, and if the user count is
> now 1 then do the current destructor() logic, remove the skb from the
> pending list, and free both skbs.  If the list is not empty reschedule
> the delayed work handler for a few ticks later.
> 
> In the module unload function:
> 
> cancel any delayed work handling
> walk the pending list and free the skbs and the original snooped skbs.
> 
> This solves the destructor issue and the rmmod issue, but is more
> complicated.  If you're worried about regressing straight rdma address
> translation, then you can call the address translation timer function
> synchronously in the snoop function like before and change the
> addr_trans module to not use netevents...


Yes, this is what I proposed above. It does all sound quite complicated.
Some notes:
	- you don't need an skb just too keep a void*. create your own
	  structure for this.
	- better use a timer than a workqueue - you are calling netevents
	  from atomic context on new kernels anyway.

So maybe destructor with module ref counting is better.
Donnu.

-- 
MST




More information about the general mailing list