SOLARIS: Perform daemon syscalls as kernel threads
[openafs.git] / src / rx / rx_kcommon.c
index d2bf5e0..b04429f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
@@ -16,6 +16,8 @@
 
 
 #include "rx/rx_kcommon.h"
+#include "rx_atomic.h"
+#include "rx_stats.h"
 
 #ifdef AFS_HPUX110_ENV
 #include "h/tihdr.h"
@@ -245,12 +247,6 @@ osi_AssertFailK(const char *expr, const char *file, int line)
 
     osi_Panic("%s", buf);
 }
-#else
-void
-osi_AssertFailK(const char *expr, const char *file, int line)
-{
-    printk(KERN_CRIT "assertion failed: %s, file: %s, line: %d\n", expr, file, line);
-}
 #endif
 
 #ifndef UKERNEL
@@ -261,12 +257,13 @@ rx_ServerProc(void *unused)
 {
     int threadID;
 
-/* jaltman - rxi_dataQuota is protected by a mutex everywhere else */
     rxi_MorePackets(rx_maxReceiveWindow + 2);  /* alloc more packets */
+    MUTEX_ENTER(&rx_quota_mutex);
     rxi_dataQuota += rx_initSendWindow;        /* Reserve some pkts for hard times */
     /* threadID is used for making decisions in GetCall.  Get it by bumping
      * number of threads handling incoming calls */
     threadID = rxi_availProcs++;
+    MUTEX_EXIT(&rx_quota_mutex);
 
 #ifdef RX_ENABLE_LOCKS
     AFS_GUNLOCK();
@@ -301,9 +298,7 @@ MyPacketProc(struct rx_packet **ahandle, int asize)
                rxi_FreePacket(tp);
                tp = NULL;
                 if (rx_stats_active) {
-                    MUTEX_ENTER(&rx_stats_mutex);
-                    rx_stats.noPacketBuffersOnRead++;
-                    MUTEX_EXIT(&rx_stats_mutex);
+                   rx_atomic_inc(&rx_stats.noPacketBuffersOnRead);
                 }
            }
        }
@@ -314,9 +309,7 @@ MyPacketProc(struct rx_packet **ahandle, int asize)
         * end know we're losing.
         */
         if (rx_stats_active) {
-            MUTEX_ENTER(&rx_stats_mutex);
-            rx_stats.bogusPacketOnRead++;
-            MUTEX_EXIT(&rx_stats_mutex);
+           rx_atomic_inc(&rx_stats.bogusPacketOnRead);
         }
        /* I DON"T LIKE THIS PRINTF -- PRINTFS MAKE THINGS VERY VERY SLOOWWW */
        dpf(("rx: packet dropped: bad ulen=%d\n", asize));
@@ -354,8 +347,8 @@ MyArrivalProc(struct rx_packet *ahandle,
 void
 rxi_StartListener(void)
 {
+#if !defined(RXK_LISTENER_ENV) && !defined(RXK_UPCALL_ENV)
     /* if kernel, give name of appropriate procedures */
-#ifndef RXK_LISTENER_ENV
     rxk_GetPacketProc = MyPacketProc;
     rxk_PacketArrivalProc = MyArrivalProc;
     rxk_init();
@@ -384,8 +377,6 @@ rxi_InitPeerParams(struct rx_peer *pp)
        pp->timeout.sec = 2;
        /* pp->timeout.usec = 0; */
        pp->ifMTU = MIN(RX_MAX_PACKET_SIZE, rx_MyMaxSendSize);
-    }
-    if (i != -1) {
        mtu = ntohl(afs_cb_interface.mtu[i]);
        /* Diminish the packet size to one based on the MTU given by
         * the interface. */
@@ -394,8 +385,6 @@ rxi_InitPeerParams(struct rx_peer *pp)
            if (rxmtu < pp->ifMTU)
                pp->ifMTU = rxmtu;
        }
-    } else {                   /* couldn't find the interface, so assume the worst */
-       pp->ifMTU = MIN(RX_REMOTE_PACKET_SIZE, rx_MyMaxSendSize);
     }
 #  else /* AFS_USERSPACE_IP_ADDR */
     rx_ifnet_t ifn;
