|
@@ -280,6 +280,8 @@ static __poll_t rpmsg_sock_poll(struct file *file, struct socket *sock,
|
|
|
/* exceptional events? */
|
|
/* exceptional events? */
|
|
|
if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
|
|
if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
|
|
|
mask |= EPOLLERR;
|
|
mask |= EPOLLERR;
|
|
|
|
|
+ if (sk->sk_state == RPMSG_ERROR)
|
|
|
|
|
+ mask |= EPOLLERR;
|
|
|
if (sk->sk_shutdown & RCV_SHUTDOWN)
|
|
if (sk->sk_shutdown & RCV_SHUTDOWN)
|
|
|
mask |= EPOLLRDHUP;
|
|
mask |= EPOLLRDHUP;
|
|
|
if (sk->sk_shutdown == SHUTDOWN_MASK)
|
|
if (sk->sk_shutdown == SHUTDOWN_MASK)
|
|
@@ -664,8 +666,10 @@ static void rpmsg_proto_remove(struct rpmsg_device *rpdev)
|
|
|
rpsk->endpt = NULL;
|
|
rpsk->endpt = NULL;
|
|
|
}
|
|
}
|
|
|
release_sock(&rpsk->sk);
|
|
release_sock(&rpsk->sk);
|
|
|
- if (endpt)
|
|
|
|
|
|
|
+ if (endpt) {
|
|
|
rpmsg_destroy_ept(endpt);
|
|
rpmsg_destroy_ept(endpt);
|
|
|
|
|
+ rpsk->sk.sk_error_report(&rpsk->sk);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
kfree(sk_list);
|
|
kfree(sk_list);
|
|
|
rpdev->ept->priv = NULL;
|
|
rpdev->ept->priv = NULL;
|