645ca708f9
UDP sockets are hashed in a 128 slots hash table. This hash table is protected by *one* rwlock. This rwlock is readlocked each time an incoming UDP message is handled. This rwlock is writelocked each time a socket must be inserted in hash table (bind time), or deleted from this table (close time) This is not scalable on SMP machines : 1) Even in read mode, lock() and unlock() are atomic operations and must dirty a contended cache line, shared by all cpus. 2) A writer might be starved if many readers are 'in flight'. This can happen on a machine with some NIC receiving many UDP messages. User process can be delayed a long time at socket creation/dismantle time. This patch prepares RCU migration, by introducing 'struct udp_table and struct udp_hslot', and using one spinlock per chain, to reduce contention on central rwlock. Introducing one spinlock per chain reduces latencies, for port randomization on heavily loaded UDP servers. This also speedup bindings to specific ports. udp_lib_unhash() was uninlined, becoming to big. Some cleanups were done to ease review of following patch (RCUification of UDP Unicast lookups) Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: David S. Miller <davem@davemloft.net>
34 lines
1.3 KiB
C
34 lines
1.3 KiB
C
#ifndef _UDP4_IMPL_H
|
|
#define _UDP4_IMPL_H
|
|
#include <net/udp.h>
|
|
#include <net/udplite.h>
|
|
#include <net/protocol.h>
|
|
#include <net/inet_common.h>
|
|
|
|
extern int __udp4_lib_rcv(struct sk_buff *, struct udp_table *, int );
|
|
extern void __udp4_lib_err(struct sk_buff *, u32, struct udp_table *);
|
|
|
|
extern int udp_v4_get_port(struct sock *sk, unsigned short snum);
|
|
|
|
extern int udp_setsockopt(struct sock *sk, int level, int optname,
|
|
char __user *optval, int optlen);
|
|
extern int udp_getsockopt(struct sock *sk, int level, int optname,
|
|
char __user *optval, int __user *optlen);
|
|
|
|
#ifdef CONFIG_COMPAT
|
|
extern int compat_udp_setsockopt(struct sock *sk, int level, int optname,
|
|
char __user *optval, int optlen);
|
|
extern int compat_udp_getsockopt(struct sock *sk, int level, int optname,
|
|
char __user *optval, int __user *optlen);
|
|
#endif
|
|
extern int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
size_t len, int noblock, int flags, int *addr_len);
|
|
extern int udp_sendpage(struct sock *sk, struct page *page, int offset,
|
|
size_t size, int flags);
|
|
extern int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb);
|
|
extern void udp_destroy_sock(struct sock *sk);
|
|
|
|
#ifdef CONFIG_PROC_FS
|
|
extern int udp4_seq_show(struct seq_file *seq, void *v);
|
|
#endif
|
|
#endif /* _UDP4_IMPL_H */
|