[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.21 and 1.21.2.4

version 1.21, 1999/03/31 23:23:48 version 1.21.2.4, 1999/06/25 00:08:22
Line 73  static struct pool phpool;
Line 73  static struct pool phpool;
 int pool_inactive_time = 10;  int pool_inactive_time = 10;
   
 /* Next candidate for drainage (see pool_drain()) */  /* Next candidate for drainage (see pool_drain()) */
 static struct pool      *drainpp = NULL;  static struct pool      *drainpp;
   
   /* This spin lock protects both pool_head and drainpp. */
   struct simplelock pool_head_slock = SIMPLELOCK_INITIALIZER;
   
 struct pool_item_header {  struct pool_item_header {
         /* Page headers */          /* Page headers */
Line 254  pr_rmpage(pp, ph)
Line 257  pr_rmpage(pp, ph)
         pp->pr_npages--;          pp->pr_npages--;
         pp->pr_npagefree++;          pp->pr_npagefree++;
   
           if ((pp->pr_roflags & PR_PHINPAGE) == 0) {
                   int s;
                   LIST_REMOVE(ph, ph_hashlist);
                   s = splhigh();
                   pool_put(&phpool, ph);
                   splx(s);
           }
   
         if (pp->pr_curpage == ph) {          if (pp->pr_curpage == ph) {
                 /*                  /*
                  * Find a new non-empty page header, if any.                   * Find a new non-empty page header, if any.
Line 267  pr_rmpage(pp, ph)
Line 278  pr_rmpage(pp, ph)
   
                 pp->pr_curpage = ph;                  pp->pr_curpage = ph;
         }          }
   
         if ((pp->pr_roflags & PR_PHINPAGE) == 0) {  
                 LIST_REMOVE(ph, ph_hashlist);  
                 pool_put(&phpool, ph);  
         }  
 }  }
   
 /*  /*
Line 363  pool_init(pp, size, align, ioff, flags, 
Line 369  pool_init(pp, size, align, ioff, flags, 
         /*          /*
          * Initialize the pool structure.           * Initialize the pool structure.
          */           */
         TAILQ_INSERT_TAIL(&pool_head, pp, pr_poollist);  
         TAILQ_INIT(&pp->pr_pagelist);          TAILQ_INIT(&pp->pr_pagelist);
         pp->pr_curpage = NULL;          pp->pr_curpage = NULL;
         pp->pr_npages = 0;          pp->pr_npages = 0;
Line 451  pool_init(pp, size, align, ioff, flags, 
Line 456  pool_init(pp, size, align, ioff, flags, 
   
         /*          /*
          * Initialize private page header pool if we haven't done so yet.           * Initialize private page header pool if we haven't done so yet.
            * XXX LOCKING.
          */           */
         if (phpool.pr_size == 0) {          if (phpool.pr_size == 0) {
                 pool_init(&phpool, sizeof(struct pool_item_header), 0, 0,                  pool_init(&phpool, sizeof(struct pool_item_header), 0, 0,
                           0, "phpool", 0, 0, 0, 0);                            0, "phpool", 0, 0, 0, 0);
         }          }
   
         return;          /* Insert into the list of all pools. */
           simple_lock(&pool_head_slock);
           TAILQ_INSERT_TAIL(&pool_head, pp, pr_poollist);
           simple_unlock(&pool_head_slock);
 }  }
   
 /*  /*
Line 483  pool_destroy(pp)
Line 492  pool_destroy(pp)
                         pr_rmpage(pp, ph);                          pr_rmpage(pp, ph);
   
         /* Remove from global pool list */          /* Remove from global pool list */
           simple_lock(&pool_head_slock);
         TAILQ_REMOVE(&pool_head, pp, pr_poollist);          TAILQ_REMOVE(&pool_head, pp, pr_poollist);
           /* XXX Only clear this if we were drainpp? */
         drainpp = NULL;          drainpp = NULL;
           simple_unlock(&pool_head_slock);
   
 #ifdef POOL_DIAGNOSTIC  #ifdef POOL_DIAGNOSTIC
         if ((pp->pr_roflags & PR_LOGGING) != 0)          if ((pp->pr_roflags & PR_LOGGING) != 0)
Line 924  pool_prime_page(pp, storage)
Line 936  pool_prime_page(pp, storage)
         caddr_t cp = storage;          caddr_t cp = storage;
         unsigned int align = pp->pr_align;          unsigned int align = pp->pr_align;
         unsigned int ioff = pp->pr_itemoffset;          unsigned int ioff = pp->pr_itemoffset;
         int n;          int s, n;
   
         if ((pp->pr_roflags & PR_PHINPAGE) != 0) {          if ((pp->pr_roflags & PR_PHINPAGE) != 0) {
                 ph = (struct pool_item_header *)(cp + pp->pr_phoffset);                  ph = (struct pool_item_header *)(cp + pp->pr_phoffset);
         } else {          } else {
                   s = splhigh();
                 ph = pool_get(&phpool, PR_URGENT);                  ph = pool_get(&phpool, PR_URGENT);
                   splx(s);
                 LIST_INSERT_HEAD(&pp->pr_hashtab[PR_HASH_INDEX(pp, cp)],                  LIST_INSERT_HEAD(&pp->pr_hashtab[PR_HASH_INDEX(pp, cp)],
                                  ph, ph_hashlist);                                   ph, ph_hashlist);
         }          }
Line 1215  pool_drain(arg)
Line 1229  pool_drain(arg)
         void *arg;          void *arg;
 {  {
         struct pool *pp;          struct pool *pp;
         int s = splimp();          int s;
   
         /* XXX:lock pool head */          s = splimp();
         if (drainpp == NULL && (drainpp = TAILQ_FIRST(&pool_head)) == NULL) {          simple_lock(&pool_head_slock);
                 splx(s);  
                 return;          if (drainpp == NULL && (drainpp = TAILQ_FIRST(&pool_head)) == NULL)
         }                  goto out;
   
         pp = drainpp;          pp = drainpp;
         drainpp = TAILQ_NEXT(pp, pr_poollist);          drainpp = TAILQ_NEXT(pp, pr_poollist);
         /* XXX:unlock pool head */  
   
         pool_reclaim(pp);          pool_reclaim(pp);
   
    out:
           simple_unlock(&pool_head_slock);
         splx(s);          splx(s);
 }  }
   

Legend:
Removed from v.1.21  
changed lines
  Added in v.1.21.2.4

CVSweb <webmaster@jp.NetBSD.org>