@@ -443,9 +432,7 @@ rxi_InitPeerParams(struct rx_peer *pp)
        pp->timeout.sec = 2;
        /* pp->timeout.usec = 0; */
        pp->ifMTU = MIN(RX_MAX_PACKET_SIZE, rx_MyMaxSendSize);
-    }
 
-    if (mtu > 0) {
        /* Diminish the packet size to one based on the MTU given by
         * the interface. */
        if (mtu > (RX_IPUDP_SIZE + RX_HEADER_SIZE)) {
@@ -453,8 +440,6 @@ rxi_InitPeerParams(struct rx_peer *pp)
            if (rxmtu < pp->ifMTU)
                pp->ifMTU = rxmtu;
        }
-    } else {                   /* couldn't find the interface, so assume the worst */
-       pp->ifMTU = MIN(RX_REMOTE_PACKET_SIZE,rx_MyMaxSendSize);
     }
 # endif /* AFS_SUN5_ENV */
 #else /* ADAPT_MTU */
@@ -503,7 +488,7 @@ shutdown_rxkernel(void)
            rxk_shutdownPorts();
            return;
        }
-    dpf(("shutdown_rxkernel: no udp proto"));
+    dpf(("shutdown_rxkernel: no udp proto\n"));
 }
 #endif /* !AIX && !SUN && !NCR  && !UKERNEL */
 
@@ -539,7 +524,7 @@ rxi_GetcbiInfo(void)
            rxmtu * rxi_nRecvFrags + ((rxi_nRecvFrags - 1) * UDP_HDR_SIZE);
        maxmtu = rxi_AdjustMaxMTU(rxmtu, maxmtu);
        addrs[i++] = ifinaddr;
