X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/316670eb35587141e969394ae8537d66b9211e80..a39ff7e25e19b3a8c3020042a3872ca9ec9659f1:/iokit/Kernel/IOStatistics.cpp?ds=inline diff --git a/iokit/Kernel/IOStatistics.cpp b/iokit/Kernel/IOStatistics.cpp index def362e60..f3771602a 100644 --- a/iokit/Kernel/IOStatistics.cpp +++ b/iokit/Kernel/IOStatistics.cpp @@ -27,7 +27,9 @@ */ #include +#include #include +#include #include #include @@ -259,10 +261,10 @@ void IOStatistics::onKextUnload(OSKext *kext) IOWorkLoopCounter *wlc; IOUserClientProcessEntry *uce; - /* Free up the list of counters */ + /* Disconnect workloop counters; cleanup takes place in unregisterWorkLoop() */ while ((wlc = SLIST_FIRST(&found->workLoopList))) { SLIST_REMOVE_HEAD(&found->workLoopList, link); - kfree(wlc, sizeof(IOWorkLoopCounter)); + wlc->parentKext = NULL; } /* Free up the user client list */ @@ -520,8 +522,9 @@ void IOStatistics::unregisterWorkLoop(IOWorkLoopCounter *counter) } IORWLockWrite(lock); - - SLIST_REMOVE(&counter->parentKext->workLoopList, counter, IOWorkLoopCounter, link); + if (counter->parentKext) { + SLIST_REMOVE(&counter->parentKext->workLoopList, counter, IOWorkLoopCounter, link); + } kfree(counter, sizeof(IOWorkLoopCounter)); registeredWorkloops--; @@ -812,8 +815,11 @@ int IOStatistics::getUserClientStatistics(sysctl_req *req) goto exit; } - SYSCTL_IN(req, &requestedLoadTag, sizeof(requestedLoadTag)); - + error = SYSCTL_IN(req, &requestedLoadTag, sizeof(requestedLoadTag)); + if (error) { + goto exit; + } + LOG(2, "IOStatistics::getUserClientStatistics - requesting kext w/load tag: %d\n", requestedLoadTag); buffer = (char*)kalloc(calculatedSize); @@ -1213,8 +1219,13 @@ KextNode *IOStatistics::getKextNodeFromBacktrace(boolean_t write) { vm_offset_t *scanAddr = NULL; uint32_t i; KextNode *found = NULL, *ke = NULL; - - btCount = OSBacktrace(bt, btCount); + + /* + * Gathering the backtrace is a significant source of + * overhead. OSBacktrace does many safety checks that + * are not needed in this situation. + */ + btCount = backtrace((uintptr_t*)bt, btCount); if (write) { IORWLockWrite(lock);