@@ -1060,7 +1060,6 @@ static bool subflow_check_data_avail(struct sock *ssk)
1060
1060
* subflow_error_report() will introduce the appropriate barriers
1061
1061
*/
1062
1062
ssk -> sk_err = EBADMSG ;
1063
- ssk -> sk_error_report (ssk );
1064
1063
tcp_set_state (ssk , TCP_CLOSE );
1065
1064
subflow -> reset_transient = 0 ;
1066
1065
subflow -> reset_reason = MPTCP_RST_EMPTCP ;
@@ -1115,41 +1114,6 @@ void mptcp_space(const struct sock *ssk, int *space, int *full_space)
1115
1114
* full_space = tcp_full_space (sk );
1116
1115
}
1117
1116
1118
- static void subflow_data_ready (struct sock * sk )
1119
- {
1120
- struct mptcp_subflow_context * subflow = mptcp_subflow_ctx (sk );
1121
- u16 state = 1 << inet_sk_state_load (sk );
1122
- struct sock * parent = subflow -> conn ;
1123
- struct mptcp_sock * msk ;
1124
-
1125
- msk = mptcp_sk (parent );
1126
- if (state & TCPF_LISTEN ) {
1127
- /* MPJ subflow are removed from accept queue before reaching here,
1128
- * avoid stray wakeups
1129
- */
1130
- if (reqsk_queue_empty (& inet_csk (sk )-> icsk_accept_queue ))
1131
- return ;
1132
-
1133
- set_bit (MPTCP_DATA_READY , & msk -> flags );
1134
- parent -> sk_data_ready (parent );
1135
- return ;
1136
- }
1137
-
1138
- WARN_ON_ONCE (!__mptcp_check_fallback (msk ) && !subflow -> mp_capable &&
1139
- !subflow -> mp_join && !(state & TCPF_CLOSE ));
1140
-
1141
- if (mptcp_subflow_data_available (sk ))
1142
- mptcp_data_ready (parent , sk );
1143
- }
1144
-
1145
- static void subflow_write_space (struct sock * ssk )
1146
- {
1147
- struct sock * sk = mptcp_subflow_ctx (ssk )-> conn ;
1148
-
1149
- mptcp_propagate_sndbuf (sk , ssk );
1150
- mptcp_write_space (sk );
1151
- }
1152
-
1153
1117
void __mptcp_error_report (struct sock * sk )
1154
1118
{
1155
1119
struct mptcp_subflow_context * subflow ;
@@ -1190,6 +1154,43 @@ static void subflow_error_report(struct sock *ssk)
1190
1154
mptcp_data_unlock (sk );
1191
1155
}
1192
1156
1157
+ static void subflow_data_ready (struct sock * sk )
1158
+ {
1159
+ struct mptcp_subflow_context * subflow = mptcp_subflow_ctx (sk );
1160
+ u16 state = 1 << inet_sk_state_load (sk );
1161
+ struct sock * parent = subflow -> conn ;
1162
+ struct mptcp_sock * msk ;
1163
+
1164
+ msk = mptcp_sk (parent );
1165
+ if (state & TCPF_LISTEN ) {
1166
+ /* MPJ subflow are removed from accept queue before reaching here,
1167
+ * avoid stray wakeups
1168
+ */
1169
+ if (reqsk_queue_empty (& inet_csk (sk )-> icsk_accept_queue ))
1170
+ return ;
1171
+
1172
+ set_bit (MPTCP_DATA_READY , & msk -> flags );
1173
+ parent -> sk_data_ready (parent );
1174
+ return ;
1175
+ }
1176
+
1177
+ WARN_ON_ONCE (!__mptcp_check_fallback (msk ) && !subflow -> mp_capable &&
1178
+ !subflow -> mp_join && !(state & TCPF_CLOSE ));
1179
+
1180
+ if (mptcp_subflow_data_available (sk ))
1181
+ mptcp_data_ready (parent , sk );
1182
+ else if (unlikely (sk -> sk_err ))
1183
+ subflow_error_report (sk );
1184
+ }
1185
+
1186
+ static void subflow_write_space (struct sock * ssk )
1187
+ {
1188
+ struct sock * sk = mptcp_subflow_ctx (ssk )-> conn ;
1189
+
1190
+ mptcp_propagate_sndbuf (sk , ssk );
1191
+ mptcp_write_space (sk );
1192
+ }
1193
+
1193
1194
static struct inet_connection_sock_af_ops *
1194
1195
subflow_default_af_ops (struct sock * sk )
1195
1196
{
@@ -1500,6 +1501,8 @@ static void subflow_state_change(struct sock *sk)
1500
1501
*/
1501
1502
if (mptcp_subflow_data_available (sk ))
1502
1503
mptcp_data_ready (parent , sk );
1504
+ else if (unlikely (sk -> sk_err ))
1505
+ subflow_error_report (sk );
1503
1506
1504
1507
subflow_sched_work_if_closed (mptcp_sk (parent ), sk );
1505
1508
0 commit comments