Date: Wed, 18 May 2016 14:12:50 +0000 From: KrishnamRaju ErapaRaju <Krishna2@chelsio.com> To: "freebsd-infiniband@freebsd.org" <freebsd-infiniband@freebsd.org> Cc: Steve Wise <swise@chelsio.com>, Navdeep Parhar <navdeep@chelsio.com> Subject: write() system call(via rdma_get_cm_event) is not honoring a signal with flag SA_RESTART. Message-ID: <4EAB2619577FCA4EBCE11F17B7373447C4313548@nice.asicdesigners.com>
next in thread | raw e-mail | index | archive | help
Hello, write() system call(via rdma_get_cm_event) is not honoring a signal with fl= ag SA_RESTART, IE rdma_get_cm_event() is returning -1 when it got interrup= ted by a signal: SIGARLM, but it should actually restart the system call an= d wait until it get a rdma event. Below is my rdma application which does initiate alarm/timer when receives = RDMA_CM_EVENT_CONNECT_REQUEST and expects RDMA_CM_EVENT_DISCONNECTED when t= he timer expires. As rdma_get_cm_event() calls ucma_get_event() via write system call, this s= ystem call may be blocked at wait_event_interruptible() until it gets an ev= ent or until it gets a signal interrupt. In Linux environment my rdma application is running fine(write system call= via rdma_get_cm_event is getting restarted when there is a SIGALRM with SA= _RESTART flag, and waits until DISCONNECT event). But runing same application in FreeBSD is failing to restart the interrupte= d write system call when interrupted by a signal and returns -ENOBUFS error= as below: # ./newlat rdma_get_cm_event failed -1 rdma_get_cm_event error: No buffer space available # ---------------------------------------------part of my rdma application --= ------------------------ sa.sa_handler =3D &sig_handler; sa.sa_flags =3D SA_RESTART; sigfillset(&sa.sa_mask); sigaction(SIGALRM, &sa, NULL); while (!done) { ret =3D rdma_get_cm_event(rch, &event); if (ret) { fprintf(stderr, "rdma_get_cm_event failed %d\n", re= t); perror("rdma_get_cm_event error"); done =3D 1; break; } local_event =3D *event; rdma_ack_cm_event(event); switch (local_event.event) { case RDMA_CM_EVENT_CONNECT_REQUEST: ret =3D newconn(local_event.id); if (ret) done =3D 1; else { clients++; if (clients =3D=3D total_clients) { if (run_time) alarm(run_time); buf[0] =3D 1; } } break; case RDMA_CM_EVENT_DISCONNECTED: disconn(local_event.id); clients--; if (clients =3D=3D 0) done =3D 1; break; case RDMA_CM_EVENT_ESTABLISHED: break; default: fprintf(stderr, "fatal rdma event %u\n", lo= cal_event.event); done =3D 1; ret =3D -1; break; } } return ret; } void sig_handler(int foo) { buf[0] =3D 0xff; } Thanks, Krishna.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4EAB2619577FCA4EBCE11F17B7373447C4313548>