| Domain specific backport for inet_frag_lru_move() |
| This requires two parts, the data structure changes |
| and then domain specific inet_frag_lru_move() define. |
| |
| --- a/net/ieee802154/reassembly.c |
| +++ b/net/ieee802154/reassembly.c |
| @@ -91,6 +91,9 @@ static void lowpan_frag_init(struct inet |
| fq->d_size = arg->d_size; |
| fq->saddr = *arg->src; |
| fq->daddr = *arg->dst; |
| +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) |
| + spin_lock_init(&fq->lru_lock); |
| +#endif |
| } |
| |
| static void lowpan_frag_expire(unsigned long data) |
| --- a/net/ieee802154/reassembly.h |
| +++ b/net/ieee802154/reassembly.h |
| @@ -2,6 +2,7 @@ |
| #define __IEEE802154_6LOWPAN_REASSEMBLY_H__ |
| |
| #include <net/inet_frag.h> |
| +#include <linux/spinlock.h> |
| |
| struct lowpan_create_arg { |
| __be16 tag; |
| @@ -19,8 +20,32 @@ struct lowpan_frag_queue { |
| u16 d_size; |
| struct ieee802154_addr saddr; |
| struct ieee802154_addr daddr; |
| +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) |
| + spinlock_t lru_lock; |
| +#endif |
| }; |
| |
| +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) |
| +/* |
| + * XXX: this is a *domain* specific inet_frag_lru_move backport, |
| + * note the added lowpan_ prefix, this requires a respective patch |
| + * which extends struct lowpan_frag_queue with an lru_lock and |
| + * initializes it. We add this helper here to reduce the backport. |
| + * There is no way to generalize the other changes in the patch. |
| + */ |
| +#define inet_frag_lru_move LINUX_BACKPORT(lowpan_inet_frag_lru_move) |
| +static inline void inet_frag_lru_move(struct inet_frag_queue *q) |
| +{ |
| + struct lowpan_frag_queue *fq; |
| + |
| + fq = container_of(q, struct lowpan_frag_queue, q); |
| + |
| + spin_lock(&fq->lru_lock); |
| + list_move_tail(&q->lru_list, &q->net->lru_list); |
| + spin_unlock(&fq->lru_lock); |
| +} |
| +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) */ |
| + |
| static inline u32 ieee802154_addr_hash(const struct ieee802154_addr *a) |
| { |
| switch (a->mode) { |