PERFORCE change 97783 for review

John Birrell jb at FreeBSD.org
Thu May 25 01:52:27 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=97783

Change 97783 by jb at jb_freebsd2 on 2006/05/25 01:50:48

	Add a load counter that is incremented each time a linker file is
	loaded and use the incremented value to 'stamp' the linker_file
	structure so that clients can detect if the file has been
	reloaded without having to retain a lock on the structure.
	
	Add a field to the linker_file structure to track the number of
	enabled (FBT or SDT) probes and prevent the file from being unloaded
	if probes are enabled.

Affected files ...

.. //depot/projects/dtrace/src/sys/kern/kern_linker.c#9 edit
.. //depot/projects/dtrace/src/sys/sys/linker.h#7 edit

Differences ...

==== //depot/projects/dtrace/src/sys/kern/kern_linker.c#9 (text+ko) ====

@@ -77,6 +77,12 @@
 
 static struct sx kld_sx;	/* kernel linker lock */
 
+/*
+ * Load counter used by clients to determine if a linker file has been
+ * re-loaded. This counter is incremented for each file load.
+ */
+static int loadcnt;
+
 static linker_class_list_t classes;
 static linker_file_list_t linker_files;
 static int next_file_id = 1;
@@ -473,6 +479,7 @@
 	LINKER_GET_NEXT_FILE_ID(lf->id);
 	lf->ndeps = 0;
 	lf->deps = NULL;
+	lf->loadcnt = ++loadcnt;
 	STAILQ_INIT(&lf->common);
 	TAILQ_INIT(&lf->modules);
 	sx_xlock(&kld_sx);
@@ -891,6 +898,15 @@
 	lf = linker_find_file_by_id(fileid);
 	if (lf) {
 		KLD_DPF(FILE, ("kldunload: lf->userrefs=%d\n", lf->userrefs));
+
+		/* Check if there are DTrace probes enabled on this file. */
+		if (lf->nenabled > 0) {
+			printf("kldunload: attempt to unload file that has"
+			    " DTrace probes enabled\n");
+			error = EBUSY;
+			goto out;
+		}
+
 		if (lf->userrefs == 0) {
 			/*
 			 * XXX: maybe LINKER_UNLOAD_FORCE should override ?

==== //depot/projects/dtrace/src/sys/sys/linker.h#7 (text+ko) ====

@@ -84,8 +84,13 @@
     STAILQ_HEAD(, common_symbol) common; /* list of common symbols */
     TAILQ_HEAD(, module) modules;	/* modules in this file */
     TAILQ_ENTRY(linker_file) loaded;	/* preload dependency support */
+    int			loadcnt;	/* load counter value */
 
-    /* Function Boundary Tracing (FBT) fields. */
+    /*
+     * Function Boundary Tracing (FBT) or Statically Defined Tracing (SDT)
+     * fields.
+     */
+    int			nenabled;	/* number of enabled probes. */
     int			fbt_nentries;	/* number of fbt entries created. */
 };
 


More information about the p4-projects mailing list