Re: [PATCH 1/3] vhost: do not generate signal when sendmsg fails
From: Maxime Coquelin <hidden>
Date: 2018-03-29 13:41:28
On 03/29/2018 03:25 PM, Tiwei Bie wrote:
On Thu, Mar 29, 2018 at 02:19:35PM +0200, Maxime Coquelin wrote:quoted
Hi Tiwei, On 03/06/2018 11:43 AM, Tiwei Bie wrote:quoted
Signed-off-by: Tiwei Bie <redacted>Could you please elaborate a bit more why this is needed? Is it fixing a real issue or just an improvement?My bad, I really should write a more useful commit log.. I saw your comments on this mail: http://dpdk.org/ml/archives/dev/2018-March/094201.html Thank you so much! :-) It's fixing an issue I met when adding the vDPA support. SIGPIPE would be generated when sending messages via a closed slave fd, and it will terminate the process by default. But as a library, we shouldn't crash the process in this case, instead we just need to return with an error. I didn't meet this issue without my vDPA related changes, so I didn't put a fixline on it. That is to say, I'm treating it as an improvement.
Great, thanks for the details! I'll apply the patch with below commit message. Maxime
Below is the commit log for your reference: ------ START HERE ------ vhost: do not generate signal when sendmsg fails More precisely, do not generate a SIGPIPE signal if the peer has closed the connection. Otherwise, it will terminate the process by default. As a library, we should avoid terminating the application process when error happens and just need to return with an error. ------ END HERE ------ Thanks again! :-) Best regards, Tiwei Biequoted
Thanks! Maximequoted
--- lib/librte_vhost/socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index 0354740fa..d703d2114 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c@@ -181,7 +181,7 @@ send_fd_message(int sockfd, char *buf, int buflen, int *fds, int fd_num) } do { - ret = sendmsg(sockfd, &msgh, 0); + ret = sendmsg(sockfd, &msgh, MSG_NOSIGNAL); } while (ret < 0 && errno == EINTR); if (ret < 0) {