Fix memory allocation warnings at shutdown
authorMarc Dionne <marc.c.dionne@gmail.com>
Sat, 31 Oct 2009 12:54:52 +0000 (08:54 -0400)
committerDerrick Brashear <shadow|account-1000005@unknown>
Mon, 2 Nov 2009 12:43:02 +0000 (04:43 -0800)
At shutdown we check for unfreed memory allocated with AllocSmallSpace
and AllocLargeSpace and complain in the syslog if there are dangling
pieces.  This patch takes care of a few cases that always showed up
as warnings, even after a simple start-stop of the client.

- The cacheInode file needs to be closed before the checks, since it
uses a large piece for its struct file.

- The ICL logging code allocates 6 small pieces that are never freed.
Add a shutdown_icl() function that releases everything.  While we're
at it, correct one place where we allocated with afs_osi_Alloc but
freed with osi_FreeSmallSpace, confusing our accounting.

Change-Id: I4c28c848f155dec9d89e6199cde34209227ca5c9
Reviewed-on: http://gerrit.openafs.org/758
Reviewed-by: Simon Wilkinson <sxw@inf.ed.ac.uk>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afs/afs_call.c
src/afs/afs_icl.c
src/afs/afs_prototypes.h

index 5c025c4..514c6c6 100644 (file)
@@ -1313,6 +1313,20 @@ afs_shutdown(void)
     shutdown_bufferpackage();
     shutdown_cache();
     shutdown_osi();
+    /*
+     * Close file only after daemons which can write to it are stopped.
+     * Need to close before the osinet shutdown to avoid failing check
+     * for dangling memory allocations.
+     */
+    if (afs_cacheInodep) {     /* memcache won't set this */
+       osi_UFSClose(afs_cacheInodep);  /* Since we always leave it open */
+       afs_cacheInodep = 0;
+    }
+    /*
+     * Shutdown the ICL logs - needed to free allocated memory space and avoid
+     * warnings from shutdown_osinet
+     */
+    shutdown_icl();
     shutdown_osinet();
     shutdown_osifile();
     shutdown_vnodeops();
@@ -1330,12 +1344,6 @@ afs_shutdown(void)
 */
     afs_warn(" ALL allocated tables\n");
 
-    /* Close file only after daemons which can write to it are stopped. */
-    if (afs_cacheInodep) {     /* memcache won't set this */
-       osi_UFSClose(afs_cacheInodep);  /* Since we always leave it open */
-       afs_cacheInodep = 0;
-    }
-
     afs_shuttingdown = 0;
 
     return;                    /* Just kill daemons for now */
index e204fe7..280810b 100644 (file)
@@ -57,6 +57,34 @@ afs_icl_Init(void)
     return 0;
 }
 
+/* Function called at shutdown - zap everything */
+int
+shutdown_icl(void)
+{
+    struct afs_icl_log *logp;
+    struct afs_icl_set *setp;
+
+    setp = afs_icl_FindSet("cm");
+    if (setp) {
+       /* Release the reference from Find, and the initial one */
+       afs_icl_SetFree(setp);
+       afs_icl_SetFree(setp);
+    }
+    setp = afs_icl_FindSet("cmlongterm");
+    if (setp) {
+       /* Release the reference from Find, and the initial one */
+       afs_icl_SetFree(setp);
+       afs_icl_SetFree(setp);
+    }
+    logp = afs_icl_FindLog("cmfx");
+    if (logp) {
+       /* Release the reference from Find, and the initial one */
+       afs_icl_LogFree(logp);
+       afs_icl_LogFree(logp);
+    }
+    return 0;
+}
+
 int
 afs_icl_InitLogs(void)
 {
@@ -1244,7 +1272,7 @@ afs_icl_CreateSetWithFlags(char *name, struct afs_icl_log *baseLogp,
     if (flags & ICL_CRSET_FLAG_PERSISTENT)
        states |= ICL_SETF_PERSISTENT;
 
-    setp = (struct afs_icl_set *)afs_osi_Alloc(sizeof(struct afs_icl_set));
+    setp = (struct afs_icl_set *)osi_AllocSmallSpace(sizeof(struct afs_icl_set));
     memset((caddr_t) setp, 0, sizeof(*setp));
     setp->refCount = 1;
     if (states & ICL_SETF_FREED)
index 6b78c7a..abde0ff 100644 (file)
@@ -338,6 +338,7 @@ extern int afs_UFSCacheStoreProc(struct rx_call *, struct osi_file *,
 /* afs_icl.c */
 extern struct afs_icl_set *afs_icl_allSets;
 extern int afs_icl_InitLogs(void);
+extern int shutdown_icl(void);
 extern int afs_icl_CreateLog(char *name, afs_int32 logSize,
                             struct afs_icl_log **outLogpp);
 extern int afs_icl_CreateLogWithFlags(char *name, afs_int32 logSize,