Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a4f8fdb authored by Linus Torvalds's avatar Linus Torvalds
Browse files
parents 2c6e5a83 90f66914
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -75,12 +75,6 @@ enum nf_ip_hook_priorities {
#define SO_ORIGINAL_DST 80

#ifdef __KERNEL__
#ifdef CONFIG_NETFILTER_DEBUG
void nf_debug_ip_local_deliver(struct sk_buff *skb);
void nf_debug_ip_loopback_xmit(struct sk_buff *newskb);
void nf_debug_ip_finish_output2(struct sk_buff *skb);
#endif /*CONFIG_NETFILTER_DEBUG*/

extern int ip_route_me_harder(struct sk_buff **pskb);

/* Call this before modifying an existing IP packet: ensures it is
+1 −2
Original line number Diff line number Diff line
#ifndef _IP_CONNTRACK_CORE_H
#define _IP_CONNTRACK_CORE_H
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4/lockhelp.h>

/* This header is used to share core functionality between the
   standalone connection tracking module, and the compatibility layer's use
@@ -47,6 +46,6 @@ static inline int ip_conntrack_confirm(struct sk_buff **pskb)

extern struct list_head *ip_conntrack_hash;
extern struct list_head ip_conntrack_expect_list;
DECLARE_RWLOCK_EXTERN(ip_conntrack_lock);
extern rwlock_t ip_conntrack_lock;
#endif /* _IP_CONNTRACK_CORE_H */
+1 −2
Original line number Diff line number Diff line
@@ -50,10 +50,9 @@ struct ip_nat_multi_range_compat

#ifdef __KERNEL__
#include <linux/list.h>
#include <linux/netfilter_ipv4/lockhelp.h>

/* Protects NAT hash tables, and NAT-private part of conntracks. */
DECLARE_RWLOCK_EXTERN(ip_nat_lock);
extern rwlock_t ip_nat_lock;

/* The structure embedded in the conntrack structure. */
struct ip_nat_info
+0 −1
Original line number Diff line number Diff line
@@ -2,7 +2,6 @@
#define _LISTHELP_H
#include <linux/config.h>
#include <linux/list.h>
#include <linux/netfilter_ipv4/lockhelp.h>

/* Header to do more comprehensive job than linux/list.h; assume list
   is first entry in structure. */
+0 −129
Original line number Diff line number Diff line
#ifndef _LOCKHELP_H
#define _LOCKHELP_H
#include <linux/config.h>

#include <linux/spinlock.h>
#include <asm/atomic.h>
#include <linux/interrupt.h>
#include <linux/smp.h>

/* Header to do help in lock debugging. */

#ifdef CONFIG_NETFILTER_DEBUG
struct spinlock_debug
{
	spinlock_t l;
	atomic_t locked_by;
};

struct rwlock_debug
{
	rwlock_t l;
	long read_locked_map;
	long write_locked_map;
};

#define DECLARE_LOCK(l) 						\
struct spinlock_debug l = { SPIN_LOCK_UNLOCKED, ATOMIC_INIT(-1) }
#define DECLARE_LOCK_EXTERN(l) 			\
extern struct spinlock_debug l
#define DECLARE_RWLOCK(l)				\
struct rwlock_debug l = { RW_LOCK_UNLOCKED, 0, 0 }
#define DECLARE_RWLOCK_EXTERN(l)		\
extern struct rwlock_debug l

#define MUST_BE_LOCKED(l)						\
do { if (atomic_read(&(l)->locked_by) != smp_processor_id())		\
	printk("ASSERT %s:%u %s unlocked\n", __FILE__, __LINE__, #l);	\
} while(0)

#define MUST_BE_UNLOCKED(l)						\
do { if (atomic_read(&(l)->locked_by) == smp_processor_id())		\
	printk("ASSERT %s:%u %s locked\n", __FILE__, __LINE__, #l);	\
} while(0)

/* Write locked OK as well. */
#define MUST_BE_READ_LOCKED(l)						    \
do { if (!((l)->read_locked_map & (1UL << smp_processor_id()))		    \
	 && !((l)->write_locked_map & (1UL << smp_processor_id())))	    \
	printk("ASSERT %s:%u %s not readlocked\n", __FILE__, __LINE__, #l); \
} while(0)

#define MUST_BE_WRITE_LOCKED(l)						     \
do { if (!((l)->write_locked_map & (1UL << smp_processor_id())))	     \
	printk("ASSERT %s:%u %s not writelocked\n", __FILE__, __LINE__, #l); \
} while(0)

#define MUST_BE_READ_WRITE_UNLOCKED(l)					  \
do { if ((l)->read_locked_map & (1UL << smp_processor_id()))		  \
	printk("ASSERT %s:%u %s readlocked\n", __FILE__, __LINE__, #l);	  \
 else if ((l)->write_locked_map & (1UL << smp_processor_id()))		  \
	 printk("ASSERT %s:%u %s writelocked\n", __FILE__, __LINE__, #l); \
} while(0)

#define LOCK_BH(lk)						\
do {								\
	MUST_BE_UNLOCKED(lk);					\
	spin_lock_bh(&(lk)->l);					\
	atomic_set(&(lk)->locked_by, smp_processor_id());	\
} while(0)

#define UNLOCK_BH(lk)				\
do {						\
	MUST_BE_LOCKED(lk);			\
	atomic_set(&(lk)->locked_by, -1);	\
	spin_unlock_bh(&(lk)->l);		\
} while(0)

#define READ_LOCK(lk) 						\
do {								\
	MUST_BE_READ_WRITE_UNLOCKED(lk);			\
	read_lock_bh(&(lk)->l);					\
	set_bit(smp_processor_id(), &(lk)->read_locked_map);	\
} while(0)

#define WRITE_LOCK(lk)							  \
do {									  \
	MUST_BE_READ_WRITE_UNLOCKED(lk);				  \
	write_lock_bh(&(lk)->l);					  \
	set_bit(smp_processor_id(), &(lk)->write_locked_map);		  \
} while(0)

#define READ_UNLOCK(lk)							\
do {									\
	if (!((lk)->read_locked_map & (1UL << smp_processor_id())))	\
		printk("ASSERT: %s:%u %s not readlocked\n", 		\
		       __FILE__, __LINE__, #lk);			\
	clear_bit(smp_processor_id(), &(lk)->read_locked_map);		\
	read_unlock_bh(&(lk)->l);					\
} while(0)

#define WRITE_UNLOCK(lk)					\
do {								\
	MUST_BE_WRITE_LOCKED(lk);				\
	clear_bit(smp_processor_id(), &(lk)->write_locked_map);	\
	write_unlock_bh(&(lk)->l);				\
} while(0)

#else
#define DECLARE_LOCK(l) spinlock_t l = SPIN_LOCK_UNLOCKED
#define DECLARE_LOCK_EXTERN(l) extern spinlock_t l
#define DECLARE_RWLOCK(l) rwlock_t l = RW_LOCK_UNLOCKED
#define DECLARE_RWLOCK_EXTERN(l) extern rwlock_t l

#define MUST_BE_LOCKED(l)
#define MUST_BE_UNLOCKED(l)
#define MUST_BE_READ_LOCKED(l)
#define MUST_BE_WRITE_LOCKED(l)
#define MUST_BE_READ_WRITE_UNLOCKED(l)

#define LOCK_BH(l) spin_lock_bh(l)
#define UNLOCK_BH(l) spin_unlock_bh(l)

#define READ_LOCK(l) read_lock_bh(l)
#define WRITE_LOCK(l) write_lock_bh(l)
#define READ_UNLOCK(l) read_unlock_bh(l)
#define WRITE_UNLOCK(l) write_unlock_bh(l)
#endif /*CONFIG_NETFILTER_DEBUG*/

#endif /* _LOCKHELP_H */
Loading