svn commit: r351690 - head/libexec/rtld-elf

Brooks Davis brooks at FreeBSD.org
Mon Sep 2 08:03:29 UTC 2019


Author: brooks
Date: Mon Sep  2 08:03:29 2019
New Revision: 351690
URL: https://svnweb.freebsd.org/changeset/base/351690

Log:
  Remove remnants of optimization for > pagesize allocations.
  
  In the past, this allocator seems to have allocated things larger than
  a page seperately. Much of this code was removed at some point (perhaps
  along with sbrk() used) so remove the rest. Instead, keep allocating in
  power-of-two bins up to FIRST_BUCKET_SIZE << (NBUCKETS - 1). If we want
  something more efficent, we should use a fancier allocator.
  
  While here, remove some vestages of sbrk() use. Most importantly, don't
  try to page align the pagepool since it's always page aligned by mmap().
  
  Reviewed by:	kib
  Obtained from:	CheriBSD
  Sponsored by:	DARPA, AFRL
  Differential Revision:	https://reviews.freebsd.org/D21453

Modified:
  head/libexec/rtld-elf/rtld_malloc.c

Modified: head/libexec/rtld-elf/rtld_malloc.c
==============================================================================
--- head/libexec/rtld-elf/rtld_malloc.c	Mon Sep  2 08:02:55 2019	(r351689)
+++ head/libexec/rtld-elf/rtld_malloc.c	Mon Sep  2 08:03:29 2019	(r351690)
@@ -89,15 +89,15 @@ static int morepages(int n);
 #define	MAGIC		0xef		/* magic # on accounting info */
 
 /*
- * nextf[i] is the pointer to the next free block of size 2^(i+3).  The
- * smallest allocatable block is 8 bytes.  The overhead information
- * precedes the data area returned to the user.
+ * nextf[i] is the pointer to the next free block of size
+ * (FIRST_BUCKET_SIZE << i).  The overhead information precedes the data
+ * area returned to the user.
  */
+#define	FIRST_BUCKET_SIZE	8
 #define	NBUCKETS 30
 static	union overhead *nextf[NBUCKETS];
 
 static	int pagesz;			/* page size */
-static	int pagebucket;			/* page size bucket */
 
 /*
  * The array of supported page sizes is provided by the user, i.e., the
@@ -112,50 +112,25 @@ __crt_malloc(size_t nbytes)
 {
 	union overhead *op;
 	int bucket;
-	ssize_t n;
 	size_t amt;
 
 	/*
-	 * First time malloc is called, setup page size and
-	 * align break pointer so all data will be page aligned.
+	 * First time malloc is called, setup page size.
 	 */
-	if (pagesz == 0) {
-		pagesz = n = pagesizes[0];
-		if (morepages(NPOOLPAGES) == 0)
-			return NULL;
-		op = (union overhead *)(pagepool_start);
-  		n = n - sizeof (*op) - ((long)op & (n - 1));
-		if (n < 0)
-			n += pagesz;
-  		if (n) {
-			pagepool_start += n;
-		}
-		bucket = 0;
-		amt = 8;
-		while ((unsigned)pagesz > amt) {
-			amt <<= 1;
-			bucket++;
-		}
-		pagebucket = bucket;
-	}
+	if (pagesz == 0)
+		pagesz = pagesizes[0];
 	/*
 	 * Convert amount of memory requested into closest block size
 	 * stored in hash buckets which satisfies request.
 	 * Account for space used per block for accounting.
 	 */
-	if (nbytes <= (unsigned long)(n = pagesz - sizeof(*op))) {
-		amt = 8;	/* size of first bucket */
-		bucket = 0;
-		n = -sizeof(*op);
-	} else {
-		amt = pagesz;
-		bucket = pagebucket;
-	}
-	while (nbytes > amt + n) {
+	amt = FIRST_BUCKET_SIZE;
+	bucket = 0;
+	while (nbytes > amt - sizeof(*op)) {
 		amt <<= 1;
-		if (amt == 0)
-			return (NULL);
 		bucket++;
+		if (amt == 0 || bucket >= NBUCKETS)
+			return (NULL);
 	}
 	/*
 	 * If nothing in hash bucket right now,
@@ -200,18 +175,12 @@ morecore(int bucket)
   	int amt;			/* amount to allocate */
   	int nblks;			/* how many blocks we get */
 
-	/*
-	 * sbrk_size <= 0 only for big, FLUFFY, requests (about
-	 * 2^30 bytes on a VAX, I think) or for a negative arg.
-	 */
-	if ((unsigned)bucket >= NBBY * sizeof(int) - 4)
-		return;
-	sz = 1 << (bucket + 3);
+	sz = FIRST_BUCKET_SIZE << bucket;
 	if (sz < pagesz) {
 		amt = pagesz;
   		nblks = amt / sz;
 	} else {
-		amt = sz + pagesz;
+		amt = sz;
 		nblks = 1;
 	}
 	if (amt > pagepool_end - pagepool_start)


More information about the svn-src-all mailing list