Whamcloud - gitweb
LU-6407 lnet: set task state before scheduling 65/14265/3
authorJohn L. Hammond <john.hammond@intel.com>
Mon, 30 Mar 2015 18:32:46 +0000 (13:32 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Sun, 26 Apr 2015 18:58:47 +0000 (18:58 +0000)
In 0b868add80281c085ce1b297d1cb078deaab802a when libcfs_sock_accept()
was made into lnet_sock_accept() a call to
set_current_state(TASK_INTERRUPTIBLE) got dropped. Restore it.

Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: I132d6a611e5677ad52358178aa566ca805536e61
Reviewed-on: http://review.whamcloud.com/14265
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: Amir Shehata <amir.shehata@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lnet/lnet/lib-socket.c

index 80ca9a7..0b6fc00 100644 (file)
@@ -561,8 +561,6 @@ lnet_sock_accept(struct socket **newsockp, struct socket *sock)
        struct socket *newsock;
        int            rc;
 
        struct socket *newsock;
        int            rc;
 
-       init_waitqueue_entry(&wait, current);
-
        /* XXX this should add a ref to sock->ops->owner, if
         * TCP could be a module */
        rc = sock_create_lite(PF_PACKET, sock->type, IPPROTO_TCP, &newsock);
        /* XXX this should add a ref to sock->ops->owner, if
         * TCP could be a module */
        rc = sock_create_lite(PF_PACKET, sock->type, IPPROTO_TCP, &newsock);
@@ -572,18 +570,18 @@ lnet_sock_accept(struct socket **newsockp, struct socket *sock)
        }
 
        newsock->ops = sock->ops;
        }
 
        newsock->ops = sock->ops;
-       add_wait_queue(sk_sleep(sock->sk), &wait);
 
        rc = sock->ops->accept(sock, newsock, O_NONBLOCK);
        if (rc == -EAGAIN) {
                /* Nothing ready, so wait for activity */
 
        rc = sock->ops->accept(sock, newsock, O_NONBLOCK);
        if (rc == -EAGAIN) {
                /* Nothing ready, so wait for activity */
+               init_waitqueue_entry(&wait, current);
+               add_wait_queue(sk_sleep(sock->sk), &wait);
+               set_current_state(TASK_INTERRUPTIBLE);
                schedule();
                schedule();
+               remove_wait_queue(sk_sleep(sock->sk), &wait);
                rc = sock->ops->accept(sock, newsock, O_NONBLOCK);
        }
 
                rc = sock->ops->accept(sock, newsock, O_NONBLOCK);
        }
 
-       remove_wait_queue(sk_sleep(sock->sk), &wait);
-       set_current_state(TASK_RUNNING);
-
        if (rc != 0)
                goto failed;
 
        if (rc != 0)
                goto failed;