aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-01-16 22:11:22 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-16 22:11:22 -0500
commit8b88a11e4451a967973b7b8b5e82ff62f3d69945 (patch)
tree7c0c3aa49a645be67a43bdec3b3e354714dc1f61
parentabfce3ef58b6a6c95de389f9d20047a05b10e484 (diff)
parent9bbb4ecc681968b7cf781e08e3918604c3b699d3 (diff)
Merge branch 'tipc'
Ying Xue says: ==================== tipc: align TIPC behaviours of waiting for events with other stacks Comparing the current implementations of waiting for events in TIPC socket layer with other stacks, TIPC's behaviour is very different because wait_event_interruptible_timeout()/wait_event_interruptible() are always used by TIPC to wait for events while relevant socket or port variables are fed to them as their arguments. As socket lock has to be released temporarily before the two routines of waiting for events are called, their arguments associated with socket or port structures are out of socket lock protection. This might cause serious issues where the process of calling socket syscall such as sendsmg(), connect(), accept(), and recvmsg(), cannot be waken up at all even if proper event arrives or improperly be woken up although the condition of waking up the process is not satisfied in practice. Therefore, aligning its behaviours with similar functions implemented in other stacks, for instance, sk_stream_wait_connect() and inet_csk_wait_for_connect() etc, can avoid above risks for us. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/tipc/socket.c296
1 files changed, 186 insertions, 110 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index c8341d1f995e..eab17eb9ca1d 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -55,9 +55,6 @@ struct tipc_sock {
55#define tipc_sk(sk) ((struct tipc_sock *)(sk)) 55#define tipc_sk(sk) ((struct tipc_sock *)(sk))
56#define tipc_sk_port(sk) (tipc_sk(sk)->p) 56#define tipc_sk_port(sk) (tipc_sk(sk)->p)
57 57
58#define tipc_rx_ready(sock) (!skb_queue_empty(&sock->sk->sk_receive_queue) || \
59 (sock->state == SS_DISCONNECTING))
60
61static int backlog_rcv(struct sock *sk, struct sk_buff *skb); 58static int backlog_rcv(struct sock *sk, struct sk_buff *skb);
62static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf); 59static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf);
63static void wakeupdispatch(struct tipc_port *tport); 60static void wakeupdispatch(struct tipc_port *tport);
@@ -567,6 +564,31 @@ static int dest_name_check(struct sockaddr_tipc *dest, struct msghdr *m)
567 return 0; 564 return 0;
568} 565}
569 566
567static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p)
568{
569 struct sock *sk = sock->sk;
570 struct tipc_port *tport = tipc_sk_port(sk);
571 DEFINE_WAIT(wait);
572 int done;
573
574 do {
575 int err = sock_error(sk);
576 if (err)
577 return err;
578 if (sock->state == SS_DISCONNECTING)
579 return -EPIPE;
580 if (!*timeo_p)
581 return -EAGAIN;
582 if (signal_pending(current))
583 return sock_intr_errno(*timeo_p);
584
585 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
586 done = sk_wait_event(sk, timeo_p, !tport->congested);
587 finish_wait(sk_sleep(sk), &wait);
588 } while (!done);
589 return 0;
590}
591
570/** 592/**
571 * send_msg - send message in connectionless manner 593 * send_msg - send message in connectionless manner
572 * @iocb: if NULL, indicates that socket lock is already held 594 * @iocb: if NULL, indicates that socket lock is already held
@@ -588,7 +610,7 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
588 struct tipc_port *tport = tipc_sk_port(sk); 610 struct tipc_port *tport = tipc_sk_port(sk);
589 struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name; 611 struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
590 int needs_conn; 612 int needs_conn;
591 long timeout_val; 613 long timeo;
592 int res = -EINVAL; 614 int res = -EINVAL;
593 615
594 if (unlikely(!dest)) 616 if (unlikely(!dest))
@@ -625,8 +647,7 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
625 reject_rx_queue(sk); 647 reject_rx_queue(sk);
626 } 648 }
627 649
628 timeout_val = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); 650 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
629
630 do { 651 do {
631 if (dest->addrtype == TIPC_ADDR_NAME) { 652 if (dest->addrtype == TIPC_ADDR_NAME) {
632 res = dest_name_check(dest, m); 653 res = dest_name_check(dest, m);
@@ -660,14 +681,9 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
660 sock->state = SS_CONNECTING; 681 sock->state = SS_CONNECTING;
661 break; 682 break;
662 } 683 }
663 if (timeout_val <= 0L) { 684 res = tipc_wait_for_sndmsg(sock, &timeo);
664 res = timeout_val ? timeout_val : -EWOULDBLOCK; 685 if (res)
665 break; 686 break;
666 }
667 release_sock(sk);
668 timeout_val = wait_event_interruptible_timeout(*sk_sleep(sk),
669 !tport->congested, timeout_val);
670 lock_sock(sk);
671 } while (1); 687 } while (1);
672 688
673exit: 689exit:
@@ -676,6 +692,34 @@ exit:
676 return res; 692 return res;
677} 693}
678 694
695static int tipc_wait_for_sndpkt(struct socket *sock, long *timeo_p)
696{
697 struct sock *sk = sock->sk;
698 struct tipc_port *tport = tipc_sk_port(sk);
699 DEFINE_WAIT(wait);
700 int done;
701
702 do {
703 int err = sock_error(sk);
704 if (err)
705 return err;
706 if (sock->state == SS_DISCONNECTING)
707 return -EPIPE;
708 else if (sock->state != SS_CONNECTED)
709 return -ENOTCONN;
710 if (!*timeo_p)
711 return -EAGAIN;
712 if (signal_pending(current))
713 return sock_intr_errno(*timeo_p);
714
715 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
716 done = sk_wait_event(sk, timeo_p,
717 (!tport->congested || !tport->connected));
718 finish_wait(sk_sleep(sk), &wait);
719 } while (!done);
720 return 0;
721}
722
679/** 723/**
680 * send_packet - send a connection-oriented message 724 * send_packet - send a connection-oriented message
681 * @iocb: if NULL, indicates that socket lock is already held 725 * @iocb: if NULL, indicates that socket lock is already held
@@ -693,8 +737,8 @@ static int send_packet(struct kiocb *iocb, struct socket *sock,
693 struct sock *sk = sock->sk; 737 struct sock *sk = sock->sk;
694 struct tipc_port *tport = tipc_sk_port(sk); 738 struct tipc_port *tport = tipc_sk_port(sk);
695 struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name; 739 struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
696 long timeout_val; 740 int res = -EINVAL;
697 int res; 741 long timeo;
698 742
699 /* Handle implied connection establishment */ 743 /* Handle implied connection establishment */
700 if (unlikely(dest)) 744 if (unlikely(dest))
@@ -706,30 +750,24 @@ static int send_packet(struct kiocb *iocb, struct socket *sock,
706 if (iocb) 750 if (iocb)
707 lock_sock(sk); 751 lock_sock(sk);
708 752
709 timeout_val = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); 753 if (unlikely(sock->state != SS_CONNECTED)) {
754 if (sock->state == SS_DISCONNECTING)
755 res = -EPIPE;
756 else
757 res = -ENOTCONN;
758 goto exit;
759 }
710 760
761 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
711 do { 762 do {
712 if (unlikely(sock->state != SS_CONNECTED)) {
713 if (sock->state == SS_DISCONNECTING)
714 res = -EPIPE;
715 else
716 res = -ENOTCONN;
717 break;
718 }
719
720 res = tipc_send(tport->ref, m->msg_iov, total_len); 763 res = tipc_send(tport->ref, m->msg_iov, total_len);
721 if (likely(res != -ELINKCONG)) 764 if (likely(res != -ELINKCONG))
722 break; 765 break;
723 if (timeout_val <= 0L) { 766 res = tipc_wait_for_sndpkt(sock, &timeo);
724 res = timeout_val ? timeout_val : -EWOULDBLOCK; 767 if (res)
725 break; 768 break;
726 }
727 release_sock(sk);
728 timeout_val = wait_event_interruptible_timeout(*sk_sleep(sk),
729 (!tport->congested || !tport->connected), timeout_val);
730 lock_sock(sk);
731 } while (1); 769 } while (1);
732 770exit:
733 if (iocb) 771 if (iocb)
734 release_sock(sk); 772 release_sock(sk);
735 return res; 773 return res;
@@ -953,6 +991,37 @@ static int anc_data_recv(struct msghdr *m, struct tipc_msg *msg,
953 return 0; 991 return 0;
954} 992}
955 993
994static int tipc_wait_for_rcvmsg(struct socket *sock, long timeo)
995{
996 struct sock *sk = sock->sk;
997 DEFINE_WAIT(wait);
998 int err;
999
1000 for (;;) {
1001 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
1002 if (skb_queue_empty(&sk->sk_receive_queue)) {
1003 if (sock->state == SS_DISCONNECTING) {
1004 err = -ENOTCONN;
1005 break;
1006 }
1007 release_sock(sk);
1008 timeo = schedule_timeout(timeo);
1009 lock_sock(sk);
1010 }
1011 err = 0;
1012 if (!skb_queue_empty(&sk->sk_receive_queue))
1013 break;
1014 err = sock_intr_errno(timeo);
1015 if (signal_pending(current))
1016 break;
1017 err = -EAGAIN;
1018 if (!timeo)
1019 break;
1020 }
1021 finish_wait(sk_sleep(sk), &wait);
1022 return err;
1023}
1024
956/** 1025/**
957 * recv_msg - receive packet-oriented message 1026 * recv_msg - receive packet-oriented message
958 * @iocb: (unused) 1027 * @iocb: (unused)
@@ -972,7 +1041,7 @@ static int recv_msg(struct kiocb *iocb, struct socket *sock,
972 struct tipc_port *tport = tipc_sk_port(sk); 1041 struct tipc_port *tport = tipc_sk_port(sk);
973 struct sk_buff *buf; 1042 struct sk_buff *buf;
974 struct tipc_msg *msg; 1043 struct tipc_msg *msg;
975 long timeout; 1044 long timeo;
976 unsigned int sz; 1045 unsigned int sz;
977 u32 err; 1046 u32 err;
978 int res; 1047 int res;
@@ -988,25 +1057,13 @@ static int recv_msg(struct kiocb *iocb, struct socket *sock,
988 goto exit; 1057 goto exit;
989 } 1058 }
990 1059
991 timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); 1060 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
992restart: 1061restart:
993 1062
994 /* Look for a message in receive queue; wait if necessary */ 1063 /* Look for a message in receive queue; wait if necessary */
995 while (skb_queue_empty(&sk->sk_receive_queue)) { 1064 res = tipc_wait_for_rcvmsg(sock, timeo);
996 if (sock->state == SS_DISCONNECTING) { 1065 if (res)
997 res = -ENOTCONN; 1066 goto exit;
998 goto exit;
999 }
1000 if (timeout <= 0L) {
1001 res = timeout ? timeout : -EWOULDBLOCK;
1002 goto exit;
1003 }
1004 release_sock(sk);
1005 timeout = wait_event_interruptible_timeout(*sk_sleep(sk),
1006 tipc_rx_ready(sock),
1007 timeout);
1008 lock_sock(sk);
1009 }
1010 1067
1011 /* Look at first message in receive queue */ 1068 /* Look at first message in receive queue */
1012 buf = skb_peek(&sk->sk_receive_queue); 1069 buf = skb_peek(&sk->sk_receive_queue);
@@ -1078,7 +1135,7 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock,
1078 struct tipc_port *tport = tipc_sk_port(sk); 1135 struct tipc_port *tport = tipc_sk_port(sk);
1079 struct sk_buff *buf; 1136 struct sk_buff *buf;
1080 struct tipc_msg *msg; 1137 struct tipc_msg *msg;
1081 long timeout; 1138 long timeo;
1082 unsigned int sz; 1139 unsigned int sz;
1083 int sz_to_copy, target, needed; 1140 int sz_to_copy, target, needed;
1084 int sz_copied = 0; 1141 int sz_copied = 0;
@@ -1091,31 +1148,19 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock,
1091 1148
1092 lock_sock(sk); 1149 lock_sock(sk);
1093 1150
1094 if (unlikely((sock->state == SS_UNCONNECTED))) { 1151 if (unlikely(sock->state == SS_UNCONNECTED)) {
1095 res = -ENOTCONN; 1152 res = -ENOTCONN;
1096 goto exit; 1153 goto exit;
1097 } 1154 }
1098 1155
1099 target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len); 1156 target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len);
1100 timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); 1157 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
1101 1158
1102restart: 1159restart:
1103 /* Look for a message in receive queue; wait if necessary */ 1160 /* Look for a message in receive queue; wait if necessary */
1104 while (skb_queue_empty(&sk->sk_receive_queue)) { 1161 res = tipc_wait_for_rcvmsg(sock, timeo);
1105 if (sock->state == SS_DISCONNECTING) { 1162 if (res)
1106 res = -ENOTCONN; 1163 goto exit;
1107 goto exit;
1108 }
1109 if (timeout <= 0L) {
1110 res = timeout ? timeout : -EWOULDBLOCK;
1111 goto exit;
1112 }
1113 release_sock(sk);
1114 timeout = wait_event_interruptible_timeout(*sk_sleep(sk),
1115 tipc_rx_ready(sock),
1116 timeout);
1117 lock_sock(sk);
1118 }
1119 1164
1120 /* Look at first message in receive queue */ 1165 /* Look at first message in receive queue */
1121 buf = skb_peek(&sk->sk_receive_queue); 1166 buf = skb_peek(&sk->sk_receive_queue);
@@ -1438,6 +1483,28 @@ static void wakeupdispatch(struct tipc_port *tport)
1438 sk->sk_write_space(sk); 1483 sk->sk_write_space(sk);
1439} 1484}
1440 1485
1486static int tipc_wait_for_connect(struct socket *sock, long *timeo_p)
1487{
1488 struct sock *sk = sock->sk;
1489 DEFINE_WAIT(wait);
1490 int done;
1491
1492 do {
1493 int err = sock_error(sk);
1494 if (err)
1495 return err;
1496 if (!*timeo_p)
1497 return -ETIMEDOUT;
1498 if (signal_pending(current))
1499 return sock_intr_errno(*timeo_p);
1500
1501 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
1502 done = sk_wait_event(sk, timeo_p, sock->state != SS_CONNECTING);
1503 finish_wait(sk_sleep(sk), &wait);
1504 } while (!done);
1505 return 0;
1506}
1507
1441/** 1508/**
1442 * connect - establish a connection to another TIPC port 1509 * connect - establish a connection to another TIPC port
1443 * @sock: socket structure 1510 * @sock: socket structure
@@ -1453,7 +1520,8 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
1453 struct sock *sk = sock->sk; 1520 struct sock *sk = sock->sk;
1454 struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest; 1521 struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;
1455 struct msghdr m = {NULL,}; 1522 struct msghdr m = {NULL,};
1456 unsigned int timeout; 1523 long timeout = (flags & O_NONBLOCK) ? 0 : tipc_sk(sk)->conn_timeout;
1524 socket_state previous;
1457 int res; 1525 int res;
1458 1526
1459 lock_sock(sk); 1527 lock_sock(sk);
@@ -1475,8 +1543,7 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
1475 goto exit; 1543 goto exit;
1476 } 1544 }
1477 1545
1478 timeout = (flags & O_NONBLOCK) ? 0 : tipc_sk(sk)->conn_timeout; 1546 previous = sock->state;
1479
1480 switch (sock->state) { 1547 switch (sock->state) {
1481 case SS_UNCONNECTED: 1548 case SS_UNCONNECTED:
1482 /* Send a 'SYN-' to destination */ 1549 /* Send a 'SYN-' to destination */
@@ -1498,41 +1565,22 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
1498 * case is EINPROGRESS, rather than EALREADY. 1565 * case is EINPROGRESS, rather than EALREADY.
1499 */ 1566 */
1500 res = -EINPROGRESS; 1567 res = -EINPROGRESS;
1501 break;
1502 case SS_CONNECTING: 1568 case SS_CONNECTING:
1503 res = -EALREADY; 1569 if (previous == SS_CONNECTING)
1570 res = -EALREADY;
1571 if (!timeout)
1572 goto exit;
1573 timeout = msecs_to_jiffies(timeout);
1574 /* Wait until an 'ACK' or 'RST' arrives, or a timeout occurs */
1575 res = tipc_wait_for_connect(sock, &timeout);
1504 break; 1576 break;
1505 case SS_CONNECTED: 1577 case SS_CONNECTED:
1506 res = -EISCONN; 1578 res = -EISCONN;
1507 break; 1579 break;
1508 default: 1580 default:
1509 res = -EINVAL; 1581 res = -EINVAL;
1510 goto exit; 1582 break;
1511 }
1512
1513 if (sock->state == SS_CONNECTING) {
1514 if (!timeout)
1515 goto exit;
1516
1517 /* Wait until an 'ACK' or 'RST' arrives, or a timeout occurs */
1518 release_sock(sk);
1519 res = wait_event_interruptible_timeout(*sk_sleep(sk),
1520 sock->state != SS_CONNECTING,
1521 timeout ? (long)msecs_to_jiffies(timeout)
1522 : MAX_SCHEDULE_TIMEOUT);
1523 if (res <= 0) {
1524 if (res == 0)
1525 res = -ETIMEDOUT;
1526 return res;
1527 }
1528 lock_sock(sk);
1529 } 1583 }
1530
1531 if (unlikely(sock->state == SS_DISCONNECTING))
1532 res = sock_error(sk);
1533 else
1534 res = 0;
1535
1536exit: 1584exit:
1537 release_sock(sk); 1585 release_sock(sk);
1538 return res; 1586 return res;
@@ -1563,6 +1611,42 @@ static int listen(struct socket *sock, int len)
1563 return res; 1611 return res;
1564} 1612}
1565 1613
1614static int tipc_wait_for_accept(struct socket *sock, long timeo)
1615{
1616 struct sock *sk = sock->sk;
1617 DEFINE_WAIT(wait);
1618 int err;
1619
1620 /* True wake-one mechanism for incoming connections: only
1621 * one process gets woken up, not the 'whole herd'.
1622 * Since we do not 'race & poll' for established sockets
1623 * anymore, the common case will execute the loop only once.
1624 */
1625 for (;;) {
1626 prepare_to_wait_exclusive(sk_sleep(sk), &wait,
1627 TASK_INTERRUPTIBLE);
1628 if (skb_queue_empty(&sk->sk_receive_queue)) {
1629 release_sock(sk);
1630 timeo = schedule_timeout(timeo);
1631 lock_sock(sk);
1632 }
1633 err = 0;
1634 if (!skb_queue_empty(&sk->sk_receive_queue))
1635 break;
1636 err = -EINVAL;
1637 if (sock->state != SS_LISTENING)
1638 break;
1639 err = sock_intr_errno(timeo);
1640 if (signal_pending(current))
1641 break;
1642 err = -EAGAIN;
1643 if (!timeo)
1644 break;
1645 }
1646 finish_wait(sk_sleep(sk), &wait);
1647 return err;
1648}
1649
1566/** 1650/**
1567 * accept - wait for connection request 1651 * accept - wait for connection request
1568 * @sock: listening socket 1652 * @sock: listening socket
@@ -1579,7 +1663,7 @@ static int accept(struct socket *sock, struct socket *new_sock, int flags)
1579 struct tipc_port *new_tport; 1663 struct tipc_port *new_tport;
1580 struct tipc_msg *msg; 1664 struct tipc_msg *msg;
1581 u32 new_ref; 1665 u32 new_ref;
1582 1666 long timeo;
1583 int res; 1667 int res;
1584 1668
1585 lock_sock(sk); 1669 lock_sock(sk);
@@ -1589,18 +1673,10 @@ static int accept(struct socket *sock, struct socket *new_sock, int flags)
1589 goto exit; 1673 goto exit;
1590 } 1674 }
1591 1675
1592 while (skb_queue_empty(&sk->sk_receive_queue)) { 1676 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
1593 if (flags & O_NONBLOCK) { 1677 res = tipc_wait_for_accept(sock, timeo);
1594 res = -EWOULDBLOCK; 1678 if (res)
1595 goto exit; 1679 goto exit;
1596 }
1597 release_sock(sk);
1598 res = wait_event_interruptible(*sk_sleep(sk),
1599 (!skb_queue_empty(&sk->sk_receive_queue)));
1600 lock_sock(sk);
1601 if (res)
1602 goto exit;
1603 }
1604 1680
1605 buf = skb_peek(&sk->sk_receive_queue); 1681 buf = skb_peek(&sk->sk_receive_queue);
1606 1682