Convert ARP llinfo allocation to pool(9)

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Convert ARP llinfo allocation to pool(9)

Martin Pieuchot-2
Some llinfo structures might be allocated in interrupt path when
ifa_rtrequest() is called, diff below convert such allocation to
pool(9), ok?

Index: netinet/if_ether.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/if_ether.c,v
retrieving revision 1.131
diff -u -p -r1.131 if_ether.c
--- netinet/if_ether.c 12 Jul 2014 18:44:23 -0000 1.131
+++ netinet/if_ether.c 11 Aug 2014 09:26:30 -0000
@@ -50,6 +50,8 @@
 #include <sys/timeout.h>
 #include <sys/kernel.h>
 #include <sys/syslog.h>
+#include <sys/queue.h>
+#include <sys/pool.h>
 
 #include <net/if.h>
 #include <net/if_dl.h>
@@ -87,6 +89,7 @@ struct llinfo_arp *arplookup(u_int32_t,
 void in_arpinput(struct mbuf *);
 
 LIST_HEAD(, llinfo_arp) llinfo_arp;
+struct pool arp_pool; /* pool for llinfo_arp structures */
 struct ifqueue arpintrq;
 int arp_inuse, arp_allocated;
 int arp_maxtries = 5;
@@ -147,6 +150,8 @@ arp_rtrequest(int req, struct rtentry *r
  static struct timeout arptimer_to;
 
  arpinit_done = 1;
+ pool_init(&arp_pool, sizeof(struct llinfo_arp), 0, 0, 0, "arp",
+    NULL);
  IFQ_SET_MAXLEN(&arpintrq, 50); /* XXX hate magic numbers */
  /*
  * We generate expiration times from time.tv_sec
@@ -215,7 +220,7 @@ arp_rtrequest(int req, struct rtentry *r
  * Case 2:  This route may come from cloning, or a manual route
  * add with a LL address.
  */
- la = malloc(sizeof(*la), M_RTABLE, M_NOWAIT | M_ZERO);
+ la = pool_get(&arp_pool, PR_NOWAIT | PR_ZERO);
  rt->rt_llinfo = (caddr_t)la;
  if (la == NULL) {
  log(LOG_DEBUG, "%s: malloc failed\n", __func__);
@@ -271,7 +276,7 @@ arp_rtrequest(int req, struct rtentry *r
  la_hold_total--;
  m_freem(m);
  }
- free(la, M_RTABLE, 0);
+ pool_put(&arp_pool, la);
  }
 }
 

Reply | Threaded
Open this post in threaded view
|

Re: Convert ARP llinfo allocation to pool(9)

David Gwynne-5
why does it need queue.h?

the diffs ok by me.

On 11 Aug 2014, at 7:55 pm, Martin Pieuchot <[hidden email]> wrote:

> Some llinfo structures might be allocated in interrupt path when
> ifa_rtrequest() is called, diff below convert such allocation to
> pool(9), ok?
>
> Index: netinet/if_ether.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/netinet/if_ether.c,v
> retrieving revision 1.131
> diff -u -p -r1.131 if_ether.c
> --- netinet/if_ether.c 12 Jul 2014 18:44:23 -0000 1.131
> +++ netinet/if_ether.c 11 Aug 2014 09:26:30 -0000
> @@ -50,6 +50,8 @@
> #include <sys/timeout.h>
> #include <sys/kernel.h>
> #include <sys/syslog.h>
> +#include <sys/queue.h>
> +#include <sys/pool.h>
>
> #include <net/if.h>
> #include <net/if_dl.h>
> @@ -87,6 +89,7 @@ struct llinfo_arp *arplookup(u_int32_t,
> void in_arpinput(struct mbuf *);
>
> LIST_HEAD(, llinfo_arp) llinfo_arp;
> +struct pool arp_pool; /* pool for llinfo_arp structures */
> struct ifqueue arpintrq;
> int arp_inuse, arp_allocated;
> int arp_maxtries = 5;
> @@ -147,6 +150,8 @@ arp_rtrequest(int req, struct rtentry *r
> static struct timeout arptimer_to;
>
> arpinit_done = 1;
> + pool_init(&arp_pool, sizeof(struct llinfo_arp), 0, 0, 0, "arp",
> +    NULL);
> IFQ_SET_MAXLEN(&arpintrq, 50); /* XXX hate magic numbers */
> /*
> * We generate expiration times from time.tv_sec
> @@ -215,7 +220,7 @@ arp_rtrequest(int req, struct rtentry *r
> * Case 2:  This route may come from cloning, or a manual route
> * add with a LL address.
> */
> - la = malloc(sizeof(*la), M_RTABLE, M_NOWAIT | M_ZERO);
> + la = pool_get(&arp_pool, PR_NOWAIT | PR_ZERO);
> rt->rt_llinfo = (caddr_t)la;
> if (la == NULL) {
> log(LOG_DEBUG, "%s: malloc failed\n", __func__);
> @@ -271,7 +276,7 @@ arp_rtrequest(int req, struct rtentry *r
> la_hold_total--;
> m_freem(m);
> }
> - free(la, M_RTABLE, 0);
> + pool_put(&arp_pool, la);
> }
> }
>
>

Reply | Threaded
Open this post in threaded view
|

Re: Convert ARP llinfo allocation to pool(9)

Martin Pieuchot-2
On 11/08/14(Mon) 21:17, David Gwynne wrote:
> why does it need queue.h?

Because I forgot to add this include when I converted some lookups,
various functions in the file use TAILQ macros.  But sadly a lot of
MD headers include this file...