:--=-=-=
:
: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

Reply via email to