From owner-freebsd-infiniband@freebsd.org Wed May 18 14:12:54 2016 Return-Path: Delivered-To: freebsd-infiniband@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 10B79B3F7D4 for ; Wed, 18 May 2016 14:12:54 +0000 (UTC) (envelope-from Krishna2@chelsio.com) Received: from stargate.chelsio.com (stargate.chelsio.com [12.32.117.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id E66011EC4 for ; Wed, 18 May 2016 14:12:53 +0000 (UTC) (envelope-from Krishna2@chelsio.com) Received: from nice.asicdesigners.com (nice.asicdesigners.com [10.192.160.7]) by stargate.chelsio.com (8.13.8/8.13.8) with ESMTP id u4IECqji024005 for ; Wed, 18 May 2016 07:12:52 -0700 Received: from NICE.asicdesigners.com ([fe80::51b2:ba95:9d72:babc]) by nice.asicdesigners.com ([fe80::51b2:ba95:9d72:babc%15]) with mapi id 14.03.0123.003; Wed, 18 May 2016 07:12:52 -0700 From: KrishnamRaju ErapaRaju To: "freebsd-infiniband@freebsd.org" CC: Steve Wise , Navdeep Parhar Subject: write() system call(via rdma_get_cm_event) is not honoring a signal with flag SA_RESTART. Thread-Topic: write() system call(via rdma_get_cm_event) is not honoring a signal with flag SA_RESTART. Thread-Index: AdGxDdzFSQDg/DwRTmyaP7SBO3H+vgAAVIMQ Date: Wed, 18 May 2016 14:12:50 +0000 Message-ID: <4EAB2619577FCA4EBCE11F17B7373447C4313548@nice.asicdesigners.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.193.191.70] MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable X-Content-Filtered-By: Mailman/MimeDel 2.1.22 X-BeenThere: freebsd-infiniband@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Infiniband on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 May 2016 14:12:54 -0000 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.