:--=-=-=
:
:Matt Dillon <[EMAIL PROTECTED]> writes:
:> Well, yes... that's essentially what I suggested. You didn't say
:> anything about removing the externalized inlines, which is what you
:> do in your patch. Looks like a fine patch to me.
:
:Except it didn't work. Now here's a patch that survived building a
:kernel and modules. ok?
:
:/assar
lets see.. ok, I'm going to read the patch carefully this time......
This isn't quite what I had in mind. You are still making an API
change... you are now calling zalloci() from zalloc() for non-SMP boxes.
There is no need to do that.
Instead what I would recommend is making zalloc() and zfree() real
procedures, putting them in vm_zone.c, and removing their inlines from
vm_zone.h. i.e. not have *ANY* inlines at all in vm_zone.h
Then as real procedures in vm_zone.c these functions can have the
#ifdef SMP / related code left intact.
-Matt
:
:--=-=-=
:Content-Disposition: attachment; filename=zalloc-diff
:
:Index: vm_zone.c
:===================================================================
:RCS file: /home/ncvs/src/sys/vm/vm_zone.c,v
:retrieving revision 1.35
:diff -u -w -r1.35 vm_zone.c
:--- vm_zone.c 2000/12/13 10:01:00 1.35
:+++ vm_zone.c 2000/12/27 00:59:14
:@@ -32,6 +32,59 @@
:
: static MALLOC_DEFINE(M_ZONE, "ZONE", "Zone header");
:
:+#define ZONE_ERROR_INVALID 0
:+#define ZONE_ERROR_NOTFREE 1
:+#define ZONE_ERROR_ALREADYFREE 2
:+
:+#define ZONE_ROUNDING 32
:+
:+#define ZENTRY_FREE 0x12342378
:+/*
:+ * void *zalloc(vm_zone_t zone) --
:+ * Returns an item from a specified zone.
:+ *
:+ * void zfree(vm_zone_t zone, void *item) --
:+ * Frees an item back to a specified zone.
:+ */
:+static __inline__ void *
:+_zalloc(vm_zone_t z)
:+{
:+ void *item;
:+
:+#ifdef INVARIANTS
:+ if (z == 0)
:+ zerror(ZONE_ERROR_INVALID);
:+#endif
:+
:+ if (z->zfreecnt <= z->zfreemin)
:+ return _zget(z);
:+
:+ item = z->zitems;
:+ z->zitems = ((void **) item)[0];
:+#ifdef INVARIANTS
:+ if (((void **) item)[1] != (void *) ZENTRY_FREE)
:+ zerror(ZONE_ERROR_NOTFREE);
:+ ((void **) item)[1] = 0;
:+#endif
:+
:+ z->zfreecnt--;
:+ z->znalloc++;
:+ return item;
:+}
:+
:+static __inline__ void
:+_zfree(vm_zone_t z, void *item)
:+{
:+ ((void **) item)[0] = z->zitems;
:+#ifdef INVARIANTS
:+ if (((void **) item)[1] == (void *) ZENTRY_FREE)
:+ zerror(ZONE_ERROR_ALREADYFREE);
:+ ((void **) item)[1] = (void *) ZENTRY_FREE;
:+#endif
:+ z->zitems = item;
:+ z->zfreecnt++;
:+}
:+
: /*
: * This file comprises a very simple zone allocator. This is used
: * in lieu of the malloc allocator, where needed or more optimal.
:Index: vm_zone.h
:===================================================================
:RCS file: /home/ncvs/src/sys/vm/vm_zone.h,v
:retrieving revision 1.13
:diff -u -w -r1.13 vm_zone.h
:--- vm_zone.h 1999/08/28 00:52:44 1.13
:+++ vm_zone.h 2000/12/27 00:59:14
:@@ -43,7 +43,6 @@
: struct vm_zone *znext; /* list of zones for sysctl */
: } *vm_zone_t;
:
:-
: void zerror __P((int)) __dead2;
: vm_zone_t zinit __P((char *name, int size, int nentries, int flags,
: int zalloc));
:@@ -57,77 +56,16 @@
: int nitems));
: void * _zget __P((vm_zone_t z));
:
:-#define ZONE_ERROR_INVALID 0
:-#define ZONE_ERROR_NOTFREE 1
:-#define ZONE_ERROR_ALREADYFREE 2
:-
:-#define ZONE_ROUNDING 32
:-
:-#define ZENTRY_FREE 0x12342378
:-/*
:- * void *zalloc(vm_zone_t zone) --
:- * Returns an item from a specified zone.
:- *
:- * void zfree(vm_zone_t zone, void *item) --
:- * Frees an item back to a specified zone.
:- */
:-static __inline__ void *
:-_zalloc(vm_zone_t z)
:-{
:- void *item;
:-
:-#ifdef INVARIANTS
:- if (z == 0)
:- zerror(ZONE_ERROR_INVALID);
:-#endif
:-
:- if (z->zfreecnt <= z->zfreemin)
:- return _zget(z);
:-
:- item = z->zitems;
:- z->zitems = ((void **) item)[0];
:-#ifdef INVARIANTS
:- if (((void **) item)[1] != (void *) ZENTRY_FREE)
:- zerror(ZONE_ERROR_NOTFREE);
:- ((void **) item)[1] = 0;
:-#endif
:-
:- z->zfreecnt--;
:- z->znalloc++;
:- return item;
:-}
:-
:-static __inline__ void
:-_zfree(vm_zone_t z, void *item)
:-{
:- ((void **) item)[0] = z->zitems;
:-#ifdef INVARIANTS
:- if (((void **) item)[1] == (void *) ZENTRY_FREE)
:- zerror(ZONE_ERROR_ALREADYFREE);
:- ((void **) item)[1] = (void *) ZENTRY_FREE;
:-#endif
:- z->zitems = item;
:- z->zfreecnt++;
:-}
:-
: static __inline__ void *
: zalloc(vm_zone_t z)
: {
:-#if defined(SMP)
: return zalloci(z);
:-#else
:- return _zalloc(z);
:-#endif
: }
:
: static __inline__ void
: zfree(vm_zone_t z, void *item)
: {
:-#ifdef SMP
: zfreei(z, item);
:-#else
:- _zfree(z, item);
:-#endif
: }
:
:-#endif
:+#endif /* _SYS_ZONE_H */
:
:--=-=-=--
:
:
:To Unsubscribe: send mail to [EMAIL PROTECTED]
:with "unsubscribe freebsd-current" in the body of the message
:
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message