39
39
#include "smc_pnet.h"
40
40
#include "smc_tx.h"
41
41
#include "smc_rx.h"
42
+ #include "smc_close.h"
42
43
43
44
static DEFINE_MUTEX (smc_create_lgr_pending ); /* serialize link group
44
45
* creation
@@ -70,14 +71,29 @@ static int smc_release(struct socket *sock)
70
71
{
71
72
struct sock * sk = sock -> sk ;
72
73
struct smc_sock * smc ;
74
+ int rc = 0 ;
73
75
74
76
if (!sk )
75
77
goto out ;
76
78
77
79
smc = smc_sk (sk );
78
- lock_sock (sk );
80
+ sock_hold (sk );
81
+ if (sk -> sk_state == SMC_LISTEN )
82
+ /* smc_close_non_accepted() is called and acquires
83
+ * sock lock for child sockets again
84
+ */
85
+ lock_sock_nested (sk , SINGLE_DEPTH_NESTING );
86
+ else
87
+ lock_sock (sk );
79
88
80
- sk -> sk_state = SMC_CLOSED ;
89
+ if (smc -> use_fallback ) {
90
+ sk -> sk_state = SMC_CLOSED ;
91
+ sk -> sk_state_change (sk );
92
+ } else {
93
+ rc = smc_close_active (smc );
94
+ sock_set_flag (sk , SOCK_DEAD );
95
+ sk -> sk_shutdown |= SHUTDOWN_MASK ;
96
+ }
81
97
if (smc -> clcsock ) {
82
98
sock_release (smc -> clcsock );
83
99
smc -> clcsock = NULL ;
@@ -86,11 +102,18 @@ static int smc_release(struct socket *sock)
86
102
/* detach socket */
87
103
sock_orphan (sk );
88
104
sock -> sk = NULL ;
105
+ if (smc -> use_fallback ) {
106
+ schedule_delayed_work (& smc -> sock_put_work , TCP_TIMEWAIT_LEN );
107
+ } else if (sk -> sk_state == SMC_CLOSED ) {
108
+ smc_conn_free (& smc -> conn );
109
+ schedule_delayed_work (& smc -> sock_put_work ,
110
+ SMC_CLOSE_SOCK_PUT_DELAY );
111
+ }
89
112
release_sock (sk );
90
113
91
114
sock_put (sk );
92
115
out :
93
- return 0 ;
116
+ return rc ;
94
117
}
95
118
96
119
static void smc_destruct (struct sock * sk )
@@ -120,6 +143,7 @@ static struct sock *smc_sock_alloc(struct net *net, struct socket *sock)
120
143
INIT_WORK (& smc -> tcp_listen_work , smc_tcp_listen_work );
121
144
INIT_LIST_HEAD (& smc -> accept_q );
122
145
spin_lock_init (& smc -> accept_q_lock );
146
+ INIT_DELAYED_WORK (& smc -> sock_put_work , smc_close_sock_put_work );
123
147
sk_refcnt_debug_inc (sk );
124
148
125
149
return sk ;
@@ -417,7 +441,8 @@ static int smc_connect_rdma(struct smc_sock *smc)
417
441
418
442
out_connected :
419
443
smc_copy_sock_settings_to_clc (smc );
420
- smc -> sk .sk_state = SMC_ACTIVE ;
444
+ if (smc -> sk .sk_state == SMC_INIT )
445
+ smc -> sk .sk_state = SMC_ACTIVE ;
421
446
422
447
return rc ? rc : local_contact ;
423
448
@@ -559,8 +584,8 @@ static void smc_accept_unlink(struct sock *sk)
559
584
/* remove a sock from the accept queue to bind it to a new socket created
560
585
* for a socket accept call from user space
561
586
*/
562
- static struct sock * smc_accept_dequeue (struct sock * parent ,
563
- struct socket * new_sock )
587
+ struct sock * smc_accept_dequeue (struct sock * parent ,
588
+ struct socket * new_sock )
564
589
{
565
590
struct smc_sock * isk , * n ;
566
591
struct sock * new_sk ;
@@ -581,19 +606,34 @@ static struct sock *smc_accept_dequeue(struct sock *parent,
581
606
}
582
607
583
608
/* clean up for a created but never accepted sock */
584
- static void smc_close_non_accepted (struct sock * sk )
609
+ void smc_close_non_accepted (struct sock * sk )
585
610
{
586
611
struct smc_sock * smc = smc_sk (sk );
587
612
588
613
sock_hold (sk );
614
+ lock_sock (sk );
615
+ if (!sk -> sk_lingertime )
616
+ /* wait for peer closing */
617
+ sk -> sk_lingertime = SMC_MAX_STREAM_WAIT_TIMEOUT ;
618
+ if (!smc -> use_fallback )
619
+ smc_close_active (smc );
589
620
if (smc -> clcsock ) {
590
621
struct socket * tcp ;
591
622
592
623
tcp = smc -> clcsock ;
593
624
smc -> clcsock = NULL ;
594
625
sock_release (tcp );
595
626
}
596
- /* more closing stuff to be added with socket closing patch */
627
+ sock_set_flag (sk , SOCK_DEAD );
628
+ sk -> sk_shutdown |= SHUTDOWN_MASK ;
629
+ if (smc -> use_fallback ) {
630
+ schedule_delayed_work (& smc -> sock_put_work , TCP_TIMEWAIT_LEN );
631
+ } else {
632
+ smc_conn_free (& smc -> conn );
633
+ schedule_delayed_work (& smc -> sock_put_work ,
634
+ SMC_CLOSE_SOCK_PUT_DELAY );
635
+ }
636
+ release_sock (sk );
597
637
sock_put (sk );
598
638
}
599
639
@@ -761,11 +801,12 @@ static void smc_listen_work(struct work_struct *work)
761
801
762
802
out_connected :
763
803
sk_refcnt_debug_inc (newsmcsk );
764
- newsmcsk -> sk_state = SMC_ACTIVE ;
804
+ if (newsmcsk -> sk_state == SMC_INIT )
805
+ newsmcsk -> sk_state = SMC_ACTIVE ;
765
806
enqueue :
766
807
if (local_contact == SMC_FIRST_CONTACT )
767
808
mutex_unlock (& smc_create_lgr_pending );
768
- lock_sock (& lsmc -> sk );
809
+ lock_sock_nested (& lsmc -> sk , SINGLE_DEPTH_NESTING );
769
810
if (lsmc -> sk .sk_state == SMC_LISTEN ) {
770
811
smc_accept_enqueue (& lsmc -> sk , newsmcsk );
771
812
} else { /* no longer listening */
@@ -791,6 +832,7 @@ static void smc_listen_work(struct work_struct *work)
791
832
792
833
out_err :
793
834
newsmcsk -> sk_state = SMC_CLOSED ;
835
+ smc_conn_free (& new_smc -> conn );
794
836
goto enqueue ; /* queue new sock with sk_err set */
795
837
}
796
838
@@ -911,7 +953,8 @@ static int smc_getname(struct socket *sock, struct sockaddr *addr,
911
953
{
912
954
struct smc_sock * smc ;
913
955
914
- if (peer && (sock -> sk -> sk_state != SMC_ACTIVE ))
956
+ if (peer && (sock -> sk -> sk_state != SMC_ACTIVE ) &&
957
+ (sock -> sk -> sk_state != SMC_APPCLOSEWAIT1 ))
915
958
return - ENOTCONN ;
916
959
917
960
smc = smc_sk (sock -> sk );
@@ -927,7 +970,9 @@ static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
927
970
928
971
smc = smc_sk (sk );
929
972
lock_sock (sk );
930
- if (sk -> sk_state != SMC_ACTIVE )
973
+ if ((sk -> sk_state != SMC_ACTIVE ) &&
974
+ (sk -> sk_state != SMC_APPCLOSEWAIT1 ) &&
975
+ (sk -> sk_state != SMC_INIT ))
931
976
goto out ;
932
977
if (smc -> use_fallback )
933
978
rc = smc -> clcsock -> ops -> sendmsg (smc -> clcsock , msg , len );
@@ -947,13 +992,21 @@ static int smc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
947
992
948
993
smc = smc_sk (sk );
949
994
lock_sock (sk );
950
- if ((sk -> sk_state != SMC_ACTIVE ) && (sk -> sk_state != SMC_CLOSED ))
995
+ if ((sk -> sk_state == SMC_INIT ) ||
996
+ (sk -> sk_state == SMC_LISTEN ) ||
997
+ (sk -> sk_state == SMC_CLOSED ))
998
+ goto out ;
999
+
1000
+ if (sk -> sk_state == SMC_PEERFINCLOSEWAIT ) {
1001
+ rc = 0 ;
951
1002
goto out ;
1003
+ }
952
1004
953
1005
if (smc -> use_fallback )
954
1006
rc = smc -> clcsock -> ops -> recvmsg (smc -> clcsock , msg , len , flags );
955
1007
else
956
1008
rc = smc_rx_recvmsg (smc , msg , len , flags );
1009
+
957
1010
out :
958
1011
release_sock (sk );
959
1012
return rc ;
@@ -1013,15 +1066,23 @@ static unsigned int smc_poll(struct file *file, struct socket *sock,
1013
1066
mask |= smc_accept_poll (sk );
1014
1067
if (sk -> sk_err )
1015
1068
mask |= POLLERR ;
1016
- if (atomic_read (& smc -> conn .sndbuf_space )) {
1069
+ if (atomic_read (& smc -> conn .sndbuf_space ) ||
1070
+ (sk -> sk_shutdown & SEND_SHUTDOWN )) {
1017
1071
mask |= POLLOUT | POLLWRNORM ;
1018
1072
} else {
1019
1073
sk_set_bit (SOCKWQ_ASYNC_NOSPACE , sk );
1020
1074
set_bit (SOCK_NOSPACE , & sk -> sk_socket -> flags );
1021
1075
}
1022
1076
if (atomic_read (& smc -> conn .bytes_to_rcv ))
1023
1077
mask |= POLLIN | POLLRDNORM ;
1024
- /* for now - to be enhanced in follow-on patch */
1078
+ if ((sk -> sk_shutdown == SHUTDOWN_MASK ) ||
1079
+ (sk -> sk_state == SMC_CLOSED ))
1080
+ mask |= POLLHUP ;
1081
+ if (sk -> sk_shutdown & RCV_SHUTDOWN )
1082
+ mask |= POLLIN | POLLRDNORM | POLLRDHUP ;
1083
+ if (sk -> sk_state == SMC_APPCLOSEWAIT1 )
1084
+ mask |= POLLIN ;
1085
+
1025
1086
}
1026
1087
1027
1088
return mask ;
@@ -1032,31 +1093,53 @@ static int smc_shutdown(struct socket *sock, int how)
1032
1093
struct sock * sk = sock -> sk ;
1033
1094
struct smc_sock * smc ;
1034
1095
int rc = - EINVAL ;
1096
+ int rc1 = 0 ;
1035
1097
1036
1098
smc = smc_sk (sk );
1037
1099
1038
1100
if ((how < SHUT_RD ) || (how > SHUT_RDWR ))
1039
- goto out_err ;
1101
+ return rc ;
1040
1102
1041
1103
lock_sock (sk );
1042
1104
1043
1105
rc = - ENOTCONN ;
1044
- if (sk -> sk_state == SMC_CLOSED )
1106
+ if ((sk -> sk_state != SMC_LISTEN ) &&
1107
+ (sk -> sk_state != SMC_ACTIVE ) &&
1108
+ (sk -> sk_state != SMC_PEERCLOSEWAIT1 ) &&
1109
+ (sk -> sk_state != SMC_PEERCLOSEWAIT2 ) &&
1110
+ (sk -> sk_state != SMC_APPCLOSEWAIT1 ) &&
1111
+ (sk -> sk_state != SMC_APPCLOSEWAIT2 ) &&
1112
+ (sk -> sk_state != SMC_APPFINCLOSEWAIT ))
1045
1113
goto out ;
1046
1114
if (smc -> use_fallback ) {
1047
1115
rc = kernel_sock_shutdown (smc -> clcsock , how );
1048
1116
sk -> sk_shutdown = smc -> clcsock -> sk -> sk_shutdown ;
1049
1117
if (sk -> sk_shutdown == SHUTDOWN_MASK )
1050
1118
sk -> sk_state = SMC_CLOSED ;
1051
- } else {
1052
- rc = sock_no_shutdown (sock , how );
1119
+ goto out ;
1120
+ }
1121
+ switch (how ) {
1122
+ case SHUT_RDWR : /* shutdown in both directions */
1123
+ rc = smc_close_active (smc );
1124
+ break ;
1125
+ case SHUT_WR :
1126
+ rc = smc_close_shutdown_write (smc );
1127
+ break ;
1128
+ case SHUT_RD :
1129
+ if (sk -> sk_state == SMC_LISTEN )
1130
+ rc = smc_close_active (smc );
1131
+ else
1132
+ rc = 0 ;
1133
+ /* nothing more to do because peer is not involved */
1134
+ break ;
1053
1135
}
1136
+ rc1 = kernel_sock_shutdown (smc -> clcsock , how );
1137
+ /* map sock_shutdown_cmd constants to sk_shutdown value range */
1138
+ sk -> sk_shutdown |= how + 1 ;
1054
1139
1055
1140
out :
1056
1141
release_sock (sk );
1057
-
1058
- out_err :
1059
- return rc ;
1142
+ return rc ? rc : rc1 ;
1060
1143
}
1061
1144
1062
1145
static int smc_setsockopt (struct socket * sock , int level , int optname ,
0 commit comments