[BACK]Return to subr_pool.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / kern

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/kern/subr_pool.c between version 1.98 and 1.99

version 1.98, 2005/01/01 21:08:02 version 1.99, 2005/01/01 21:09:56
Line 99  static struct pool *drainpp;
Line 99  static struct pool *drainpp;
 /* This spin lock protects both pool_head and drainpp. */  /* This spin lock protects both pool_head and drainpp. */
 struct simplelock pool_head_slock = SIMPLELOCK_INITIALIZER;  struct simplelock pool_head_slock = SIMPLELOCK_INITIALIZER;
   
   typedef uint8_t pool_item_freelist_t;
   
 struct pool_item_header {  struct pool_item_header {
         /* Page headers */          /* Page headers */
         LIST_ENTRY(pool_item_header)          LIST_ENTRY(pool_item_header)
Line 117  struct pool_item_header {
Line 119  struct pool_item_header {
                 struct {                  struct {
                         uint16_t                          uint16_t
                                 phu_off;        /* start offset in page */                                  phu_off;        /* start offset in page */
                         uint16_t                          pool_item_freelist_t
                                 phu_firstfree;  /* first free item */                                  phu_firstfree;  /* first free item */
                           /*
                            * XXX it might be better to use
                            * a simple bitmap and ffs(3)
                            */
                 } phu_notouch;                  } phu_notouch;
         } ph_u;          } ph_u;
         uint16_t                ph_nmissing;    /* # of chunks in use */          uint16_t                ph_nmissing;    /* # of chunks in use */
Line 317  pr_item_notouch_index(const struct pool 
Line 323  pr_item_notouch_index(const struct pool 
         return idx;          return idx;
 }  }
   
 #define PR_FREELIST_ALIGN(p)    roundup((uintptr_t)(p), sizeof(uint16_t))  #define PR_FREELIST_ALIGN(p) \
 #define PR_FREELIST(ph) ((uint16_t *)PR_FREELIST_ALIGN((ph) + 1))          roundup((uintptr_t)(p), sizeof(pool_item_freelist_t))
 #define PR_INDEX_USED   ((uint16_t)-1)  #define PR_FREELIST(ph) ((pool_item_freelist_t *)PR_FREELIST_ALIGN((ph) + 1))
 #define PR_INDEX_EOL    ((uint16_t)-2)  #define PR_INDEX_USED   ((pool_item_freelist_t)-1)
   #define PR_INDEX_EOL    ((pool_item_freelist_t)-2)
   
 static __inline void  static __inline void
 pr_item_notouch_put(const struct pool *pp, struct pool_item_header *ph,  pr_item_notouch_put(const struct pool *pp, struct pool_item_header *ph,
     void *obj)      void *obj)
 {  {
         int idx = pr_item_notouch_index(pp, ph, obj);          int idx = pr_item_notouch_index(pp, ph, obj);
         uint16_t *freelist = PR_FREELIST(ph);          pool_item_freelist_t *freelist = PR_FREELIST(ph);
   
         KASSERT(freelist[idx] == PR_INDEX_USED);          KASSERT(freelist[idx] == PR_INDEX_USED);
         freelist[idx] = ph->ph_firstfree;          freelist[idx] = ph->ph_firstfree;
Line 338  static __inline void *
Line 345  static __inline void *
 pr_item_notouch_get(const struct pool *pp, struct pool_item_header *ph)  pr_item_notouch_get(const struct pool *pp, struct pool_item_header *ph)
 {  {
         int idx = ph->ph_firstfree;          int idx = ph->ph_firstfree;
         uint16_t *freelist = PR_FREELIST(ph);          pool_item_freelist_t *freelist = PR_FREELIST(ph);
   
         KASSERT(freelist[idx] != PR_INDEX_USED);          KASSERT(freelist[idx] != PR_INDEX_USED);
         ph->ph_firstfree = freelist[idx];          ph->ph_firstfree = freelist[idx];
Line 454  pool_init(struct pool *pp, size_t size, 
Line 461  pool_init(struct pool *pp, size_t size, 
         size_t trysize, phsize;          size_t trysize, phsize;
         int s;          int s;
   
           KASSERT((1UL << (CHAR_BIT * sizeof(pool_item_freelist_t))) - 2 >=
               PHPOOL_FREELIST_NELEM(PHPOOL_MAX - 1));
   
 #ifdef POOL_DIAGNOSTIC  #ifdef POOL_DIAGNOSTIC
         /*          /*
          * Always log if POOL_DIAGNOSTIC is defined.           * Always log if POOL_DIAGNOSTIC is defined.
Line 654  pool_init(struct pool *pp, size_t size, 
Line 664  pool_init(struct pool *pp, size_t size, 
                         sz = sizeof(struct pool_item_header);                          sz = sizeof(struct pool_item_header);
                         if (nelem) {                          if (nelem) {
                                 sz = PR_FREELIST_ALIGN(sz)                                  sz = PR_FREELIST_ALIGN(sz)
                                     + nelem * sizeof(uint16_t);                                      + nelem * sizeof(pool_item_freelist_t);
                         }                          }
                         pool_init(&phpool[idx], sz, 0, 0, 0,                          pool_init(&phpool[idx], sz, 0, 0, 0,
                             phpool_names[idx], &pool_allocator_meta);                              phpool_names[idx], &pool_allocator_meta);
Line 1280  pool_prime_page(struct pool *pp, caddr_t
Line 1290  pool_prime_page(struct pool *pp, caddr_t
         n = pp->pr_itemsperpage;          n = pp->pr_itemsperpage;
         pp->pr_nitems += n;          pp->pr_nitems += n;
   
         ph->ph_off = cp - storage;  
   
         if (pp->pr_roflags & PR_NOTOUCH) {          if (pp->pr_roflags & PR_NOTOUCH) {
                 uint16_t *freelist = PR_FREELIST(ph);                  pool_item_freelist_t *freelist = PR_FREELIST(ph);
                 int i;                  int i;
   
                   ph->ph_off = cp - storage;
                 ph->ph_firstfree = 0;                  ph->ph_firstfree = 0;
                 for (i = 0; i < n - 1; i++)                  for (i = 0; i < n - 1; i++)
                         freelist[i] = i + 1;                          freelist[i] = i + 1;

Legend:
Removed from v.1.98  
changed lines
  Added in v.1.99

CVSweb <webmaster@jp.NetBSD.org>