-       if ((ifinaddr != 0x7f000001) && (maxmtu > rx_maxReceiveSize)) {
+       if (!rx_IsLoopbackAddr(ifinaddr) && (maxmtu > rx_maxReceiveSize)) {
            rx_maxReceiveSize = MIN(RX_MAX_PACKET_SIZE, maxmtu);
            rx_maxReceiveSize = MIN(rx_maxReceiveSize, rx_maxReceiveSizeUser);
        }
@@ -665,9 +650,9 @@ rxi_GetIFInfo(void)
                            ((rxi_nRecvFrags - 1) * UDP_HDR_SIZE);
                        maxmtu = rxi_AdjustMaxMTU(rxmtu, maxmtu);
                        addrs[i++] = ifinaddr;
-                       if ((ifinaddr != 0x7f000001) && 
+                       if (!rx_IsLoopbackAddr(ifinaddr) &&
                            (maxmtu > rx_maxReceiveSize)) {
-                           rx_maxReceiveSize = 
+                           rx_maxReceiveSize =
                                MIN(RX_MAX_PACKET_SIZE, maxmtu);
                            rx_maxReceiveSize =
                                MIN(rx_maxReceiveSize, rx_maxReceiveSizeUser);
@@ -685,7 +670,7 @@ rxi_GetIFInfo(void)
     TAILQ_FOREACH(ifn, &ifnet, if_link) {
        if (i >= ADDRSPERSITE)
            break;
-#elif defined(AFS_OBSD_ENV)
+#elif defined(AFS_OBSD_ENV) || defined(AFS_NBSD_ENV)
     for (ifn = ifnet.tqh_first; i < ADDRSPERSITE && ifn != NULL;
         ifn = ifn->if_list.tqe_next) {
 #else
@@ -696,7 +681,7 @@ rxi_GetIFInfo(void)
        TAILQ_FOREACH(ifad, &ifn->if_addrhead, ifa_link) {
            if (i >= ADDRSPERSITE)
                break;
-#elif defined(AFS_OBSD_ENV)
+#elif defined(AFS_OBSD_ENV) || defined(AFS_NBSD_ENV)
        for (ifad = ifn->if_addrlist.tqh_first;
             ifad != NULL && i < ADDRSPERSITE;
             ifad = ifad->ifa_list.tqe_next) {
@@ -718,7 +703,7 @@ rxi_GetIFInfo(void)
                    ((rxi_nRecvFrags - 1) * UDP_HDR_SIZE);
                maxmtu = rxi_AdjustMaxMTU(rxmtu, maxmtu);
                addrs[i++] = ifinaddr;
-               if ((ifinaddr != 0x7f000001) && (maxmtu > rx_maxReceiveSize)) {
+               if (!rx_IsLoopbackAddr(ifinaddr) && (maxmtu > rx_maxReceiveSize)) {
                    rx_maxReceiveSize = MIN(RX_MAX_PACKET_SIZE, maxmtu);
                    rx_maxReceiveSize =
                        MIN(rx_maxReceiveSize, rx_maxReceiveSizeUser);
@@ -829,7 +814,7 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
 #else
     struct socket *newSocket;
 #endif
-#if (!defined(AFS_HPUX1122_ENV) && !defined(AFS_FBSD50_ENV))
+#if (!defined(AFS_HPUX1122_ENV) && !defined(AFS_FBSD_ENV))
     struct mbuf *nam;
 #endif
     struct sockaddr_in myaddr;
@@ -853,7 +838,7 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     AFS_GUNLOCK();
 #if    defined(AFS_HPUX102_ENV)
 #if     defined(AFS_HPUX110_ENV)
-    /* we need a file associated with the socket so sosend in NetSend 
+    /* we need a file associated with the socket so sosend in NetSend
      * will not fail */
     /* blocking socket */
     code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0, 0);
@@ -872,14 +857,20 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
 #endif /* else AFS_HPUX110_ENV */
 #elif defined(AFS_SGI65_ENV) || defined(AFS_OBSD_ENV)
     code = socreate(AF_INET, &newSocket, SOCK_DGRAM, IPPROTO_UDP);
-#elif defined(AFS_FBSD50_ENV)
+#elif defined(AFS_FBSD_ENV)
     code = socreate(AF_INET, &newSocket, SOCK_DGRAM, IPPROTO_UDP,
                    afs_osi_credp, curthread);
-#elif defined(AFS_FBSD40_ENV)
-    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, IPPROTO_UDP, curproc);
 #elif defined(AFS_DARWIN80_ENV)
+#ifdef RXK_LISTENER_ENV
     code = sock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, NULL, &newSocket);
 #else
+    code = sock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, rx_upcall, NULL, &newSocket);
+#endif
+#elif defined(AFS_NBSD50_ENV)
+    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0, osi_curproc(), NULL);
+#elif defined(AFS_NBSD40_ENV)
+    code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0, osi_curproc());
+#else
     code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0);
 #endif /* AFS_HPUX102_ENV */
     if (code)
@@ -902,8 +893,11 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     memcpy((caddr_t) bindnam->b_rptr + SO_MSGOFFSET, (caddr_t) & myaddr,
           addrsize);
     bindnam->b_wptr = bindnam->b_rptr + (addrsize + SO_MSGOFFSET + 1);
-
+#if defined(AFS_NBSD40_ENV)
+    code = sobind(newSocket, bindnam, addrsize, osi_curproc());
+#else
     code = sobind(newSocket, bindnam, addrsize);
+#endif
     if (code) {
        soclose(newSocket);
 #if !defined(AFS_HPUX1122_ENV)
@@ -915,7 +909,7 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     freeb(bindnam);
 #else /* AFS_HPUX110_ENV */
 #if defined(AFS_DARWIN80_ENV)
-    { 
+    {
        int buflen = 50000;
        int i,code2;
        for (i=0;i<2;i++) {
@@ -939,17 +933,14 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     }
 #endif
 #if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
-#if defined(AFS_FBSD50_ENV)
+#if defined(AFS_FBSD_ENV)
     code = sobind(newSocket, (struct sockaddr *)&myaddr, curthread);
-#elif defined(AFS_FBSD40_ENV)
-    code = sobind(newSocket, (struct sockaddr *)&myaddr, curproc);
 #else
     code = sobind(newSocket, (struct sockaddr *)&myaddr);
 #endif
     if (code) {
        dpf(("sobind fails (%d)\n", (int)code));
        soclose(newSocket);
-       AFS_GLOCK();
        goto bad;
     }
 #else /* defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV) */
@@ -970,7 +961,7 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     BHV_PDATA(&bhv) = (void *)newSocket;
     code = sobind(&bhv, nam);
     m_freem(nam);
-#elif defined(AFS_OBSD44_ENV)
+#elif defined(AFS_OBSD44_ENV) || defined(AFS_NBSD40_ENV)
     code = sobind(newSocket, nam, osi_curproc());
 #else
     code = sobind(newSocket, nam);
@@ -1018,8 +1009,8 @@ rxk_FreeSocket(struct socket *asocket)
     if (asocket->so_fp) {
        struct file *fp = asocket->so_fp;
 #if !defined(AFS_HPUX1123_ENV)
-       /* 11.23 still has falloc, but not FPENTRYFREE ! 
-        * so for now if we shutdown, we will waist a file 
+       /* 11.23 still has falloc, but not FPENTRYFREE !
+        * so for now if we shutdown, we will waist a file
         * structure */
        FPENTRYFREE(fp);
        asocket->so_fp = NULL;
@@ -1034,8 +1025,8 @@ rxk_FreeSocket(struct socket *asocket)
 }
 #endif /* !SUN5 && !LINUX20 */
 
-#if defined(RXK_LISTENER_ENV) || defined(AFS_SUN5_ENV)
-#ifdef AFS_DARWIN80_ENV
+#if defined(RXK_LISTENER_ENV) || defined(AFS_SUN5_ENV) || defined(RXK_UPCALL_ENV)
+#ifdef RXK_TIMEDSLEEP_ENV
 /* Shutting down should wake us up, as should an earlier event. */
 void
 rxi_ReScheduleEvents(void)
@@ -1072,7 +1063,7 @@ afs_rxevent_daemon(void)
        afs_Trace1(afs_iclSetp, CM_TRACE_TIMESTAMP, ICL_TYPE_STRING,
                   "before afs_osi_Wait()");
 #endif
-#ifdef AFS_DARWIN80_ENV
+#ifdef RXK_TIMEDSLEEP_ENV
        afs_osi_TimedSleep(&afs_termState, MAX(500, ((temp.sec * 1000) +
                                                     (temp.usec / 1000))), 0);
 #else
@@ -1085,13 +1076,11 @@ afs_rxevent_daemon(void)
        if (afs_termState == AFSOP_STOP_RXEVENT) {
 #ifdef RXK_LISTENER_ENV
            afs_termState = AFSOP_STOP_RXK_LISTENER;
-#else
-#ifdef AFS_SUN510_ENV
+#elif defined(AFS_SUN510_ENV) || defined(RXK_UPCALL_ENV)
            afs_termState = AFSOP_STOP_NETIF;
 #else
            afs_termState = AFSOP_STOP_COMPLETE;
 #endif
-#endif
            osi_rxWakeup(&afs_termState);
            return;
        }
@@ -1127,7 +1116,7 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
     } else
        tlen = rlen;
 
-    /* add some padding to the last iovec, it's just to make sure that the 
+    /* add some padding to the last iovec, it's just to make sure that the
      * read doesn't return more data than we expect, and is done to get around
      * our problems caused by the lack of a length field in the rx header. */
     savelen = p->wirevec[p->niovecs - 1].iov_len;
@@ -1161,11 +1150,11 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
            if (nbytes <= 0) {
                 if (rx_stats_active) {
                     MUTEX_ENTER(&rx_stats_mutex);
-                    rx_stats.bogusPacketOnRead++;
+                    rx_atomic_inc(&rx_stats.bogusPacketOnRead);
                     rx_stats.bogusHost = from.sin_addr.s_addr;
                     MUTEX_EXIT(&rx_stats_mutex);
                 }
-               dpf(("B: bogus packet from [%x,%d] nb=%d",
+               dpf(("B: bogus packet from [%x,%d] nb=%d\n",
                     from.sin_addr.s_addr, from.sin_port, nbytes));
            }
            return -1;
@@ -1177,9 +1166,7 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
            *port = from.sin_port;
            if (p->header.type > 0 && p->header.type < RX_N_PACKET_TYPES) {
                 if (rx_stats_active) {
-                    MUTEX_ENTER(&rx_stats_mutex);
-                    rx_stats.packetsRead[p->header.type - 1]++;
-                    MUTEX_EXIT(&rx_stats_mutex);
+                    rx_atomic_inc(&rx_stats.packetsRead[p->header.type - 1]);
                 }
            }
 
@@ -1193,7 +1180,7 @@ rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, int *port)
        return code;
 }
 
-/* rxk_Listener() 
+/* rxk_Listener()
  *
  * Listen for packets on socket. This thread is typically started after
  * rx_Init has called rxi_StartListener(), but nevertheless, ensures that
@@ -1212,27 +1199,8 @@ int rxk_ListenerPid;             /* Used to signal process to wakeup at shutdown */
 struct task_struct *rxk_ListenerTask;
 #endif
 
-#ifdef AFS_SUN5_ENV
-/*
- * Run the listener as a kernel thread.
- */
-void
-rxk_Listener(void)
-{
-    extern id_t syscid;
-    void rxk_ListenerProc(void);
-    if (thread_create
-       (NULL, DEFAULTSTKSZ, rxk_ListenerProc, 0, 0, &p0, TS_RUN,
-        minclsyspri) == NULL)
-       osi_Panic("rxk_Listener: failed to start listener thread!\n");
-}
-
-void
-rxk_ListenerProc(void)
-#else /* AFS_SUN5_ENV */
 void
 rxk_Listener(void)
-#endif                         /* AFS_SUN5_ENV */
 {
     struct rx_packet *rxp = NULL;
     int code;
@@ -1253,10 +1221,13 @@ rxk_Listener(void)
 #elif defined(AFS_DARWIN_ENV)
     rxk_ListenerPid = current_proc()->p_pid;
 #endif
-#if defined(RX_ENABLE_LOCKS) && !defined(AFS_SUN5_ENV)
+#ifdef RX_ENABLE_LOCKS
     AFS_GUNLOCK();
-#endif /* RX_ENABLE_LOCKS && !AFS_SUN5_ENV */
+#endif /* RX_ENABLE_LOCKS */
     while (afs_termState != AFSOP_STOP_RXK_LISTENER) {
+        /* See if a check for additional packets was issued */
+        rx_CheckPackets();
+
        if (rxp) {
            rxi_RestoreDataBufs(rxp);
        } else {
@@ -1285,12 +1256,9 @@ rxk_Listener(void)
     rxk_ListenerTask = 0;
     osi_rxWakeup(&rxk_ListenerTask);
 #endif
-#if defined(AFS_SUN5_ENV)
+#if defined(AFS_SUN5_ENV) || defined(AFS_FBSD_ENV)
     osi_rxWakeup(&rxk_ListenerPid);
 #endif
-#ifdef AFS_SUN5_ENV
-    AFS_GUNLOCK();
-#endif /* AFS_SUN5_ENV */
 }
 
 #if !defined(AFS_LINUX20_ENV) && !defined(AFS_SUN5_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_XBSD_ENV)
@@ -1344,7 +1312,7 @@ osi_Panic(char *msg, ...)
     va_start(ap, msg);
     vsnprintf(buf, sizeof(buf), msg, ap);
     va_end(ap);
-    printf(buf);
+    printf("%s", buf);
     panic(buf);
 #else
     va_list ap;
@@ -1355,7 +1323,7 @@ osi_Panic(char *msg, ...)
     vprintf(msg, ap);
     va_end(ap);
 # ifdef AFS_LINUX20_ENV
-    * ((char *) 0) = 0; 
+    * ((char *) 0) = 0;
 # else
     panic(msg);
 # endif