[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.14 and 1.15

version 1.14, 1998/09/22 03:01:29 version 1.15, 1998/09/29 18:09:29
Line 428  pool_init(pp, size, align, ioff, flags, 
Line 428  pool_init(pp, size, align, ioff, flags, 
 #endif  #endif
   
         simple_lock_init(&pp->pr_lock);          simple_lock_init(&pp->pr_lock);
           lockinit(&pp->pr_resourcelock, PSWP, wchan, 0, 0);
   
         /*          /*
          * Initialize private page header pool if we haven't done so yet.           * Initialize private page header pool if we haven't done so yet.
Line 514  pool_get(pp, flags)
Line 515  pool_get(pp, flags)
          * never points at a page header which has PR_PHINPAGE set and           * never points at a page header which has PR_PHINPAGE set and
          * has no items in its bucket.           * has no items in its bucket.
          */           */
 again:          while ((ph = pp->pr_curpage) == NULL) {
         if ((ph = pp->pr_curpage) == NULL) {                  void *v;
                 void *v = (*pp->pr_alloc)(pp->pr_pagesz, flags, pp->pr_mtype);                  int lkflags = LK_EXCLUSIVE | LK_INTERLOCK |
                                 ((flags & PR_WAITOK) == 0 ? LK_NOWAIT : 0);
   
                   /* Get long-term lock on pool */
                   if (lockmgr(&pp->pr_resourcelock, lkflags, &pp->pr_lock) != 0)
                           return (NULL);
   
                   /* Check if pool became non-empty while we slept */
                   if ((ph = pp->pr_curpage) != NULL)
                           goto again;
   
                   /* Call the page back-end allocator for more memory */
                   v = (*pp->pr_alloc)(pp->pr_pagesz, flags, pp->pr_mtype);
                 if (v == NULL) {                  if (v == NULL) {
                         if (flags & PR_URGENT)                          if (flags & PR_URGENT)
                                 panic("pool_get: urgent");                                  panic("pool_get: urgent");
                         if ((flags & PR_WAITOK) == 0) {                          if ((flags & PR_WAITOK) == 0) {
                                 pp->pr_nfail++;                                  pp->pr_nfail++;
                                 simple_unlock(&pp->pr_lock);                                  lockmgr(&pp->pr_resourcelock, LK_RELEASE, NULL);
                                 return (NULL);                                  return (NULL);
                         }                          }
   
                           /*
                            * Wait for items to be returned to this pool.
                            * XXX: we actually want to wait just until
                            * the page allocator has memory again. Depending
                            * on this pool's usage, we might get stuck here
                            * for a long time.
                            */
                         pp->pr_flags |= PR_WANTED;                          pp->pr_flags |= PR_WANTED;
                         simple_unlock(&pp->pr_lock);                          lockmgr(&pp->pr_resourcelock, LK_RELEASE, NULL);
                         tsleep((caddr_t)pp, PSWP, pp->pr_wchan, 0);                          tsleep((caddr_t)pp, PSWP, pp->pr_wchan, 0);
                         simple_lock(&pp->pr_lock);                          simple_lock(&pp->pr_lock);
                 } else {                          continue;
                         pp->pr_npagealloc++;  
                         pool_prime_page(pp, v);  
                 }                  }
   
                 goto again;                  /* We have more memory; add it to the pool */
                   pp->pr_npagealloc++;
                   pool_prime_page(pp, v);
   
   again:
                   /* Re-acquire pool interlock */
                   simple_lock(&pp->pr_lock);
                   lockmgr(&pp->pr_resourcelock, LK_RELEASE, NULL);
         }          }
   
         if ((v = pi = TAILQ_FIRST(&ph->ph_itemlist)) == NULL)          if ((v = pi = TAILQ_FIRST(&ph->ph_itemlist)) == NULL)
Line 635  pool_put(pp, v)
Line 660  pool_put(pp, v)
   
         if (pp->pr_flags & PR_WANTED) {          if (pp->pr_flags & PR_WANTED) {
                 pp->pr_flags &= ~PR_WANTED;                  pp->pr_flags &= ~PR_WANTED;
                   if (ph->ph_nmissing == 0)
                           pp->pr_nidle++;
                 wakeup((caddr_t)pp);                  wakeup((caddr_t)pp);
                 simple_unlock(&pp->pr_lock);                  simple_unlock(&pp->pr_lock);
                 return;                  return;
Line 688  pool_prime(pp, n, storage)
Line 715  pool_prime(pp, n, storage)
         /* !storage && static caught below */          /* !storage && static caught below */
 #endif  #endif
   
           (void)lockmgr(&pp->pr_resourcelock, LK_EXCLUSIVE, NULL);
         newnitems = pp->pr_minitems + n;          newnitems = pp->pr_minitems + n;
         newpages =          newpages =
                 roundup(pp->pr_itemsperpage,newnitems) / pp->pr_itemsperpage                  roundup(pp->pr_itemsperpage,newnitems) / pp->pr_itemsperpage
                 - pp->pr_minpages;                  - pp->pr_minpages;
   
         simple_lock(&pp->pr_lock);  
         while (newpages-- > 0) {          while (newpages-- > 0) {
   
                 if (pp->pr_flags & PR_STATIC) {                  if (pp->pr_flags & PR_STATIC) {
Line 704  pool_prime(pp, n, storage)
Line 731  pool_prime(pp, n, storage)
                 }                  }
   
                 if (cp == NULL) {                  if (cp == NULL) {
                         simple_unlock(&pp->pr_lock);                          (void)lockmgr(&pp->pr_resourcelock, LK_RELEASE, NULL);
                         return (ENOMEM);                          return (ENOMEM);
                 }                  }
   
Line 717  pool_prime(pp, n, storage)
Line 744  pool_prime(pp, n, storage)
         if (pp->pr_minpages >= pp->pr_maxpages)          if (pp->pr_minpages >= pp->pr_maxpages)
                 pp->pr_maxpages = pp->pr_minpages + 1;  /* XXX */                  pp->pr_maxpages = pp->pr_minpages + 1;  /* XXX */
   
         simple_unlock(&pp->pr_lock);          (void)lockmgr(&pp->pr_resourcelock, LK_RELEASE, NULL);
         return (0);          return (0);
 }  }
   
Line 736  pool_prime_page(pp, storage)
Line 763  pool_prime_page(pp, storage)
         unsigned int ioff = pp->pr_itemoffset;          unsigned int ioff = pp->pr_itemoffset;
         int n;          int n;
   
           simple_lock(&pp->pr_lock);
   
         if ((pp->pr_flags & PR_PHINPAGE) != 0) {          if ((pp->pr_flags & PR_PHINPAGE) != 0) {
                 ph = (struct pool_item_header *)(cp + pp->pr_phoffset);                  ph = (struct pool_item_header *)(cp + pp->pr_phoffset);
         } else {          } else {
Line 793  pool_prime_page(pp, storage)
Line 822  pool_prime_page(pp, storage)
         if (++pp->pr_npages > pp->pr_hiwat)          if (++pp->pr_npages > pp->pr_hiwat)
                 pp->pr_hiwat = pp->pr_npages;                  pp->pr_hiwat = pp->pr_npages;
   
           simple_unlock(&pp->pr_lock);
         return (0);          return (0);
 }  }
   
Line 801  pool_setlowat(pp, n)
Line 831  pool_setlowat(pp, n)
         pool_handle_t   pp;          pool_handle_t   pp;
         int n;          int n;
 {  {
   
           (void)lockmgr(&pp->pr_resourcelock, LK_EXCLUSIVE, NULL);
         pp->pr_minitems = n;          pp->pr_minitems = n;
         if (n == 0) {          pp->pr_minpages = (n == 0)
                 pp->pr_minpages = 0;                  ? 0
                 return;                  : roundup(pp->pr_itemsperpage,n) / pp->pr_itemsperpage;
         }          (void)lockmgr(&pp->pr_resourcelock, LK_RELEASE, NULL);
         pp->pr_minpages =  
                 roundup(pp->pr_itemsperpage,n) / pp->pr_itemsperpage;  
 }  }
   
 void  void
Line 815  pool_sethiwat(pp, n)
Line 845  pool_sethiwat(pp, n)
         pool_handle_t   pp;          pool_handle_t   pp;
         int n;          int n;
 {  {
         if (n == 0) {  
                 pp->pr_maxpages = 0;          (void)lockmgr(&pp->pr_resourcelock, LK_EXCLUSIVE, NULL);
                 return;          pp->pr_maxpages = (n == 0)
         }                  ? 0
         pp->pr_maxpages =                  : roundup(pp->pr_itemsperpage,n) / pp->pr_itemsperpage;
                 roundup(pp->pr_itemsperpage,n) / pp->pr_itemsperpage;          (void)lockmgr(&pp->pr_resourcelock, LK_RELEASE, NULL);
 }  }
   
   

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.15

CVSweb <webmaster@jp.NetBSD.org>