diff options
| author | David S. Miller <davem@nuts.davemloft.net> | 2004-06-23 04:19:39 -0700 |
|---|---|---|
| committer | David S. Miller <davem@nuts.davemloft.net> | 2004-06-23 04:19:39 -0700 |
| commit | d4c6fff704fbd8924a109f9a21f595a9c021767d (patch) | |
| tree | 14ec754ff8d2b9e0bb92c4cb288d86413deeb6a5 /include/net | |
| parent | bc61f4fff58f6625342d16f2cda84dbfe95613e8 (diff) | |
| parent | 334cdf6749f53fc100e9d981a19cc95c05540895 (diff) | |
Merge nuts.davemloft.net:/disk1/BK/acme-2.6
into nuts.davemloft.net:/disk1/BK/net-2.6
Diffstat (limited to 'include/net')
| -rw-r--r-- | include/net/sock.h | 34 | ||||
| -rw-r--r-- | include/net/tcp.h | 32 |
2 files changed, 37 insertions, 29 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index fe293dc84da9..23f72934b180 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -491,10 +491,11 @@ extern int sk_stream_wait_connect(struct sock *sk, long *timeo_p); extern int sk_stream_wait_memory(struct sock *sk, long *timeo_p); extern void sk_stream_wait_close(struct sock *sk, long timeo_p); extern int sk_stream_error(struct sock *sk, int flags, int err); +extern void sk_stream_kill_queues(struct sock *sk); extern int sk_wait_data(struct sock *sk, long *timeo); -/* IP protocol blocks we attach to sockets. +/* Networking protocol blocks we attach to sockets. * socket layer -> transport layer interface * transport -> network interface is defined by struct inet_proto */ @@ -538,6 +539,21 @@ struct proto { void (*unhash)(struct sock *sk); int (*get_port)(struct sock *sk, unsigned short snum); + /* Memory pressure */ + void (*enter_memory_pressure)(void); + atomic_t memory_allocated; /* Current allocated memory. */ + atomic_t sockets_allocated; /* Current number of sockets. */ + /* + * Pressure flag: try to collapse. + * Technical note: it is used by multiple contexts non atomically. + * All the sk_stream_mem_schedule() is of this nature: accounting + * is strict, actions are advisory and have some latency. + */ + int memory_pressure; + int sysctl_mem[3]; + int sysctl_wmem[3]; + int sysctl_rmem[3]; + char name[32]; struct { @@ -628,6 +644,22 @@ static inline struct inode *SOCK_INODE(struct socket *socket) return &container_of(socket, struct socket_alloc, socket)->vfs_inode; } +extern void __sk_stream_mem_reclaim(struct sock *sk); +extern int sk_stream_mem_schedule(struct sock *sk, int size, int kind); + +#define SK_STREAM_MEM_QUANTUM ((int)PAGE_SIZE) + +static inline int sk_stream_pages(int amt) +{ + return (amt + SK_STREAM_MEM_QUANTUM - 1) / SK_STREAM_MEM_QUANTUM; +} + +static inline void sk_stream_mem_reclaim(struct sock *sk) +{ + if (sk->sk_forward_alloc >= SK_STREAM_MEM_QUANTUM) + __sk_stream_mem_reclaim(sk); +} + /* Used by processes to "lock" a socket state, so that * interrupts and bottom half handlers won't change it * from under us. It essentially blocks any incoming diff --git a/include/net/tcp.h b/include/net/tcp.h index 22a62d58c24d..8e2a7739136a 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -594,9 +594,6 @@ extern int sysctl_tcp_fack; extern int sysctl_tcp_reordering; extern int sysctl_tcp_ecn; extern int sysctl_tcp_dsack; -extern int sysctl_tcp_mem[3]; -extern int sysctl_tcp_wmem[3]; -extern int sysctl_tcp_rmem[3]; extern int sysctl_tcp_app_win; extern int sysctl_tcp_adv_win_scale; extern int sysctl_tcp_tw_reuse; @@ -614,10 +611,6 @@ extern int sysctl_tcp_bic_low_window; extern int sysctl_tcp_default_win_scale; extern int sysctl_tcp_moderate_rcvbuf; -extern atomic_t tcp_memory_allocated; -extern atomic_t tcp_sockets_allocated; -extern int tcp_memory_pressure; - struct open_request; struct or_calltable { @@ -1867,24 +1860,7 @@ static __inline__ void tcp_openreq_init(struct open_request *req, req->rmt_port = skb->h.th->source; } -#define TCP_MEM_QUANTUM ((int)PAGE_SIZE) - -extern void __tcp_mem_reclaim(struct sock *sk); -extern int tcp_mem_schedule(struct sock *sk, int size, int kind); - -static inline void tcp_mem_reclaim(struct sock *sk) -{ - if (sk->sk_forward_alloc >= TCP_MEM_QUANTUM) - __tcp_mem_reclaim(sk); -} - -static inline void tcp_enter_memory_pressure(void) -{ - if (!tcp_memory_pressure) { - NET_INC_STATS(TCPMemoryPressures); - tcp_memory_pressure = 1; - } -} +extern void tcp_enter_memory_pressure(void); static inline struct sk_buff *tcp_alloc_pskb(struct sock *sk, int size, int mem, int gfp) { @@ -1893,7 +1869,7 @@ static inline struct sk_buff *tcp_alloc_pskb(struct sock *sk, int size, int mem, if (skb) { skb->truesize += mem; if (sk->sk_forward_alloc >= (int)skb->truesize || - tcp_mem_schedule(sk, skb->truesize, 0)) { + sk_stream_mem_schedule(sk, skb->truesize, 0)) { skb_reserve(skb, MAX_TCP_HEADER); return skb; } @@ -1913,7 +1889,7 @@ static inline struct sk_buff *tcp_alloc_skb(struct sock *sk, int size, int gfp) static inline struct page * tcp_alloc_page(struct sock *sk) { if (sk->sk_forward_alloc >= (int)PAGE_SIZE || - tcp_mem_schedule(sk, PAGE_SIZE, 0)) { + sk_stream_mem_schedule(sk, PAGE_SIZE, 0)) { struct page *page = alloc_pages(sk->sk_allocation, 0); if (page) return page; @@ -1929,7 +1905,7 @@ static inline void tcp_writequeue_purge(struct sock *sk) while ((skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) sk_stream_free_skb(sk, skb); - tcp_mem_reclaim(sk); + sk_stream_mem_reclaim(sk); } extern void tcp_listen_wlock(void); |
