svn commit: r258497 - head/sys/vm
Alexander Motin
mav at FreeBSD.org
Sat Nov 23 13:42:56 UTC 2013
Author: mav
Date: Sat Nov 23 13:42:56 2013
New Revision: 258497
URL: http://svnweb.freebsd.org/changeset/base/258497
Log:
When purging per-CPU UMA caches do not return empty buckets into the global
full bucket cache to not trigger assertion if allocation happen before that
global cache get purged.
Modified:
head/sys/vm/uma_core.c
Modified: head/sys/vm/uma_core.c
==============================================================================
--- head/sys/vm/uma_core.c Sat Nov 23 12:17:05 2013 (r258496)
+++ head/sys/vm/uma_core.c Sat Nov 23 13:42:56 2013 (r258497)
@@ -701,25 +701,37 @@ static void
cache_drain_safe_cpu(uma_zone_t zone)
{
uma_cache_t cache;
+ uma_bucket_t b1, b2;
if (zone->uz_flags & UMA_ZFLAG_INTERNAL)
return;
+ b1 = b2 = NULL;
ZONE_LOCK(zone);
critical_enter();
cache = &zone->uz_cpu[curcpu];
if (cache->uc_allocbucket) {
- LIST_INSERT_HEAD(&zone->uz_buckets, cache->uc_allocbucket,
- ub_link);
+ if (cache->uc_allocbucket->ub_cnt != 0)
+ LIST_INSERT_HEAD(&zone->uz_buckets,
+ cache->uc_allocbucket, ub_link);
+ else
+ b1 = cache->uc_allocbucket;
cache->uc_allocbucket = NULL;
}
if (cache->uc_freebucket) {
- LIST_INSERT_HEAD(&zone->uz_buckets, cache->uc_freebucket,
- ub_link);
+ if (cache->uc_freebucket->ub_cnt != 0)
+ LIST_INSERT_HEAD(&zone->uz_buckets,
+ cache->uc_freebucket, ub_link);
+ else
+ b2 = cache->uc_freebucket;
cache->uc_freebucket = NULL;
}
critical_exit();
ZONE_UNLOCK(zone);
+ if (b1)
+ bucket_free(zone, b1, NULL);
+ if (b2)
+ bucket_free(zone, b2, NULL);
}
/*
More information about the svn-src-head
mailing list