Author: markj
Date: Tue Sep 18 17:51:45 2018
New Revision: 338755
URL: https://svnweb.freebsd.org/changeset/base/338755

Log:
  Only update the domain cursor once in keg_fetch_slab().
  
  We drop the keg lock when we go to actually allocate the slab, allowing
  other threads to advance the cursor.  This can cause us to exit the
  round-robin loop before having attempted allocations from all domains,
  resulting in a hang during a subsequent blocking allocation attempt from
  a depleted domain.
  
  Reported and tested by:       Jan Bramkamp <[email protected]>
  Reviewed by:  alc, cem
  Approved by:  re (gjb)
  Sponsored by: The FreeBSD Foundation
  Differential Revision:        https://reviews.freebsd.org/D17209

Modified:
  head/sys/vm/uma_core.c

Modified: head/sys/vm/uma_core.c
==============================================================================
--- head/sys/vm/uma_core.c      Tue Sep 18 16:57:04 2018        (r338754)
+++ head/sys/vm/uma_core.c      Tue Sep 18 17:51:45 2018        (r338755)
@@ -2698,10 +2698,8 @@ again:
                        LIST_INSERT_HEAD(&dom->ud_part_slab, slab, us_link);
                        return (slab);
                }
-               if (rr) {
-                       keg->uk_cursor = (keg->uk_cursor + 1) % vm_ndomains;
-                       domain = keg->uk_cursor;
-               }
+               if (rr)
+                       domain = (domain + 1) % vm_ndomains;
        } while (domain != start);
 
        /* Retry domain scan with blocking. */
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to