Skip site navigation (1)Skip section navigation (2)
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>