]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/kern/uipc_domain.c
xnu-7195.101.1.tar.gz
[apple/xnu.git] / bsd / kern / uipc_domain.c
index 6b798e832a63252ed94702ba98303620d7af6bf0..0a6b54ed9edfeead8993785b3d6d9de4aa0a026a 100644 (file)
@@ -100,13 +100,15 @@ static boolean_t domain_draining;
 static void domain_sched_timeout(void);
 static void domain_timeout(void *);
 
-lck_grp_t       *domain_proto_mtx_grp;
-lck_attr_t      *domain_proto_mtx_attr;
-static lck_grp_attr_t   *domain_proto_mtx_grp_attr;
-decl_lck_mtx_data(static, domain_proto_mtx);
-decl_lck_mtx_data(static, domain_timeout_mtx);
+static LCK_GRP_DECLARE(domain_proto_mtx_grp, "domain");
+static LCK_ATTR_DECLARE(domain_proto_mtx_attr, 0, 0);
+static LCK_MTX_DECLARE_ATTR(domain_proto_mtx,
+    &domain_proto_mtx_grp, &domain_proto_mtx_attr);
+static LCK_MTX_DECLARE_ATTR(domain_timeout_mtx,
+    &domain_proto_mtx_grp, &domain_proto_mtx_attr);
 
 u_int64_t _net_uptime;
+u_int64_t _net_uptime_ms;
 
 #if (DEVELOPMENT || DEBUG)
 
@@ -195,8 +197,8 @@ init_domain(struct domain *dp)
        VERIFY(dp->dom_flags & DOM_ATTACHED);
 
        if (!(dp->dom_flags & DOM_INITIALIZED)) {
-               lck_mtx_init(&dp->dom_mtx_s, domain_proto_mtx_grp,
-                   domain_proto_mtx_attr);
+               lck_mtx_init(&dp->dom_mtx_s, &domain_proto_mtx_grp,
+                   &domain_proto_mtx_attr);
                dp->dom_mtx = &dp->dom_mtx_s;
                TAILQ_INIT(&dp->dom_protosw);
                if (dp->dom_init != NULL) {
@@ -289,7 +291,7 @@ net_add_domain_old(struct domain_old *odp)
                /* NOTREACHED */
        }
 
-       dp = _MALLOC(sizeof(*dp), M_TEMP, M_WAITOK | M_ZERO);
+       dp = kheap_alloc(KHEAP_DEFAULT, sizeof(struct domain), Z_WAITOK | Z_ZERO);
        if (dp == NULL) {
                /*
                 * There is really nothing better than to panic here,
@@ -359,15 +361,15 @@ net_del_domain_old(struct domain_old *odp)
                TAILQ_FOREACH_SAFE(pp1, &dp1->dom_protosw, pr_entry, pp2) {
                        detach_proto(pp1, dp1);
                        if (pp1->pr_usrreqs->pru_flags & PRUF_OLD) {
-                               FREE(pp1->pr_usrreqs, M_TEMP);
+                               kheap_free(KHEAP_DEFAULT, pp1->pr_usrreqs, sizeof(struct pr_usrreqs));
                        }
                        if (pp1->pr_flags & PR_OLD) {
-                               FREE(pp1, M_TEMP);
+                               kheap_free(KHEAP_DEFAULT, pp1, sizeof(struct protosw));
                        }
                }
 
                detach_domain(dp1);
-               FREE(dp1, M_TEMP);
+               kheap_free(KHEAP_DEFAULT, dp1, sizeof(struct domain));
        } else {
                error = EPFNOSUPPORT;
        }
@@ -484,7 +486,8 @@ net_add_proto_old(struct protosw_old *opp, struct domain_old *odp)
                /* NOTREACHED */
        }
 
-       pru = _MALLOC(sizeof(*pru), M_TEMP, M_WAITOK | M_ZERO);
+       pru = kheap_alloc(KHEAP_DEFAULT, sizeof(struct pr_usrreqs),
+           Z_WAITOK | Z_ZERO);
        if (pru == NULL) {
                error = ENOMEM;
                goto done;
@@ -512,7 +515,7 @@ net_add_proto_old(struct protosw_old *opp, struct domain_old *odp)
        pru->pru_soreceive      = opru->pru_soreceive;
        pru->pru_sopoll         = opru->pru_sopoll;
 
-       pp = _MALLOC(sizeof(*pp), M_TEMP, M_WAITOK | M_ZERO);
+       pp = kheap_alloc(KHEAP_DEFAULT, sizeof(struct protosw), Z_WAITOK | Z_ZERO);
        if (pp == NULL) {
                error = ENOMEM;
                goto done;
@@ -558,12 +561,8 @@ done:
                    "error %d\n", __func__, odp->dom_family,
                    odp->dom_name, opp->pr_protocol, error);
 
-               if (pru != NULL) {
-                       FREE(pru, M_TEMP);
-               }
-               if (pp != NULL) {
-                       FREE(pp, M_TEMP);
-               }
+               kheap_free(KHEAP_DEFAULT, pru, sizeof(struct pr_usrreqs));
+               kheap_free(KHEAP_DEFAULT, pp, sizeof(struct protosw));
        }
 
        domain_guard_release(guard);
@@ -601,10 +600,10 @@ net_del_proto(int type, int protocol, struct domain *dp)
 
        detach_proto(pp, dp);
        if (pp->pr_usrreqs->pru_flags & PRUF_OLD) {
-               FREE(pp->pr_usrreqs, M_TEMP);
+               kheap_free(KHEAP_DEFAULT, pp->pr_usrreqs, sizeof(struct pr_usrreqs));
        }
        if (pp->pr_flags & PR_OLD) {
-               FREE(pp, M_TEMP);
+               kheap_free(KHEAP_DEFAULT, pp, sizeof(struct protosw));
        }
 
        return 0;
@@ -652,10 +651,10 @@ net_del_proto_old(int type, int protocol, struct domain_old *odp)
        }
        detach_proto(pp, dp);
        if (pp->pr_usrreqs->pru_flags & PRUF_OLD) {
-               FREE(pp->pr_usrreqs, M_TEMP);
+               kheap_free(KHEAP_DEFAULT, pp->pr_usrreqs, sizeof(struct pr_usrreqs));
        }
        if (pp->pr_flags & PR_OLD) {
-               FREE(pp, M_TEMP);
+               kheap_free(KHEAP_DEFAULT, pp, sizeof(struct protosw));
        }
 
 done:
