Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: net/ipv4: Eliminate kstrdup memory leak net/caif/cfrfml.c: use asm/unaligned.h ax25: missplaced sock_put(sk) qlge: reset the chip before freeing the buffers l2tp: test for ethernet header in l2tp_eth_dev_recv() tcp: select(writefds) don't hang up when a peer close connection tcp: fix three tcp sysctls tuning tcp: Combat per-cpu skew in orphan tests. pxa168_eth: silence gcc warnings pxa168_eth: update call to phy_mii_ioctl() pxa168_eth: fix error handling in prope pxa168_eth: remove unneeded null check phylib: Fix race between returning phydev and calling adjust_link caif-driver: add HAS_DMA dependency 3c59x: Fix deadlock between boomerang_interrupt and boomerang_start_tx qlcnic: fix poll implementation netxen: fix poll implementation bridge: netfilter: fix a memory leak
This commit is contained in:
@@ -112,8 +112,8 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25)
|
||||
if (sk) {
|
||||
sock_hold(sk);
|
||||
ax25_destroy_socket(ax25);
|
||||
sock_put(sk);
|
||||
bh_unlock_sock(sk);
|
||||
sock_put(sk);
|
||||
} else
|
||||
ax25_destroy_socket(ax25);
|
||||
return;
|
||||
|
||||
@@ -162,8 +162,8 @@ static inline struct nf_bridge_info *nf_bridge_unshare(struct sk_buff *skb)
|
||||
if (tmp) {
|
||||
memcpy(tmp, nf_bridge, sizeof(struct nf_bridge_info));
|
||||
atomic_set(&tmp->use, 1);
|
||||
nf_bridge_put(nf_bridge);
|
||||
}
|
||||
nf_bridge_put(nf_bridge);
|
||||
nf_bridge = tmp;
|
||||
}
|
||||
return nf_bridge;
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/unaligned/le_byteshift.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <net/caif/caif_layer.h>
|
||||
#include <net/caif/cfsrvl.h>
|
||||
#include <net/caif/cfpkt.h>
|
||||
|
||||
+10
-22
@@ -451,7 +451,8 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
if (sk_stream_wspace(sk) >= sk_stream_min_wspace(sk))
|
||||
mask |= POLLOUT | POLLWRNORM;
|
||||
}
|
||||
}
|
||||
} else
|
||||
mask |= POLLOUT | POLLWRNORM;
|
||||
|
||||
if (tp->urg_data & TCP_URG_VALID)
|
||||
mask |= POLLPRI;
|
||||
@@ -2011,11 +2012,8 @@ adjudge_to_death:
|
||||
}
|
||||
}
|
||||
if (sk->sk_state != TCP_CLOSE) {
|
||||
int orphan_count = percpu_counter_read_positive(
|
||||
sk->sk_prot->orphan_count);
|
||||
|
||||
sk_mem_reclaim(sk);
|
||||
if (tcp_too_many_orphans(sk, orphan_count)) {
|
||||
if (tcp_too_many_orphans(sk, 0)) {
|
||||
if (net_ratelimit())
|
||||
printk(KERN_INFO "TCP: too many of orphaned "
|
||||
"sockets\n");
|
||||
@@ -3212,7 +3210,7 @@ void __init tcp_init(void)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
unsigned long nr_pages, limit;
|
||||
int order, i, max_share;
|
||||
int i, max_share, cnt;
|
||||
unsigned long jiffy = jiffies;
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb));
|
||||
@@ -3261,22 +3259,12 @@ void __init tcp_init(void)
|
||||
INIT_HLIST_HEAD(&tcp_hashinfo.bhash[i].chain);
|
||||
}
|
||||
|
||||
/* Try to be a bit smarter and adjust defaults depending
|
||||
* on available memory.
|
||||
*/
|
||||
for (order = 0; ((1 << order) << PAGE_SHIFT) <
|
||||
(tcp_hashinfo.bhash_size * sizeof(struct inet_bind_hashbucket));
|
||||
order++)
|
||||
;
|
||||
if (order >= 4) {
|
||||
tcp_death_row.sysctl_max_tw_buckets = 180000;
|
||||
sysctl_tcp_max_orphans = 4096 << (order - 4);
|
||||
sysctl_max_syn_backlog = 1024;
|
||||
} else if (order < 3) {
|
||||
tcp_death_row.sysctl_max_tw_buckets >>= (3 - order);
|
||||
sysctl_tcp_max_orphans >>= (3 - order);
|
||||
sysctl_max_syn_backlog = 128;
|
||||
}
|
||||
|
||||
cnt = tcp_hashinfo.ehash_mask + 1;
|
||||
|
||||
tcp_death_row.sysctl_max_tw_buckets = cnt / 2;
|
||||
sysctl_tcp_max_orphans = cnt / 2;
|
||||
sysctl_max_syn_backlog = max(128, cnt / 256);
|
||||
|
||||
/* Set the pressure threshold to be a fraction of global memory that
|
||||
* is up to 1/2 at 256 MB, decreasing toward zero with the amount of
|
||||
|
||||
+3
-2
@@ -196,10 +196,10 @@ void tcp_get_allowed_congestion_control(char *buf, size_t maxlen)
|
||||
int tcp_set_allowed_congestion_control(char *val)
|
||||
{
|
||||
struct tcp_congestion_ops *ca;
|
||||
char *clone, *name;
|
||||
char *saved_clone, *clone, *name;
|
||||
int ret = 0;
|
||||
|
||||
clone = kstrdup(val, GFP_USER);
|
||||
saved_clone = clone = kstrdup(val, GFP_USER);
|
||||
if (!clone)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -226,6 +226,7 @@ int tcp_set_allowed_congestion_control(char *val)
|
||||
}
|
||||
out:
|
||||
spin_unlock(&tcp_cong_list_lock);
|
||||
kfree(saved_clone);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -66,18 +66,18 @@ static void tcp_write_err(struct sock *sk)
|
||||
static int tcp_out_of_resources(struct sock *sk, int do_reset)
|
||||
{
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
int orphans = percpu_counter_read_positive(&tcp_orphan_count);
|
||||
int shift = 0;
|
||||
|
||||
/* If peer does not open window for long time, or did not transmit
|
||||
* anything for long time, penalize it. */
|
||||
if ((s32)(tcp_time_stamp - tp->lsndtime) > 2*TCP_RTO_MAX || !do_reset)
|
||||
orphans <<= 1;
|
||||
shift++;
|
||||
|
||||
/* If some dubious ICMP arrived, penalize even more. */
|
||||
if (sk->sk_err_soft)
|
||||
orphans <<= 1;
|
||||
shift++;
|
||||
|
||||
if (tcp_too_many_orphans(sk, orphans)) {
|
||||
if (tcp_too_many_orphans(sk, shift)) {
|
||||
if (net_ratelimit())
|
||||
printk(KERN_INFO "Out of socket memory\n");
|
||||
|
||||
|
||||
+1
-1
@@ -132,7 +132,7 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb,
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
if (data_len < ETH_HLEN)
|
||||
if (!pskb_may_pull(skb, sizeof(ETH_HLEN)))
|
||||
goto error;
|
||||
|
||||
secpath_reset(skb);
|
||||
|
||||
Reference in New Issue
Block a user