From: Luis R. Rodriguez Date: Tue, 1 Apr 2014 22:30:43 +0000 (+0000) Subject: backports: 6lowpan domain specific backport of inet_frag_lru_move() X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=92ed28aa878c47004a238ab67079f61043d56ed3;p=openwrt%2Fstaging%2Fblogic.git backports: 6lowpan domain specific backport of inet_frag_lru_move() We can't generalize a backport of inet_frag_lru_move() as it requires modifying an internal struct netns_frags struct. We work around this by extending the parent struct used within 6lowpan. We have two changes, one data structure change and then a domain specific defines. Other subsystems which require similar work can backport usage through similar techniques. The respective change upstream that put the lock on struct netns_frags is commit 3ef0eb0db4 added by through v3.9. mcgrof@ergon ~/linux-next (git::master)$ git describe --contains 3ef0eb0db4 v3.9-rc1~139^2~232^2 commit 3ef0eb0db4bf92c6d2510fe5c4dc51852746f206 Author: Jesper Dangaard Brouer Date: Mon Jan 28 23:45:51 2013 +0000 net: frag, move LRU list maintenance outside of rwlock Updating the fragmentation queues LRU (Least-Recently-Used) list, required taking the hash writer lock. However, the LRU list isn't tied to the hash at all, so we can use a separate lock for it. Original-idea-by: Florian Westphal Signed-off-by: Jesper Dangaard Brouer Signed-off-by: David S. Miller Cc: Jesper Dangaard Brouer Cc: Alexander Smirnov Cc: Dmitry Eremin-Solenikov Cc: linux-zigbee-devel@lists.sourceforge.net Signed-off-by: Luis R. Rodriguez --- diff --git a/patches/collateral-evolutions/network/0013-lowpan-inet_frag_lru_move.patch b/patches/collateral-evolutions/network/0013-lowpan-inet_frag_lru_move.patch new file mode 100644 index 000000000000..9f1f0c130374 --- /dev/null +++ b/patches/collateral-evolutions/network/0013-lowpan-inet_frag_lru_move.patch @@ -0,0 +1,59 @@ +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 +@@ -81,6 +81,9 @@ void lowpan_frag_init(struct inet_frag_q + 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 + } + EXPORT_SYMBOL(lowpan_frag_init); + +--- a/net/ieee802154/reassembly.h ++++ b/net/ieee802154/reassembly.h +@@ -2,6 +2,7 @@ + #define __IEEE802154_6LOWPAN_REASSEMBLY_H__ + + #include ++#include + + 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->addr_type) {