svn commit: r363706 - in head/sys: kern sys
Mateusz Guzik
mjg at FreeBSD.org
Thu Jul 30 15:47:42 UTC 2020
Author: mjg
Date: Thu Jul 30 15:47:41 2020
New Revision: 363706
URL: https://svnweb.freebsd.org/changeset/base/363706
Log:
vfs: short-circuit the common case NDFREE calls
Almost all consumers use the NDF_ONLY_PNBUF macro, making them avoidably branch
a lot in the NDFREE routine. Also note most of them should not need to call
any cleanup anyway as they don't request HASBUF.
Modified:
head/sys/kern/vfs_lookup.c
head/sys/sys/namei.h
Modified: head/sys/kern/vfs_lookup.c
==============================================================================
--- head/sys/kern/vfs_lookup.c Thu Jul 30 15:45:11 2020 (r363705)
+++ head/sys/kern/vfs_lookup.c Thu Jul 30 15:47:41 2020 (r363706)
@@ -1390,18 +1390,26 @@ NDINIT_ALL(struct nameidata *ndp, u_long op, u_long fl
* Free data allocated by namei(); see namei(9) for details.
*/
void
-NDFREE(struct nameidata *ndp, const u_int flags)
+NDFREE_PNBUF(struct nameidata *ndp)
{
+
+ if ((ndp->ni_cnd.cn_flags & HASBUF) != 0) {
+ uma_zfree(namei_zone, ndp->ni_cnd.cn_pnbuf);
+ ndp->ni_cnd.cn_flags &= ~HASBUF;
+ }
+}
+
+void
+(NDFREE)(struct nameidata *ndp, const u_int flags)
+{
int unlock_dvp;
int unlock_vp;
unlock_dvp = 0;
unlock_vp = 0;
- if (!(flags & NDF_NO_FREE_PNBUF) &&
- (ndp->ni_cnd.cn_flags & HASBUF)) {
- uma_zfree(namei_zone, ndp->ni_cnd.cn_pnbuf);
- ndp->ni_cnd.cn_flags &= ~HASBUF;
+ if (!(flags & NDF_NO_FREE_PNBUF)) {
+ NDFREE_PNBUF(ndp);
}
if (!(flags & NDF_NO_VP_UNLOCK) &&
(ndp->ni_cnd.cn_flags & LOCKLEAF) && ndp->ni_vp)
Modified: head/sys/sys/namei.h
==============================================================================
--- head/sys/sys/namei.h Thu Jul 30 15:45:11 2020 (r363705)
+++ head/sys/sys/namei.h Thu Jul 30 15:47:41 2020 (r363706)
@@ -210,7 +210,15 @@ void NDINIT_ALL(struct nameidata *ndp, u_long op, u_lo
#define NDF_NO_FREE_PNBUF 0x00000020
#define NDF_ONLY_PNBUF (~NDF_NO_FREE_PNBUF)
+void NDFREE_PNBUF(struct nameidata *);
void NDFREE(struct nameidata *, const u_int);
+#define NDFREE(ndp, flags) do { \
+ struct nameidata *_ndp = (ndp); \
+ if (__builtin_constant_p(flags) && flags == NDF_ONLY_PNBUF) \
+ NDFREE_PNBUF(_ndp); \
+ else \
+ NDFREE(_ndp, flags); \
+} while (0)
int namei(struct nameidata *ndp);
int lookup(struct nameidata *ndp);
More information about the svn-src-head
mailing list