@@ -683,15 +682,14 @@ net_drain_domains(void)
        lck_mtx_unlock(&domain_timeout_mtx);
 }
 
-#if INET6
 extern struct domain inet6domain_s;
-#endif
 #if IPSEC
 extern struct domain keydomain_s;
 #endif
 
 extern struct domain routedomain_s, ndrvdomain_s, inetdomain_s;
 extern struct domain systemdomain_s, localdomain_s;
+extern struct domain vsockdomain_s;
 
 #if MULTIPATH
 extern struct domain mpdomain_s;
@@ -736,23 +734,6 @@ domaininit(void)
        domain_guard_t guard;
 
        eventhandler_lists_ctxt_init(&protoctl_evhdlr_ctxt);
-       /*
-        * allocate lock group attribute and group for domain mutexes
-        */
-       domain_proto_mtx_grp_attr = lck_grp_attr_alloc_init();
-
-       domain_proto_mtx_grp = lck_grp_alloc_init("domain",
-           domain_proto_mtx_grp_attr);
-
-       /*
-        * allocate the lock attribute for per domain mutexes
-        */
-       domain_proto_mtx_attr = lck_attr_alloc_init();
-
-       lck_mtx_init(&domain_proto_mtx, domain_proto_mtx_grp,
-           domain_proto_mtx_attr);
-       lck_mtx_init(&domain_timeout_mtx, domain_proto_mtx_grp,
-           domain_proto_mtx_attr);
 
        guard = domain_guard_deploy();
        /*
@@ -763,9 +744,7 @@ domaininit(void)
         * dom_rtattach() called on rt_tables[].
         */
        attach_domain(&inetdomain_s);
-#if INET6
        attach_domain(&inet6domain_s);
-#endif /* INET6 */
 #if MULTIPATH
        attach_domain(&mpdomain_s);
 #endif /* MULTIPATH */
@@ -775,6 +754,7 @@ domaininit(void)
        attach_domain(&keydomain_s);
 #endif /* IPSEC */
        attach_domain(&ndrvdomain_s);
+       attach_domain(&vsockdomain_s);
        attach_domain(&routedomain_s);  /* must be last domain */
 
        /*
@@ -1003,6 +983,10 @@ net_update_uptime_with_time(const struct timeval *tvp)
        if (tvp->tv_usec > 500000) {
                _net_uptime++;
        }
+
+       /* update milliseconds variant */
+       _net_uptime_ms = (((u_int64_t)tvp->tv_sec * 1000) +
+           ((u_int64_t)tvp->tv_usec / 1000));
 }
 
 void
@@ -1026,7 +1010,7 @@ net_uptime2timeval(struct timeval *tv)
        }
 
        tv->tv_usec = 0;
-       tv->tv_sec = net_uptime();
+       tv->tv_sec = (time_t)net_uptime();
 }
 
 /*
@@ -1044,6 +1028,16 @@ net_uptime(void)
        return _net_uptime;
 }
 
+u_int64_t
+net_uptime_ms(void)
+{
+       if (_net_uptime_ms == 0) {
+               net_update_uptime();
+       }
+
+       return _net_uptime_ms;
+}
+
 void
 domain_proto_mtx_lock_assert_held(void)
 {