svn commit: r367626 - head/sys/geom/bde

Mateusz Guzik mjg at FreeBSD.org
Thu Nov 12 20:20:58 UTC 2020


Author: mjg
Date: Thu Nov 12 20:20:57 2020
New Revision: 367626
URL: https://svnweb.freebsd.org/changeset/base/367626

Log:
  gbde: replace malloc_last_fail with a kludge
  
  This facilitates removal of malloc_last_fail without really impacting
  anything.

Modified:
  head/sys/geom/bde/g_bde_work.c

Modified: head/sys/geom/bde/g_bde_work.c
==============================================================================
--- head/sys/geom/bde/g_bde_work.c	Thu Nov 12 20:20:43 2020	(r367625)
+++ head/sys/geom/bde/g_bde_work.c	Thu Nov 12 20:20:57 2020	(r367626)
@@ -77,6 +77,20 @@
 #include <geom/geom.h>
 #include <geom/bde/g_bde.h>
 
+/*
+ * FIXME: This used to call malloc_last_fail which in practice was almost
+ * guaranteed to return time_uptime even in face of severe memory shortage.
+ * As GBDE is the only consumer the kludge below was added to facilitate the
+ * removal with minimial changes. The code should be fixed to respond to memory
+ * pressure (e.g., by using lowmem eventhandler) instead.
+ */
+static int
+g_bde_malloc_last_fail(void)
+{
+
+	return (time_uptime);
+}
+
 static void g_bde_delete_sector(struct g_bde_softc *wp, struct g_bde_sector *sp);
 static struct g_bde_sector * g_bde_new_sector(struct g_bde_work *wp, u_int len);
 static void g_bde_release_keysector(struct g_bde_work *wp);
@@ -210,7 +224,7 @@ g_bde_get_keysector(struct g_bde_work *wp)
 	g_trace(G_T_TOPOLOGY, "g_bde_get_keysector(%p, %jd)", wp, (intmax_t)offset);
 	sc = wp->softc;
 
-	if (malloc_last_fail() < g_bde_ncache)
+	if (g_bde_malloc_last_fail() < g_bde_ncache)
 		g_bde_purge_sector(sc, -1);
 
 	sp = TAILQ_FIRST(&sc->freelist);
@@ -228,7 +242,7 @@ g_bde_get_keysector(struct g_bde_work *wp)
 		if (sp->ref == 1)
 			sp->owner = wp;
 	} else {
-		if (malloc_last_fail() < g_bde_ncache) {
+		if (g_bde_malloc_last_fail() < g_bde_ncache) {
 			TAILQ_FOREACH(sp, &sc->freelist, list)
 				if (sp->ref == 0)
 					break;
@@ -311,7 +325,7 @@ g_bde_purge_sector(struct g_bde_softc *sc, int fractio
 	if (fraction > 0)
 		n = sc->ncache / fraction + 1;
 	else 
-		n = g_bde_ncache - malloc_last_fail();
+		n = g_bde_ncache - g_bde_malloc_last_fail();
 	if (n < 0)
 		return;
 	if (n > sc->ncache)


More information about the svn-src-all mailing list