git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
[pandora-kernel.git]
/
net
/
ipv4
/
udp.c
diff --git
a/net/ipv4/udp.c
b/net/ipv4/udp.c
index
9de6a69
..
50678f9
100644
(file)
--- a/
net/ipv4/udp.c
+++ b/
net/ipv4/udp.c
@@
-634,7
+634,9
@@
void __udp4_lib_err(struct sk_buff *skb, u32 info, struct udp_table *udptable)
if (!harderr || sk->sk_state != TCP_ESTABLISHED)
goto out;
} else {
if (!harderr || sk->sk_state != TCP_ESTABLISHED)
goto out;
} else {
+ bh_lock_sock(sk);
ip_icmp_error(sk, skb, err, uh->dest, info, (u8 *)(uh+1));
ip_icmp_error(sk, skb, err, uh->dest, info, (u8 *)(uh+1));
+ bh_unlock_sock(sk);
}
sk->sk_err = err;
sk->sk_error_report(sk);
}
sk->sk_err = err;
sk->sk_error_report(sk);
@@
-1063,10
+1065,11
@@
static unsigned int first_packet_length(struct sock *sk)
spin_unlock_bh(&rcvq->lock);
if (!skb_queue_empty(&list_kill)) {
spin_unlock_bh(&rcvq->lock);
if (!skb_queue_empty(&list_kill)) {
- lock_sock_bh(sk);
+ bool slow = lock_sock_fast(sk);
+
__skb_queue_purge(&list_kill);
sk_mem_reclaim_partial(sk);
__skb_queue_purge(&list_kill);
sk_mem_reclaim_partial(sk);
- unlock_sock_
bh(sk
);
+ unlock_sock_
fast(sk, slow
);
}
return res;
}
}
return res;
}
@@
-1123,6
+1126,7
@@
int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
int peeked;
int err;
int is_udplite = IS_UDPLITE(sk);
int peeked;
int err;
int is_udplite = IS_UDPLITE(sk);
+ bool slow;
/*
* Check any passed addresses
/*
* Check any passed addresses
@@
-1197,10
+1201,10
@@
out:
return err;
csum_copy_err:
return err;
csum_copy_err:
-
lock_sock_bh
(sk);
+
slow = lock_sock_fast
(sk);
if (!skb_kill_datagram(sk, skb, flags))
UDP_INC_STATS_USER(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
if (!skb_kill_datagram(sk, skb, flags))
UDP_INC_STATS_USER(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
- unlock_sock_
bh(sk
);
+ unlock_sock_
fast(sk, slow
);
if (noblock)
return -EAGAIN;
if (noblock)
return -EAGAIN;
@@
-1625,9
+1629,9
@@
int udp_rcv(struct sk_buff *skb)
void udp_destroy_sock(struct sock *sk)
{
void udp_destroy_sock(struct sock *sk)
{
-
lock_sock_bh
(sk);
+
bool slow = lock_sock_fast
(sk);
udp_flush_pending_frames(sk);
udp_flush_pending_frames(sk);
- unlock_sock_
bh(sk
);
+ unlock_sock_
fast(sk, slow
);
}
/*
}
/*
@@
-1686,8
+1690,8
@@
int udp_lib_setsockopt(struct sock *sk, int level, int optname,
return -ENOPROTOOPT;
if (val != 0 && val < 8) /* Illegal coverage: use default (8) */
val = 8;
return -ENOPROTOOPT;
if (val != 0 && val < 8) /* Illegal coverage: use default (8) */
val = 8;
- else if (val > USH
O
RT_MAX)
- val = USH
O
RT_MAX;
+ else if (val > USHRT_MAX)
+ val = USHRT_MAX;
up->pcslen = val;
up->pcflag |= UDPLITE_SEND_CC;
break;
up->pcslen = val;
up->pcflag |= UDPLITE_SEND_CC;
break;
@@
-1700,8
+1704,8
@@
int udp_lib_setsockopt(struct sock *sk, int level, int optname,
return -ENOPROTOOPT;
if (val != 0 && val < 8) /* Avoid silly minimal values. */
val = 8;
return -ENOPROTOOPT;
if (val != 0 && val < 8) /* Avoid silly minimal values. */
val = 8;
- else if (val > USH
O
RT_MAX)
- val = USH
O
RT_MAX;
+ else if (val > USHRT_MAX)
+ val = USHRT_MAX;
up->pcrlen = val;
up->pcflag |= UDPLITE_RECV_CC;
break;
up->pcrlen = val;
up->pcflag |= UDPLITE_RECV_CC;
break;