[openib-general] [PATCH RFC 05/10] ofed_1_2 Backport cxgb3 to 2.6.15

Steve Wise swise at opengridcomputing.com
Thu Jan 18 08:54:52 PST 2007


Micheal/Vlad, 

This is not one of the kernels that has a set of backport files in
kernel_addons.  So its pulling in the kernel.org 2.6.15 backport files.
Apparently Ubuntu has back-ported some stuff into their 2.6.15-23-server
kernel.

How shall we proceed?  This isn't one of the ofed-1.2 supported distros
or kernels, yet you're building against it.  

I'm willing to create a new directory
kernel_addons/backport/2.6.15_Ubuntu for this and do the backport if it
is the correct thing to do.  


Steve.



On Thu, 2007-01-18 at 18:38 +0200, Vladimir Sokolovsky wrote:
> This patch breaks compilation on openfabrics server (Ubuntu: 2.6.15-23-server)
> 
>   gcc -m32 -Wp,-MD,/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/core/.addr.o.d  -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.0.3/include -D__KERNEL__ \
> -I/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/kernel_addons/backport/2.6.15/include/ \
> -I/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/include \
> -I/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/include \
> -Iinclude \
>  \
> -include include/linux/autoconf.h \
> -include /home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/include/linux/autoconf.h \
>  -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2     -fomit-frame-pointer -pipe -msoft-float -mpreferred-stack-boundary=2 -fno-unit-at-a-time -march=i686 -Iinclude/asm-i386/mach-default -Wdeclaration-after-statement -Wno-pointer-sign   -I/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/include -I/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/include     -I/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/ulp/ipoib        -I/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/debug    -I/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/hw/cxgb3/core    -I/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/net/cxgb3   -DMODULE -DKBUILD_BASENAME=addr -DKBUILD_MODNAME=ib_addr -c -o /home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/core/.tmp_addr.o /home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/core/addr.
 c
