@@ -1122,21 +1122,15 @@ static int smc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
1122
1122
1123
1123
static unsigned int smc_accept_poll (struct sock * parent )
1124
1124
{
1125
- struct smc_sock * isk ;
1126
- struct sock * sk ;
1127
-
1128
- lock_sock (parent );
1129
- list_for_each_entry (isk , & smc_sk (parent )-> accept_q , accept_q ) {
1130
- sk = (struct sock * )isk ;
1125
+ struct smc_sock * isk = smc_sk (parent );
1126
+ int mask = 0 ;
1131
1127
1132
- if (sk -> sk_state == SMC_ACTIVE ) {
1133
- release_sock (parent );
1134
- return POLLIN | POLLRDNORM ;
1135
- }
1136
- }
1137
- release_sock (parent );
1128
+ spin_lock (& isk -> accept_q_lock );
1129
+ if (!list_empty (& isk -> accept_q ))
1130
+ mask = POLLIN | POLLRDNORM ;
1131
+ spin_unlock (& isk -> accept_q_lock );
1138
1132
1139
- return 0 ;
1133
+ return mask ;
1140
1134
}
1141
1135
1142
1136
static unsigned int smc_poll (struct file * file , struct socket * sock ,
@@ -1147,9 +1141,15 @@ static unsigned int smc_poll(struct file *file, struct socket *sock,
1147
1141
struct smc_sock * smc ;
1148
1142
int rc ;
1149
1143
1144
+ if (!sk )
1145
+ return POLLNVAL ;
1146
+
1150
1147
smc = smc_sk (sock -> sk );
1148
+ sock_hold (sk );
1149
+ lock_sock (sk );
1151
1150
if ((sk -> sk_state == SMC_INIT ) || smc -> use_fallback ) {
1152
1151
/* delegate to CLC child sock */
1152
+ release_sock (sk );
1153
1153
mask = smc -> clcsock -> ops -> poll (file , smc -> clcsock , wait );
1154
1154
/* if non-blocking connect finished ... */
1155
1155
lock_sock (sk );
@@ -1161,37 +1161,43 @@ static unsigned int smc_poll(struct file *file, struct socket *sock,
1161
1161
rc = smc_connect_rdma (smc );
1162
1162
if (rc < 0 )
1163
1163
mask |= POLLERR ;
1164
- else
1165
- /* success cases including fallback */
1166
- mask |= POLLOUT | POLLWRNORM ;
1164
+ /* success cases including fallback */
1165
+ mask |= POLLOUT | POLLWRNORM ;
1167
1166
}
1168
1167
}
1169
- release_sock (sk );
1170
1168
} else {
1171
- sock_poll_wait (file , sk_sleep (sk ), wait );
1172
- if (sk -> sk_state == SMC_LISTEN )
1173
- /* woken up by sk_data_ready in smc_listen_work() */
1174
- mask |= smc_accept_poll (sk );
1169
+ if (sk -> sk_state != SMC_CLOSED ) {
1170
+ release_sock (sk );
1171
+ sock_poll_wait (file , sk_sleep (sk ), wait );
1172
+ lock_sock (sk );
1173
+ }
1175
1174
if (sk -> sk_err )
1176
1175
mask |= POLLERR ;
1177
- if (atomic_read (& smc -> conn .sndbuf_space ) ||
1178
- (sk -> sk_shutdown & SEND_SHUTDOWN )) {
1179
- mask |= POLLOUT | POLLWRNORM ;
1180
- } else {
1181
- sk_set_bit (SOCKWQ_ASYNC_NOSPACE , sk );
1182
- set_bit (SOCK_NOSPACE , & sk -> sk_socket -> flags );
1183
- }
1184
- if (atomic_read (& smc -> conn .bytes_to_rcv ))
1185
- mask |= POLLIN | POLLRDNORM ;
1186
1176
if ((sk -> sk_shutdown == SHUTDOWN_MASK ) ||
1187
1177
(sk -> sk_state == SMC_CLOSED ))
1188
1178
mask |= POLLHUP ;
1189
- if (sk -> sk_shutdown & RCV_SHUTDOWN )
1190
- mask |= POLLIN | POLLRDNORM | POLLRDHUP ;
1191
- if (sk -> sk_state == SMC_APPCLOSEWAIT1 )
1192
- mask |= POLLIN ;
1179
+ if (sk -> sk_state == SMC_LISTEN ) {
1180
+ /* woken up by sk_data_ready in smc_listen_work() */
1181
+ mask = smc_accept_poll (sk );
1182
+ } else {
1183
+ if (atomic_read (& smc -> conn .sndbuf_space ) ||
1184
+ sk -> sk_shutdown & SEND_SHUTDOWN ) {
1185
+ mask |= POLLOUT | POLLWRNORM ;
1186
+ } else {
1187
+ sk_set_bit (SOCKWQ_ASYNC_NOSPACE , sk );
1188
+ set_bit (SOCK_NOSPACE , & sk -> sk_socket -> flags );
1189
+ }
1190
+ if (atomic_read (& smc -> conn .bytes_to_rcv ))
1191
+ mask |= POLLIN | POLLRDNORM ;
1192
+ if (sk -> sk_shutdown & RCV_SHUTDOWN )
1193
+ mask |= POLLIN | POLLRDNORM | POLLRDHUP ;
1194
+ if (sk -> sk_state == SMC_APPCLOSEWAIT1 )
1195
+ mask |= POLLIN ;
1196
+ }
1193
1197
1194
1198
}
1199
+ release_sock (sk );
1200
+ sock_put (sk );
1195
1201
1196
1202
return mask ;
1197
1203
}
0 commit comments