]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - net/core/stream.c
[SOCK] Avoid divides in sk_stream_pages() and __sk_stream_mem_reclaim()
[mirror_ubuntu-artful-kernel.git] / net / core / stream.c
index d1d7decf70b0087af2de9358049e5e43ed46d326..bf188ffdbdbe9137cfe78c7041e8e482f43df37b 100644 (file)
@@ -35,7 +35,7 @@ void sk_stream_write_space(struct sock *sk)
                if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
                        wake_up_interruptible(sk->sk_sleep);
                if (sock->fasync_list && !(sk->sk_shutdown & SEND_SHUTDOWN))
-                       sock_wake_async(sock, 2, POLL_OUT);
+                       sock_wake_async(sock, SOCK_WAKE_SPACE, POLL_OUT);
        }
 }
 
@@ -69,7 +69,7 @@ int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
                sk->sk_write_pending++;
                done = sk_wait_event(sk, timeo_p,
                                     !sk->sk_err &&
-                                    !((1 << sk->sk_state) & 
+                                    !((1 << sk->sk_state) &
                                       ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)));
                finish_wait(sk->sk_sleep, &wait);
                sk->sk_write_pending--;
@@ -139,7 +139,7 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
 
                set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
                sk->sk_write_pending++;
-               sk_wait_event(sk, &current_timeo, !sk->sk_err && 
+               sk_wait_event(sk, &current_timeo, !sk->sk_err &&
                                                  !(sk->sk_shutdown & SEND_SHUTDOWN) &&
                                                  sk_stream_memory_free(sk) &&
                                                  vm_wait);
@@ -196,7 +196,7 @@ EXPORT_SYMBOL(sk_stream_error);
 
 void __sk_stream_mem_reclaim(struct sock *sk)
 {
-       atomic_sub(sk->sk_forward_alloc / SK_STREAM_MEM_QUANTUM,
+       atomic_sub(sk->sk_forward_alloc >> SK_STREAM_MEM_QUANTUM_SHIFT,
                   sk->sk_prot->memory_allocated);
        sk->sk_forward_alloc &= SK_STREAM_MEM_QUANTUM - 1;
        if (*sk->sk_prot->memory_pressure &&
@@ -210,35 +210,36 @@ EXPORT_SYMBOL(__sk_stream_mem_reclaim);
 int sk_stream_mem_schedule(struct sock *sk, int size, int kind)
 {
        int amt = sk_stream_pages(size);
+       struct proto *prot = sk->sk_prot;
 
        sk->sk_forward_alloc += amt * SK_STREAM_MEM_QUANTUM;
-       atomic_add(amt, sk->sk_prot->memory_allocated);
+       atomic_add(amt, prot->memory_allocated);
 
        /* Under limit. */
-       if (atomic_read(sk->sk_prot->memory_allocated) < sk->sk_prot->sysctl_mem[0]) {
-               if (*sk->sk_prot->memory_pressure)
-                       *sk->sk_prot->memory_pressure = 0;
+       if (atomic_read(prot->memory_allocated) < prot->sysctl_mem[0]) {
+               if (*prot->memory_pressure)
+                       *prot->memory_pressure = 0;
                return 1;
        }
 
        /* Over hard limit. */
-       if (atomic_read(sk->sk_prot->memory_allocated) > sk->sk_prot->sysctl_mem[2]) {
-               sk->sk_prot->enter_memory_pressure();
+       if (atomic_read(prot->memory_allocated) > prot->sysctl_mem[2]) {
+               prot->enter_memory_pressure();
                goto suppress_allocation;
        }
 
        /* Under pressure. */
-       if (atomic_read(sk->sk_prot->memory_allocated) > sk->sk_prot->sysctl_mem[1])
-               sk->sk_prot->enter_memory_pressure();
+       if (atomic_read(prot->memory_allocated) > prot->sysctl_mem[1])
+               prot->enter_memory_pressure();
 
        if (kind) {
-               if (atomic_read(&sk->sk_rmem_alloc) < sk->sk_prot->sysctl_rmem[0])
+               if (atomic_read(&sk->sk_rmem_alloc) < prot->sysctl_rmem[0])
                        return 1;
-       } else if (sk->sk_wmem_queued < sk->sk_prot->sysctl_wmem[0])
+       } else if (sk->sk_wmem_queued < prot->sysctl_wmem[0])
                return 1;
 
-       if (!*sk->sk_prot->memory_pressure ||
-           sk->sk_prot->sysctl_mem[2] > atomic_read(sk->sk_prot->sockets_allocated) *
+       if (!*prot->memory_pressure ||
+           prot->sysctl_mem[2] > atomic_read(prot->sockets_allocated) *
                                sk_stream_pages(sk->sk_wmem_queued +
                                                atomic_read(&sk->sk_rmem_alloc) +
                                                sk->sk_forward_alloc))
@@ -258,7 +259,7 @@ suppress_allocation:
 
        /* Alas. Undo changes. */
        sk->sk_forward_alloc -= amt * SK_STREAM_MEM_QUANTUM;
-       atomic_sub(amt, sk->sk_prot->memory_allocated);
+       atomic_sub(amt, prot->memory_allocated);
        return 0;
 }