|
@@ -409,18 +409,18 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
|
|
if (msg_flags & MSG_OOB)
|
|
if (msg_flags & MSG_OOB)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- /* If there are pending notifications, do those - and nothing else */
|
|
|
|
- if (!list_empty(&rs->rs_notify_queue)) {
|
|
|
|
- ret = rds_notify_queue_get(rs, msg);
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
|
|
+ while (1) {
|
|
|
|
+ /* If there are pending notifications, do those - and nothing else */
|
|
|
|
+ if (!list_empty(&rs->rs_notify_queue)) {
|
|
|
|
+ ret = rds_notify_queue_get(rs, msg);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
- if (rs->rs_cong_notify) {
|
|
|
|
- ret = rds_notify_cong(rs, msg);
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
|
|
+ if (rs->rs_cong_notify) {
|
|
|
|
+ ret = rds_notify_cong(rs, msg);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
- while (1) {
|
|
|
|
if (!rds_next_incoming(rs, &inc)) {
|
|
if (!rds_next_incoming(rs, &inc)) {
|
|
if (nonblock) {
|
|
if (nonblock) {
|
|
ret = -EAGAIN;
|
|
ret = -EAGAIN;
|
|
@@ -428,7 +428,9 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
|
|
}
|
|
}
|
|
|
|
|
|
timeo = wait_event_interruptible_timeout(*sk->sk_sleep,
|
|
timeo = wait_event_interruptible_timeout(*sk->sk_sleep,
|
|
- rds_next_incoming(rs, &inc),
|
|
|
|
|
|
+ (!list_empty(&rs->rs_notify_queue)
|
|
|
|
+ || rs->rs_cong_notify
|
|
|
|
+ || rds_next_incoming(rs, &inc)),
|
|
timeo);
|
|
timeo);
|
|
rdsdebug("recvmsg woke inc %p timeo %ld\n", inc,
|
|
rdsdebug("recvmsg woke inc %p timeo %ld\n", inc,
|
|
timeo);
|
|
timeo);
|