Hi,

Convert struct pkpcb malloc(9) to pool_get(9).  PCB for pfkey is
only used in process context, so pass PR_WAITOK to pool_init(9).
The possible sleep in pool_put(9) should not hurt, as pfkeyv2_detach()
is only called by soclose(9).

ok?

bluhm

Index: net/pfkeyv2.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/pfkeyv2.c,v
retrieving revision 1.197
diff -u -p -r1.197 pfkeyv2.c
--- net/pfkeyv2.c       4 Feb 2019 21:40:52 -0000       1.197
+++ net/pfkeyv2.c       13 Jul 2019 13:59:19 -0000
@@ -129,6 +129,7 @@ extern struct pool ipsec_policy_pool;

 extern struct radix_node_head **spd_tables;

+struct pool pkpcb_pool;
 #define PFKEY_MSG_MAXSZ 4096
 const struct sockaddr pfkey_addr = { 2, PF_KEY, };
 struct domain pfkeydomain;
@@ -251,6 +252,8 @@ pfkey_init(void)
        srpl_rc_init(&pkptable.pkp_rc, keycb_ref, keycb_unref, NULL);
        rw_init(&pkptable.pkp_lk, "pfkey");
        SRPL_INIT(&pkptable.pkp_list);
+       pool_init(&pkpcb_pool, sizeof(struct pkpcb), 0,
+           IPL_NONE, PR_WAITOK, "pkpcb", NULL);
 }


@@ -266,13 +269,13 @@ pfkeyv2_attach(struct socket *so, int pr
        if ((so->so_state & SS_PRIV) == 0)
                return EACCES;

-       kp = malloc(sizeof(struct pkpcb), M_PCB, M_WAITOK | M_ZERO);
+       kp = pool_get(&pkpcb_pool, PR_WAITOK|PR_ZERO);
        so->so_pcb = kp;
        refcnt_init(&kp->kcb_refcnt);

        error = soreserve(so, PFKEYSNDQ, PFKEYRCVQ);
        if (error) {
-               free(kp, M_PCB, sizeof(struct pkpcb));
+               pool_put(&pkpcb_pool, kp);
                return (error);
        }

@@ -326,7 +329,7 @@ pfkeyv2_detach(struct socket *so)

        so->so_pcb = NULL;
        KASSERT((so->so_state & SS_NOFDREF) == 0);
-       free(kp, M_PCB, sizeof(struct pkpcb));
+       pool_put(&pkpcb_pool, kp);

        return (0);
 }

Reply via email to