[Cbe-oss-dev] [patch 04/16] powerpc and x86_64: Initial port of	PCIe endpoint device driver for axon
    Arnd Bergmann 
    arnd at arndb.de
       
    Mon Mar 31 17:36:27 EST 2008
    
    
  
On Thursday 27 March 2008, H Brett Bolen wrote:
> I looked at the notifier and determined I could not use it.  The 
> notifier passes the same struct * to all clients,
> and I need something to pass the instance struct back -- when you 
> register for the callback, it takes
> a callback function, and a generic void * pointer.  When you register 
> for a notifier, it takes a callback function.
> It seems like it also sent an int along, and I could have implemented a 
> 'lookup' in the host function to get
> a void * ( or instance ptr), but I thought it was ugly.  I did not see a 
> reason to fix something that already
> works with a hack.
> 
The way it is supposed to work is that you embed a struct notifier_block
in your instance structure, and pass a pointer to that notifier_block
into atomic_notifier_chain_register().
Your notifier function then looks like this:
static struct my_struct {
	void *my_instance;
	struct notifier_block notifier;
};
static int my_notifier_call(struct notifier_block *nb, unsigned long val, void *obj)
{
	struct my_struct *my_data = container_of(nb, struct my_struct, notifier);
	return do_something(my_data);
}
This is a common scheme we use in all sorts of places in linux as a way of
doing object oriented programming in C. Think of the my_struct class being
derived from the notifier_block class.
	Arnd <><
    
    
More information about the cbe-oss-dev
mailing list