Since we go to the trouble of compiling the kobj ops table for each class,

and cannot handle it going away, add an explicit reference to the kobj
class inside each linker class.  Without this, a class with no modules
loaded will sit with an idle refcount of 0.  Loading and unloading
a module with it causes a 0->1->0 transition which frees the ops table
and causes subsequent loads using that class to explode.  Normally, the
"kernel" module will remain forever loaded and prevent this happening, but
if you have more than one linker class active, only one owns the "kernel".

This finishes making modules work for kldload(8) on amd64.
This commit is contained in:
Peter Wemm 2004-05-17 21:24:39 +00:00
parent d88acdc34c
commit 23eb3eb66e

View File

@ -147,6 +147,7 @@ linker_add_class(linker_class_t lc)
if (linker_no_more_classes == 1)
return (EPERM);
kobj_class_compile((kobj_class_t) lc);
((kobj_class_t)lc)->refs++; /* prevent ops being freed */
TAILQ_INSERT_TAIL(&classes, lc, link);
return (0);
}