blob: 6692c0cf8c353aa2080c9730ce0924b9d9d08c25 [file] [log] [blame]
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) {