Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Jan 2004 20:37:35 -0800 (PST)
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 44662 for review
Message-ID:  <200401020437.i024bYZU051892@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=44662

Change 44662 by sam@sam_ebb on 2004/01/01 20:36:55

	o mbuf tag inlining optimizations
	o add free method to mbuf tags for zone allocation

Affected files ...

.. //depot/projects/netperf+sockets/sys/kern/uipc_mbuf2.c#3 edit
.. //depot/projects/netperf+sockets/sys/sys/mbuf.h#5 edit

Differences ...

==== //depot/projects/netperf+sockets/sys/kern/uipc_mbuf2.c#3 (text+ko) ====

@@ -310,6 +310,17 @@
 	return n;
 }
 
+/* Free a packet tag. */
+static void
+_m_tag_free(struct m_tag *t)
+{
+#ifdef MAC
+	if (t->m_tag_id == PACKET_TAG_MACLABEL)
+		mac_destroy_mbuf_tag(t);
+#endif
+	free(t, M_PACKET_TAGS);
+}
+
 /* Get a packet tag structure along with specified data following. */
 struct m_tag *
 m_tag_alloc(u_int32_t cookie, int type, int len, int wait)
@@ -321,39 +332,11 @@
 	t = malloc(len + sizeof(struct m_tag), M_PACKET_TAGS, wait);
 	if (t == NULL)
 		return NULL;
-	t->m_tag_id = type;
-	t->m_tag_len = len;
-	t->m_tag_cookie = cookie;
+	m_tag_setup(t, cookie, type, len);
+	t->m_tag_free = _m_tag_free;
 	return t;
 }
 
-/* Free a packet tag. */
-void
-m_tag_free(struct m_tag *t)
-{
-#ifdef MAC
-	if (t->m_tag_id == PACKET_TAG_MACLABEL)
-		mac_destroy_mbuf_tag(t);
-#endif
-	free(t, M_PACKET_TAGS);
-}
-
-/* Prepend a packet tag. */
-void
-m_tag_prepend(struct mbuf *m, struct m_tag *t)
-{
-	KASSERT(m && t, ("m_tag_prepend: null argument, m %p t %p", m, t));
-	SLIST_INSERT_HEAD(&m->m_pkthdr.tags, t, m_tag_link);
-}
-
-/* Unlink a packet tag. */
-void
-m_tag_unlink(struct mbuf *m, struct m_tag *t)
-{
-	KASSERT(m && t, ("m_tag_unlink: null argument, m %p t %p", m, t));
-	SLIST_REMOVE(&m->m_pkthdr.tags, t, m_tag, m_tag_link);
-}
-
 /* Unlink and free a packet tag. */
 void
 m_tag_delete(struct mbuf *m, struct m_tag *t)
@@ -473,24 +456,3 @@
 	}
 	return 1;
 }
-
-/* Initialize tags on an mbuf. */
-void
-m_tag_init(struct mbuf *m)
-{
-	SLIST_INIT(&m->m_pkthdr.tags);
-}
-
-/* Get first tag in chain. */
-struct m_tag *
-m_tag_first(struct mbuf *m)
-{
-	return SLIST_FIRST(&m->m_pkthdr.tags);
-}
-
-/* Get next tag in chain. */
-struct m_tag *
-m_tag_next(struct mbuf *m, struct m_tag *t)
-{
-	return SLIST_NEXT(t, m_tag_link);
-}

==== //depot/projects/netperf+sockets/sys/sys/mbuf.h#5 (text+ko) ====

@@ -83,6 +83,7 @@
 	u_int16_t		m_tag_id;	/* Tag ID */
 	u_int16_t		m_tag_len;	/* Length of data */
 	u_int32_t		m_tag_cookie;	/* ABI/Module ID */
+	void			(*m_tag_free)(struct m_tag *);
 };
 
 /*
@@ -552,19 +553,82 @@
 
 /* Packet tag routines. */
 struct	m_tag 	*m_tag_alloc(u_int32_t, int, int, int);
-void		 m_tag_free(struct m_tag *);
-void		 m_tag_prepend(struct mbuf *, struct m_tag *);
-void		 m_tag_unlink(struct mbuf *, struct m_tag *);
 void		 m_tag_delete(struct mbuf *, struct m_tag *);
 void		 m_tag_delete_chain(struct mbuf *, struct m_tag *);
 struct	m_tag	*m_tag_locate(struct mbuf *, u_int32_t, int, struct m_tag *);
 struct	m_tag	*m_tag_copy(struct m_tag *, int);
 int		 m_tag_copy_chain(struct mbuf *, struct mbuf *, int);
-void		 m_tag_init(struct mbuf *);
-struct	m_tag	*m_tag_first(struct mbuf *);
-struct	m_tag	*m_tag_next(struct mbuf *, struct m_tag *);
 void		 m_tag_delete_nonpersistent(struct mbuf *);
 
+/*
+ * Initialize the list of tags associated with an mbuf.
+ */
+static __inline void
+m_tag_init(struct mbuf *m)
+{
+	SLIST_INIT(&m->m_pkthdr.tags);
+}
+
+/*
+ * Setup the contents of a tag.  Note that this does not
+ * fillin the free method; the caller is expected to do that.
+ *
+ * XXX probably should be called m_tag_init; but that was
+ * already taken.
+ */
+static __inline void
+m_tag_setup(struct m_tag *t, u_int32_t cookie, int type, int len)
+{
+	t->m_tag_id = type;
+	t->m_tag_len = len;
+	t->m_tag_cookie = cookie;
+}
+
+/*
+ * Reclaim resources associated with a tag.
+ */
+static __inline void
+m_tag_free(struct m_tag *t)
+{
+	(*t->m_tag_free)(t);
+}
+
+/*
+ * Return the first tag associated with an mbuf.
+ */
+static __inline struct m_tag *
+m_tag_first(struct mbuf *m)
+{
+	return SLIST_FIRST(&m->m_pkthdr.tags);
+}
+
+/*
+ * Return the next tag in the list of tags associated with an mbuf.
+ */
+static __inline struct m_tag *
+m_tag_next(struct mbuf *m, struct m_tag *t)
+{
+	return SLIST_NEXT(t, m_tag_link);
+}
+
+/*
+ * Prepend a tag to the list of tags associated with an mbuf.
+ */
+static __inline void
+m_tag_prepend(struct mbuf *m, struct m_tag *t)
+{
+	SLIST_INSERT_HEAD(&m->m_pkthdr.tags, t, m_tag_link);
+}
+
+/*
+ * Unlink a tag from the list of tags associated with an mbuf.
+ */
+static __inline void
+m_tag_unlink(struct mbuf *m, struct m_tag *t)
+{
+	SLIST_REMOVE(&m->m_pkthdr.tags, t, m_tag, m_tag_link);
+}
+
 /* These are for OpenBSD compatibility. */
 #define	MTAG_ABI_COMPAT		0		/* compatibility ABI */
 
@@ -577,7 +641,8 @@
 static __inline struct m_tag *
 m_tag_find(struct mbuf *m, int type, struct m_tag *start)
 {
-	return m_tag_locate(m, MTAG_ABI_COMPAT, type, start);
+	return SLIST_EMPTY(&m->m_pkthdr.tags) ?
+		NULL : m_tag_locate(m, MTAG_ABI_COMPAT, type, start);
 }
 #endif /* _KERNEL */
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200401020437.i024bYZU051892>