]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/ipv6/udp.c
udp: use it's own memory accounting schema
[karo-tx-linux.git] / net / ipv6 / udp.c
index 9aa7c1c7a9ce1d98f51ff547b936eacc5f671cd4..71963b23d5a543357a93cbdd2bf9861cd6408632 100644 (file)
@@ -334,7 +334,6 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
        int is_udplite = IS_UDPLITE(sk);
        bool checksum_valid = false;
        int is_udp4;
-       bool slow;
 
        if (flags & MSG_ERRQUEUE)
                return ipv6_recv_error(sk, msg, len, addr_len);
@@ -378,7 +377,6 @@ try_again:
                        goto csum_copy_err;
        }
        if (unlikely(err)) {
-               trace_kfree_skb(skb, udpv6_recvmsg);
                if (!peeked) {
                        atomic_inc(&sk->sk_drops);
                        if (is_udp4)
@@ -388,7 +386,7 @@ try_again:
                                UDP6_INC_STATS(sock_net(sk), UDP_MIB_INERRORS,
                                               is_udplite);
                }
-               skb_free_datagram_locked(sk, skb);
+               kfree_skb(skb);
                return err;
        }
        if (!peeked) {
@@ -437,12 +435,11 @@ try_again:
        if (flags & MSG_TRUNC)
                err = ulen;
 
-       __skb_free_datagram_locked(sk, skb, peeking ? -err : err);
+       skb_consume_udp(sk, skb, peeking ? -err : err);
        return err;
 
 csum_copy_err:
-       slow = lock_sock_fast(sk);
-       if (!skb_kill_datagram(sk, skb, flags)) {
+       if (!__sk_queue_drop_skb(sk, skb, flags)) {
                if (is_udp4) {
                        UDP_INC_STATS(sock_net(sk),
                                      UDP_MIB_CSUMERRORS, is_udplite);
@@ -455,7 +452,7 @@ csum_copy_err:
                                       UDP_MIB_INERRORS, is_udplite);
                }
        }
-       unlock_sock_fast(sk, slow);
+       kfree_skb(skb);
 
        /* starting over for a new packet, but check if we need to yield */
        cond_resched();
@@ -523,7 +520,7 @@ static int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
                sk_incoming_cpu_update(sk);
        }
 
-       rc = __sock_queue_rcv_skb(sk, skb);
+       rc = __udp_enqueue_schedule_skb(sk, skb);
        if (rc < 0) {
                int is_udplite = IS_UDPLITE(sk);
 
@@ -535,6 +532,7 @@ static int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
                kfree_skb(skb);
                return -1;
        }
+
        return 0;
 }
 
@@ -556,7 +554,6 @@ EXPORT_SYMBOL(udpv6_encap_enable);
 int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
 {
        struct udp_sock *up = udp_sk(sk);
-       int rc;
        int is_udplite = IS_UDPLITE(sk);
 
        if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
@@ -622,25 +619,10 @@ int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
                goto drop;
 
        udp_csum_pull_header(skb);
-       if (sk_rcvqueues_full(sk, sk->sk_rcvbuf)) {
-               __UDP6_INC_STATS(sock_net(sk),
-                                UDP_MIB_RCVBUFERRORS, is_udplite);
-               goto drop;
-       }
 
        skb_dst_drop(skb);
 
-       bh_lock_sock(sk);
-       rc = 0;
-       if (!sock_owned_by_user(sk))
-               rc = __udpv6_queue_rcv_skb(sk, skb);
-       else if (sk_add_backlog(sk, skb, sk->sk_rcvbuf)) {
-               bh_unlock_sock(sk);
-               goto drop;
-       }
-       bh_unlock_sock(sk);
-
-       return rc;
+       return __udpv6_queue_rcv_skb(sk, skb);
 
 csum_error:
        __UDP6_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS, is_udplite);
@@ -1433,12 +1415,12 @@ struct proto udpv6_prot = {
        .connect           = ip6_datagram_connect,
        .disconnect        = udp_disconnect,
        .ioctl             = udp_ioctl,
+       .init              = udp_init_sock,
        .destroy           = udpv6_destroy_sock,
        .setsockopt        = udpv6_setsockopt,
        .getsockopt        = udpv6_getsockopt,
        .sendmsg           = udpv6_sendmsg,
        .recvmsg           = udpv6_recvmsg,
-       .backlog_rcv       = __udpv6_queue_rcv_skb,
        .release_cb        = ip6_datagram_release_cb,
        .hash              = udp_lib_hash,
        .unhash            = udp_lib_unhash,