> In file included from include/linux/inetdevice.h:7,
>                  from /home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/kernel_addons/backport/2.6.15/include/linux/inetdevice.h:4,
>                  from /home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/core/addr.c:32:
> /home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/kernel_addons/backport/2.6.15/include/linux/netdevice.h:19: error: redefinition of '__netif_rx_schedule_prep'
> include/linux/netdevice.h:807: error: previous definition of '__netif_rx_schedule_prep' was here
> /home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/core/addr.c:61: warning: initialization from incompatible pointer type
> make[3]: *** [/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/core/addr.o] Error 1
> make[2]: *** [/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband/core] Error 2
> make[1]: *** [_module_/home/vlad/tmp/ofa_1_2_kernel-20070118-0829_check/drivers/infiniband] Error 2
> make[1]: Leaving directory `/usr/src/linux-headers-2.6.15-23-server'
> make: *** [kernel] Error 2
> 
> Regards,
> Vladimir
> 
> 
> On Wed, 2007-01-17 at 13:50 -0600, Steve Wise wrote:
> > Backport cxgb3 to 2.6.15
> > 
> > Signed-off-by: Steve Wise <swise at opengridcomputing.com>
> > ---
> > 
> >  .../backport/2.6.15/include/linux/genalloc.h       |   42 +++++
> >  .../backport/2.6.15/include/linux/interrupt.h      |   17 ++
> >  .../backport/2.6.15/include/linux/netdevice.h      |    9 +
> >  .../backport/2.6.15/include/linux/random.h         |   15 ++
> >  .../backport/2.6.15/include/linux/skbuff.h         |    3 
> >  .../backport/2.6.15/include/linux/types.h          |    6 +
> >  .../backport/2.6.15/include/linux/workqueue.h      |    9 +
> >  .../backport/2.6.15/include/net/netevent.h         |   33 ++++
> >  .../backport/2.6.15/include/src/genalloc.c         |  198 +++++++++++++++++++++++
> >  .../backport/2.6.15/include/src/netevent.c         |   71 ++++++++
> >  .../backport/2.6.15/cxgb3_makefile_to_2_6_19.patch |   12 +
> >  .../backport/2.6.15/linux_stuff_to_2_6_17.patch    |   24 +++
> >  12 files changed, 438 insertions(+), 1 deletions(-)
> > 
> > diff --git a/kernel_addons/backport/2.6.15/include/linux/genalloc.h b/kernel_addons/backport/2.6.15/include/linux/genalloc.h
> > new file mode 100644
> > index 0000000..3c23c68
> > --- /dev/null
> > +++ b/kernel_addons/backport/2.6.15/include/linux/genalloc.h
> > @@ -0,0 +1,42 @@
> > +/*
> > + * Basic general purpose allocator for managing special purpose memory
> > + * not managed by the regular kmalloc/kfree interface.
> > + * Uses for this includes on-device special memory, uncached memory
> > + * etc.
> > + *
> > + * This source code is licensed under the GNU General Public License,
> > + * Version 2.  See the file COPYING for more details.
> > + */
> > +
> > +
> > +/*
> > + *  General purpose special memory pool descriptor.
> > + */
> > +struct gen_pool {
> > +	rwlock_t lock;
> > +	struct list_head chunks;	/* list of chunks in this pool */
> > +	int min_alloc_order;		/* minimum allocation order */
> > +};
> > +
> > +/*
> > + *  General purpose special memory pool chunk descriptor.
> > + */
> > +struct gen_pool_chunk {
> > +	spinlock_t lock;
> > +	struct list_head next_chunk;	/* next chunk in pool */
> > +	unsigned long start_addr;	/* starting address of memory chunk */
> > +	unsigned long end_addr;		/* ending address of memory chunk */
> > +	unsigned long bits[0];		/* bitmap for allocating memory chunk */
> > +};
> > +
> > +extern struct gen_pool *ib_gen_pool_create(int, int);
> > +extern int ib_gen_pool_add(struct gen_pool *, unsigned long, size_t, int);
> > +extern void ib_gen_pool_destroy(struct gen_pool *);
> > +extern unsigned long ib_gen_pool_alloc(struct gen_pool *, size_t);
> > +extern void ib_gen_pool_free(struct gen_pool *, unsigned long, size_t);
> > +
> > +#define gen_pool_create ib_gen_pool_create
> > +#define gen_pool_add ib_gen_pool_add
> > +#define gen_pool_destroy ib_gen_pool_destroy
> > +#define gen_pool_alloc ib_gen_pool_alloc
> > +#define gen_pool_free ib_gen_pool_free
> > diff --git a/kernel_addons/backport/2.6.15/include/linux/interrupt.h b/kernel_addons/backport/2.6.15/include/linux/interrupt.h
> > new file mode 100644
> > index 0000000..66e66a9
> > --- /dev/null
> > +++ b/kernel_addons/backport/2.6.15/include/linux/interrupt.h
> > @@ -0,0 +1,17 @@
> > +#ifndef BACKPORT_LINUX_INTERRUPT_TO_2_6_18
> > +#define BACKPORT_LINUX_INTERRUPT_TO_2_6_18
> > +#include_next <linux/interrupt.h>
> > +
> > +static inline int 
> > +backport_request_irq(unsigned int irq,
> > +                     irqreturn_t (*handler)(int, void *),
> > +                     unsigned long flags, const char *dev_name, void *dev_id)
> > +{
> > +	return request_irq(irq, 
> > +		           (irqreturn_t (*)(int, void *, struct pt_regs *))handler, 
> > +			   flags, dev_name, dev_id);
> > +}
> > +
> > +#define request_irq backport_request_irq
> > +
> > +#endif
> > diff --git a/kernel_addons/backport/2.6.15/include/linux/netdevice.h b/kernel_addons/backport/2.6.15/include/linux/netdevice.h
> > index 5641019..2f12781 100644
> > --- a/kernel_addons/backport/2.6.15/include/linux/netdevice.h
> > +++ b/kernel_addons/backport/2.6.15/include/linux/netdevice.h
> > @@ -15,4 +15,13 @@ static inline void netif_tx_unlock(struc
> >  	spin_unlock(&dev->xmit_lock);
> >  }
> >  
> > +static inline int __netif_rx_schedule_prep(struct net_device *dev)
> > +{
> > +        return !test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state);
> > +}
> > +
> > +#undef SET_ETHTOOL_OPS
> > +#define SET_ETHTOOL_OPS(netdev, ops) \
> > +	(netdev)->ethtool_ops = (struct ethtool_ops *)(ops)
> > +
> >  #endif
> > diff --git a/kernel_addons/backport/2.6.15/include/linux/random.h b/kernel_addons/backport/2.6.15/include/linux/random.h
> > new file mode 100644
> > index 0000000..2ea2e1f
> > --- /dev/null
> > +++ b/kernel_addons/backport/2.6.15/include/linux/random.h
> > @@ -0,0 +1,15 @@
> > +#ifndef BACKPORT_LINUX_RANDOM_TO_2_6_18
> > +#define BACKPORT_LINUX_RANDOM_TO_2_6_18
> > +#include_next <linux/random.h>
> > +
> > +static inline u32 backport_random32(void)
> > +{
> > +	u32 v;
> > +
> > +	get_random_bytes(&v, sizeof(u32));
> > +	return v;
> > +}
> > +
> > +#define random32 backport_random32
> > +
> > +#endif
> > diff --git a/kernel_addons/backport/2.6.15/include/linux/skbuff.h b/kernel_addons/backport/2.6.15/include/linux/skbuff.h
> > index 4845283..70bf011 100644
> > --- a/kernel_addons/backport/2.6.15/include/linux/skbuff.h
> > +++ b/kernel_addons/backport/2.6.15/include/linux/skbuff.h
> > @@ -4,5 +4,8 @@ #define LINUX_SKBUFF_H_BACKPORT
> >  #include_next <linux/skbuff.h>
> >  
> >  #define CHECKSUM_PARTIAL CHECKSUM_HW 
> > +#define CHECKSUM_COMPLETE CHECKSUM_HW 
> > +
> > +#define gso_size tso_size
> >  
> >  #endif
> > diff --git a/kernel_addons/backport/2.6.15/include/linux/types.h b/kernel_addons/backport/2.6.15/include/linux/types.h
> > new file mode 100644
> > index 0000000..86e334f
> > --- /dev/null
> > +++ b/kernel_addons/backport/2.6.15/include/linux/types.h
> > @@ -0,0 +1,6 @@
> > +#ifndef BACKPORT_LINUX_TYPES_TO_2_6_15
> > +#define BACKPORT_LINUX_TYPES_TO_2_6_15
> > +#include_next <linux/types.h>
> > +
> > +#define BITS_PER_BYTE 8
> > +#endif
> > diff --git a/kernel_addons/backport/2.6.15/include/linux/workqueue.h b/kernel_addons/backport/2.6.15/include/linux/workqueue.h
> > index 330f47f..cc8b2cd 100644
> > --- a/kernel_addons/backport/2.6.15/include/linux/workqueue.h
> > +++ b/kernel_addons/backport/2.6.15/include/linux/workqueue.h
> > @@ -26,6 +26,12 @@ backport_cancel_delayed_work(struct dela
> >  	return cancel_delayed_work(&work->work);
> >  }
> >  
> > +static inline void 
> > +backport_cancel_rearming_delayed_workqueue(struct workqueue_struct *wq, struct delayed_work *work)
> > +{
> > +	cancel_rearming_delayed_workqueue(wq, &work->work);
> > +}
> > +
> >  
> >  #undef INIT_WORK
> >  #define INIT_WORK(_work, _func) backport_INIT_WORK(_work, _func)
> > @@ -33,11 +39,12 @@ #define INIT_DELAYED_WORK(_work, _func) 
> >  
> >  #undef DECLARE_WORK
> >  #define DECLARE_WORK(n, f) \
> > -	struct work_struct n = __WORK_INITIALIZER(n, f, &(n))
> > +	struct work_struct n = __WORK_INITIALIZER(n, (void (*)(void *))f, &(n))
> >  #define DECLARE_DELAYED_WORK(n, f) \
> >  	struct delayed_work n = { .work = __WORK_INITIALIZER(n.work, f, &(n.work)) }
> >  
> >  #define queue_delayed_work backport_queue_delayed_work
> >  #define cancel_delayed_work backport_cancel_delayed_work
> > +#define cancel_rearming_delayed_workqueue backport_cancel_rearming_delayed_workqueue
> >  
> >  #endif
> > diff --git a/kernel_addons/backport/2.6.15/include/net/netevent.h b/kernel_addons/backport/2.6.15/include/net/netevent.h
> > new file mode 100644
> > index 0000000..e5d2162
> > --- /dev/null
> > +++ b/kernel_addons/backport/2.6.15/include/net/netevent.h
> > @@ -0,0 +1,33 @@
> > +#ifndef _NET_EVENT_H
> > +#define _NET_EVENT_H
> > +
> > +/*
> > + *	Generic netevent notifiers
> > + *
> > + *	Authors:
> > + *      Tom Tucker              <tom at opengridcomputing.com>
> > + *      Steve Wise              <swise at opengridcomputing.com>
> > + *
> > + * 	Changes:
> > + */
> > +#ifdef __KERNEL__
> > +
> > +#include <net/dst.h>
> > +
> > +struct netevent_redirect {
> > +	struct dst_entry *old;
> > +	struct dst_entry *new;
> > +};
> > +
> > +enum netevent_notif_type {
> > +	NETEVENT_NEIGH_UPDATE = 1, /* arg is struct neighbour ptr */
> > +	NETEVENT_PMTU_UPDATE,	   /* arg is struct dst_entry ptr */
> > +	NETEVENT_REDIRECT,	   /* arg is struct netevent_redirect ptr */
> > +};
> > +
> > +extern int register_netevent_notifier(struct notifier_block *nb);
> > +extern int unregister_netevent_notifier(struct notifier_block *nb);
> > +extern int call_netevent_notifiers(unsigned long val, void *v);
> > +
> > +#endif
> > +#endif
> > diff --git a/kernel_addons/backport/2.6.15/include/src/genalloc.c b/kernel_addons/backport/2.6.15/include/src/genalloc.c
> > new file mode 100644
> > index 0000000..75ae68c
> > --- /dev/null
> > +++ b/kernel_addons/backport/2.6.15/include/src/genalloc.c
> > @@ -0,0 +1,198 @@
> > +/*
> > + * Basic general purpose allocator for managing special purpose memory
> > + * not managed by the regular kmalloc/kfree interface.
> > + * Uses for this includes on-device special memory, uncached memory
> > + * etc.
> > + *
> > + * Copyright 2005 (C) Jes Sorensen <jes at trained-monkey.org>
> > + *
> > + * This source code is licensed under the GNU General Public License,
> > + * Version 2.  See the file COPYING for more details.
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/genalloc.h>
> > +
> > +
> > +/**
> > + * gen_pool_create - create a new special memory pool
> > + * @min_alloc_order: log base 2 of number of bytes each bitmap bit represents
> > + * @nid: node id of the node the pool structure should be allocated on, or -1
> > + *
> > + * Create a new special memory pool that can be used to manage special purpose
> > + * memory not managed by the regular kmalloc/kfree interface.
> > + */
> > +struct gen_pool *gen_pool_create(int min_alloc_order, int nid)
> > +{
> > +	struct gen_pool *pool;
> > +
> > +	pool = kmalloc_node(sizeof(struct gen_pool), GFP_KERNEL, nid);
> > +	if (pool != NULL) {
> > +		rwlock_init(&pool->lock);
> > +		INIT_LIST_HEAD(&pool->chunks);
> > +		pool->min_alloc_order = min_alloc_order;
> > +	}
> > +	return pool;
> > +}
> > +EXPORT_SYMBOL(gen_pool_create);
> > +
> > +/**
> > + * gen_pool_add - add a new chunk of special memory to the pool
> > + * @pool: pool to add new memory chunk to
> > + * @addr: starting address of memory chunk to add to pool
> > + * @size: size in bytes of the memory chunk to add to pool
> > + * @nid: node id of the node the chunk structure and bitmap should be
> > + *       allocated on, or -1
> > + *
> > + * Add a new chunk of special memory to the specified pool.
> > + */
> > +int gen_pool_add(struct gen_pool *pool, unsigned long addr, size_t size,
> > +		 int nid)
> > +{
> > +	struct gen_pool_chunk *chunk;
> > +	int nbits = size >> pool->min_alloc_order;
> > +	int nbytes = sizeof(struct gen_pool_chunk) +
> > +				(nbits + BITS_PER_BYTE - 1) / BITS_PER_BYTE;
> > +
> > +	chunk = kmalloc_node(nbytes, GFP_KERNEL, nid);
> > +	if (unlikely(chunk == NULL))
> > +		return -1;
> > +
> > +	memset(chunk, 0, nbytes);
> > +	spin_lock_init(&chunk->lock);
> > +	chunk->start_addr = addr;
> > +	chunk->end_addr = addr + size;
> > +
> > +	write_lock(&pool->lock);
> > +	list_add(&chunk->next_chunk, &pool->chunks);
> > +	write_unlock(&pool->lock);
> > +
> > +	return 0;
> > +}
> > +EXPORT_SYMBOL(gen_pool_add);
> > +
> > +/**
> > + * gen_pool_destroy - destroy a special memory pool
> > + * @pool: pool to destroy
> > + *
> > + * Destroy the specified special memory pool. Verifies that there are no
> > + * outstanding allocations.
> > + */
> > +void gen_pool_destroy(struct gen_pool *pool)
> > +{
> > +	struct list_head *_chunk, *_next_chunk;
> > +	struct gen_pool_chunk *chunk;
> > +	int order = pool->min_alloc_order;
> > +	int bit, end_bit;
> > +
> > +
> > +	write_lock(&pool->lock);
> > +	list_for_each_safe(_chunk, _next_chunk, &pool->chunks) {
> > +		chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk);
> > +		list_del(&chunk->next_chunk);
> > +
> > +		end_bit = (chunk->end_addr - chunk->start_addr) >> order;
> > +		bit = find_next_bit(chunk->bits, end_bit, 0);
> > +		BUG_ON(bit < end_bit);
> > +
> > +		kfree(chunk);
> > +	}
> > +	kfree(pool);
> > +	return;
> > +}
> > +EXPORT_SYMBOL(gen_pool_destroy);
> > +
> > +/**
> > + * gen_pool_alloc - allocate special memory from the pool
> > + * @pool: pool to allocate from
> > + * @size: number of bytes to allocate from the pool
> > + *
> > + * Allocate the requested number of bytes from the specified pool.
> > + * Uses a first-fit algorithm.
> > + */
> > +unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size)
> > +{
> > +	struct list_head *_chunk;
> > +	struct gen_pool_chunk *chunk;
> > +	unsigned long addr, flags;
> > +	int order = pool->min_alloc_order;
> > +	int nbits, bit, start_bit, end_bit;
> > +
> > +	if (size == 0)
> > +		return 0;
> > +
> > +	nbits = (size + (1UL << order) - 1) >> order;
> > +
> > +	read_lock(&pool->lock);
> > +	list_for_each(_chunk, &pool->chunks) {
> > +		chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk);
> > +
> > +		end_bit = (chunk->end_addr - chunk->start_addr) >> order;
> > +		end_bit -= nbits + 1;
> > +
> > +		spin_lock_irqsave(&chunk->lock, flags);
> > +		bit = -1;
> > +		while (bit + 1 < end_bit) {
> > +			bit = find_next_zero_bit(chunk->bits, end_bit, bit + 1);
> > +			if (bit >= end_bit)
> > +				break;
> > +
> > +			start_bit = bit;
> > +			if (nbits > 1) {
> > +				bit = find_next_bit(chunk->bits, bit + nbits,
> > +							bit + 1);
> > +				if (bit - start_bit < nbits)
> > +					continue;
> > +			}
> > +
> > +			addr = chunk->start_addr +
> > +					    ((unsigned long)start_bit << order);
> > +			while (nbits--)
> > +				__set_bit(start_bit++, &chunk->bits);
> > +			spin_unlock_irqrestore(&chunk->lock, flags);
> > +			read_unlock(&pool->lock);
> > +			return addr;
> > +		}
> > +		spin_unlock_irqrestore(&chunk->lock, flags);
> > +	}
> > +	read_unlock(&pool->lock);
> > +	return 0;
> > +}
> > +EXPORT_SYMBOL(gen_pool_alloc);
> > +
> > +/**
> > + * gen_pool_free - free allocated special memory back to the pool
> > + * @pool: pool to free to
> > + * @addr: starting address of memory to free back to pool
> > + * @size: size in bytes of memory to free
> > + *
> > + * Free previously allocated special memory back to the specified pool.
> > + */
> > +void gen_pool_free(struct gen_pool *pool, unsigned long addr, size_t size)
> > +{
> > +	struct list_head *_chunk;
> > +	struct gen_pool_chunk *chunk;
> > +	unsigned long flags;
> > +	int order = pool->min_alloc_order;
> > +	int bit, nbits;
> > +
> > +	nbits = (size + (1UL << order) - 1) >> order;
> > +
> > +	read_lock(&pool->lock);
> > +	list_for_each(_chunk, &pool->chunks) {
> > +		chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk);
> > +
> > +		if (addr >= chunk->start_addr && addr < chunk->end_addr) {
> > +			BUG_ON(addr + size > chunk->end_addr);
> > +			spin_lock_irqsave(&chunk->lock, flags);
> > +			bit = (addr - chunk->start_addr) >> order;
> > +			while (nbits--)
> > +				__clear_bit(bit++, &chunk->bits);
> > +			spin_unlock_irqrestore(&chunk->lock, flags);
> > +			break;
> > +		}
> > +	}
> > +	BUG_ON(nbits > 0);
> > +	read_unlock(&pool->lock);
> > +}
> > +EXPORT_SYMBOL(gen_pool_free);
> > diff --git a/kernel_addons/backport/2.6.15/include/src/netevent.c b/kernel_addons/backport/2.6.15/include/src/netevent.c
> > new file mode 100644
> > index 0000000..5ffadd1
> > --- /dev/null
> > +++ b/kernel_addons/backport/2.6.15/include/src/netevent.c
> > @@ -0,0 +1,71 @@
> > +/*
> > + *	Network event notifiers
> > + *
> > + *	Authors:
> > + *      Tom Tucker             <tom at opengridcomputing.com>
> > + *      Steve Wise             <swise at opengridcomputing.com>
> > + *
> > + *	This program is free software; you can redistribute it and/or
> > + *      modify it under the terms of the GNU General Public License
> > + *      as published by the Free Software Foundation; either version
> > + *      2 of the License, or (at your option) any later version.
> > + *
> > + *	Fixes:
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/skbuff.h>
> > +#include <linux/rtnetlink.h>
> > +#include <linux/notifier.h>
> > +
> > +static struct notifier_block *netevent_notif_chain;
> > +
> > +/**
> > + *	register_netevent_notifier - register a netevent notifier block
> > + *	@nb: notifier
> > + *
> > + *	Register a notifier to be called when a netevent occurs.
> > + *	The notifier passed is linked into the kernel structures and must
> > + *	not be reused until it has been unregistered. A negative errno code
> > + *	is returned on a failure.
> > + */
> > +int register_netevent_notifier(struct notifier_block *nb)
> > +{
> > +	int err;
> > +
> > +	err = notifier_chain_register(&netevent_notif_chain, nb);
> > +	return err;
> > +}
> > +
> > +/**
> > + *	netevent_unregister_notifier - unregister a netevent notifier block
> > + *	@nb: notifier
> > + *
> > + *	Unregister a notifier previously registered by
> > + *	register_neigh_notifier(). The notifier is unlinked into the
> > + *	kernel structures and may then be reused. A negative errno code
> > + *	is returned on a failure.
> > + */
> > +
> > +int unregister_netevent_notifier(struct notifier_block *nb)
> > +{
> > +	return notifier_chain_unregister(&netevent_notif_chain, nb);
> > +}
> > +
> > +/**
> > + *	call_netevent_notifiers - call all netevent notifier blocks
> > + *      @val: value passed unmodified to notifier function
> > + *      @v:   pointer passed unmodified to notifier function
> > + *
> > + *	Call all neighbour notifier blocks.  Parameters and return value
> > + *	are as for notifier_call_chain().
> > + */
> > +
> > +int call_netevent_notifiers(unsigned long val, void *v)
> > +{
> > +	return notifier_call_chain(&netevent_notif_chain, val, v);
> > +}
> > +
> > +EXPORT_SYMBOL_GPL(register_netevent_notifier);
> > +EXPORT_SYMBOL_GPL(unregister_netevent_notifier);
> > +EXPORT_SYMBOL_GPL(call_netevent_notifiers);
> > diff --git a/kernel_patches/backport/2.6.15/cxgb3_makefile_to_2_6_19.patch b/kernel_patches/backport/2.6.15/cxgb3_makefile_to_2_6_19.patch
> > new file mode 100644
> > index 0000000..ad7e7f4
> > --- /dev/null
> > +++ b/kernel_patches/backport/2.6.15/cxgb3_makefile_to_2_6_19.patch
> > @@ -0,0 +1,12 @@
> > +diff --git a/drivers/net/cxgb3/Makefile b/drivers/net/cxgb3/Makefile
> > +index 3434679..bb008b6 100755
> > +--- a/drivers/net/cxgb3/Makefile
> > ++++ b/drivers/net/cxgb3/Makefile
> > +@@ -1,6 +1,7 @@
> > + #
> > + # Chelsio T3 driver
> > + #
> > ++NOSTDINC_FLAGS:= $(NOSTDINC_FLAGS) $(LINUXINCLUDE)
> > + 
> > + obj-$(CONFIG_CHELSIO_T3) += cxgb3.o
> > + 
> > diff --git a/kernel_patches/backport/2.6.15/linux_stuff_to_2_6_17.patch b/kernel_patches/backport/2.6.15/linux_stuff_to_2_6_17.patch
> > new file mode 100644
> > index 0000000..eb2285f
> > --- /dev/null
> > +++ b/kernel_patches/backport/2.6.15/linux_stuff_to_2_6_17.patch
> > @@ -0,0 +1,24 @@
> > +diff --git a/drivers/infiniband/core/genalloc.c b/drivers/infiniband/core/genalloc.c
> > +new file mode 100644
> > +index 0000000..58cf933
> > +--- /dev/null
> > ++++ b/drivers/infiniband/core/genalloc.c
> > +@@ -0,0 +1 @@
> > ++#include "src/genalloc.c"
> > +diff --git a/drivers/infiniband/core/netevent.c b/drivers/infiniband/core/netevent.c
> > +new file mode 100644
> > +index 0000000..58cf933
> > +--- /dev/null
> > ++++ b/drivers/infiniband/core/netevent.c
> > +@@ -0,0 +1 @@
> > ++#include "src/netevent.c"
> > +diff --git a/drivers/infiniband/core/Makefile b/drivers/infiniband/core/Makefile
> > +index 50fb1cd..456bfd0 100644
> > +--- a/drivers/infiniband/core/Makefile
> > ++++ b/drivers/infiniband/core/Makefile
> > +@@ -30,3 +30,5 @@ ib_ucm-y :=			ucm.o
> > + 
> > + ib_uverbs-y :=			uverbs_main.o uverbs_cmd.o uverbs_mem.o \
> > + 				uverbs_marshall.o
> > ++
> > ++ib_core-y +=			genalloc.o netevent.o
> > 
> > _______________________________________________
> > openib-general mailing list
> > openib-general at openib.org
> > http://openib.org/mailman/listinfo/openib-general
> > 
> > To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general





More information about the general mailing list