]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/IOPerfControl.cpp
xnu-4903.270.47.tar.gz
[apple/xnu.git] / iokit / Kernel / IOPerfControl.cpp
index e5ece3480524b95d31bf5a100b8b338d5edb2f73..f90699c34774610f7d08093d1272caab54909b36 100644 (file)
 #define super OSObject
 OSDefineMetaClassAndStructors(IOPerfControlClient, OSObject);
 
-bool IOPerfControlClient::init(IOService *driver, uint64_t maxWorkCapacity)
+bool
+IOPerfControlClient::init(IOService *driver, uint64_t maxWorkCapacity)
 {
-    if (!super::init())
-        return false;
-
-    interface = PerfControllerInterface{
-        .version = 0,
-        .registerDevice =
-            [](IOService *device) {
-                return kIOReturnSuccess;
-            },
-        .unregisterDevice =
-            [](IOService *device) {
-                return kIOReturnSuccess;
-            },
-        .workCanSubmit =
-            [](IOService *device, PerfControllerInterface::WorkState *state, WorkSubmitArgs *args) {
-                return false;
-            },
-        .workSubmit =
-            [](IOService *device, uint64_t token, PerfControllerInterface::WorkState *state, WorkSubmitArgs *args) {
-            },
-        .workBegin =
-            [](IOService *device, uint64_t token, PerfControllerInterface::WorkState *state, WorkBeginArgs *args) {
-            },
-        .workEnd =
-            [](IOService *device, uint64_t token, PerfControllerInterface::WorkState *state, WorkEndArgs *args, bool done) {
-            },
-    };
-
-    interfaceLock = IOLockAlloc();
-    if (!interfaceLock)
-        goto error;
-
-    deviceRegistrationList = OSSet::withCapacity(4);
-    if (!deviceRegistrationList)
-        goto error;
-
-    bzero(workTable, sizeof(workTable));
-    memset(&workTable[kIOPerfControlClientWorkUntracked], ~0, sizeof(WorkTableEntry));
-    workTableNextIndex = kIOPerfControlClientWorkUntracked + 1;
-
-    workTableLock = IOSimpleLockAlloc();
-    if (!workTableLock)
-        goto error;
-
-    // TODO: check sum(maxWorkCapacities) < table size
-
-    return true;
+       if (!super::init()) {
+               return false;
+       }
+
+       interface = PerfControllerInterface{
+               .version = 0,
+               .registerDevice =
+                   [](IOService *device) {
+                           return kIOReturnSuccess;
+                   },
+               .unregisterDevice =
+                   [](IOService *device) {
+                           return kIOReturnSuccess;
+                   },
+               .workCanSubmit =
+                   [](IOService *device, PerfControllerInterface::WorkState *state, WorkSubmitArgs *args) {
+                           return false;
+                   },
+               .workSubmit =
+                   [](IOService *device, uint64_t token, PerfControllerInterface::WorkState *state, WorkSubmitArgs *args) {
+                   },
+               .workBegin =
+                   [](IOService *device, uint64_t token, PerfControllerInterface::WorkState *state, WorkBeginArgs *args) {
+                   },
+               .workEnd =
+                   [](IOService *device, uint64_t token, PerfControllerInterface::WorkState *state, WorkEndArgs *args, bool done) {
+                   },
+       };
+
+       interfaceLock = IOLockAlloc();
+       if (!interfaceLock) {
+               goto error;
+       }
+
+       deviceRegistrationList = OSSet::withCapacity(4);
+       if (!deviceRegistrationList) {
+               goto error;
+       }
+
+       bzero(workTable, sizeof(workTable));
+       memset(&workTable[kIOPerfControlClientWorkUntracked], ~0, sizeof(WorkTableEntry));
+       workTableNextIndex = kIOPerfControlClientWorkUntracked + 1;
+
+       workTableLock = IOSimpleLockAlloc();
+       if (!workTableLock) {
+               goto error;
+       }
+
+       // TODO: check sum(maxWorkCapacities) < table size
+
+       return true;
 
 error:
-    if (interfaceLock)
-        IOLockFree(interfaceLock);
-    if (deviceRegistrationList)
-        deviceRegistrationList->release();
-    if (workTableLock)
-        IOSimpleLockFree(workTableLock);
-    return false;
+       if (interfaceLock) {
+               IOLockFree(interfaceLock);
+       }
+       if (deviceRegistrationList) {
+               deviceRegistrationList->release();
+       }
+       if (workTableLock) {
+               IOSimpleLockFree(workTableLock);
+       }
+       return false;
 }
 
 IOPerfControlClient *_Atomic gSharedClient = nullptr;
 
-IOPerfControlClient *IOPerfControlClient::copyClient(IOService *driver, uint64_t maxWorkCapacity)
+IOPerfControlClient *
+IOPerfControlClient::copyClient(IOService *driver, uint64_t maxWorkCapacity)
 {
-    IOPerfControlClient *client = atomic_load_explicit(&gSharedClient, memory_order_acquire);
-    if (client == nullptr) {
-        IOPerfControlClient *expected = client;
-        client = new IOPerfControlClient;
-        if (!client || !client->init(driver, maxWorkCapacity))
-            panic("could not create IOPerfControlClient");
-        if (!atomic_compare_exchange_strong_explicit(&gSharedClient, &expected, client, memory_order_acq_rel,
-                                                     memory_order_acquire)) {
-            client->release();
-            client = expected;
-        }
-    }
-    // TODO: add maxWorkCapacity to existing client
-    client->retain();
-    return client;
+       IOPerfControlClient *client = atomic_load_explicit(&gSharedClient, memory_order_acquire);
+       if (client == nullptr) {
+               IOPerfControlClient *expected = client;
+               client = new IOPerfControlClient;
+               if (!client || !client->init(driver, maxWorkCapacity)) {
+                       panic("could not create IOPerfControlClient");
+               }
+               if (!atomic_compare_exchange_strong_explicit(&gSharedClient, &expected, client, memory_order_acq_rel,
+                   memory_order_acquire)) {
+                       client->release();
+                       client = expected;
+               }
+       }
+       // TODO: add maxWorkCapacity to existing client
+       client->retain();
+       return client;
 }
 
-uint64_t IOPerfControlClient::allocateToken(thread_group *thread_group)
+uint64_t
+IOPerfControlClient::allocateToken(thread_group *thread_group)
 {
-    uint64_t token = kIOPerfControlClientWorkUntracked;
+       uint64_t token = kIOPerfControlClientWorkUntracked;
 
 
-    return token;
+       return token;
 }
 
-void IOPerfControlClient::deallocateToken(uint64_t token)
+void
+IOPerfControlClient::deallocateToken(uint64_t token)
 {
 }
 
-bool IOPerfControlClient::getEntryForToken(uint64_t token, IOPerfControlClient::WorkTableEntry &entry)
+bool
+IOPerfControlClient::getEntryForToken(uint64_t token, IOPerfControlClient::WorkTableEntry &entry)
 {
-    if (token == kIOPerfControlClientWorkUntracked)
-        return false;
-
-    if (token >= kWorkTableNumEntries)
-        panic("Invalid work token (%llu): index out of bounds.", token);
-
-    entry = workTable[token];
-    auto *thread_group = entry.thread_group;
-    assertf(thread_group, "Invalid work token: %llu", token);
-    return thread_group != nullptr;
+       if (token == kIOPerfControlClientWorkUntracked) {
+               return false;
+       }
+
+       if (token >= kWorkTableNumEntries) {
+               panic("Invalid work token (%llu): index out of bounds.", token);
+       }
+
+       entry = workTable[token];
+       auto *thread_group = entry.thread_group;
+       assertf(thread_group, "Invalid work token: %llu", token);
+       return thread_group != nullptr;
 }
 
-void IOPerfControlClient::markEntryStarted(uint64_t token, bool started)
+void
+IOPerfControlClient::markEntryStarted(uint64_t token, bool started)
 {
-    if (token == kIOPerfControlClientWorkUntracked)
-        return;
+       if (token == kIOPerfControlClientWorkUntracked) {
+               return;
+       }
 
-    if (token >= kWorkTableNumEntries)
-        panic("Invalid work token (%llu): index out of bounds.", token);
+       if (token >= kWorkTableNumEntries) {
+               panic("Invalid work token (%llu): index out of bounds.", token);
+       }
 
-    workTable[token].started = started;
+       workTable[token].started = started;
 }
 
-IOReturn IOPerfControlClient::registerDevice(__unused IOService *driver, IOService *device)
+IOReturn
+IOPerfControlClient::registerDevice(__unused IOService *driver, IOService *device)
 {
-    IOReturn ret = kIOReturnSuccess;
+       IOReturn ret = kIOReturnSuccess;
 
-    IOLockLock(interfaceLock);
+       IOLockLock(interfaceLock);
 
-    if (interface.version > 0)
-        ret = interface.registerDevice(device);
-    else
-        deviceRegistrationList->setObject(device);
+       if (interface.version > 0) {
+               ret = interface.registerDevice(device);
+       } else {
+               deviceRegistrationList->setObject(device);
+       }
 
-    IOLockUnlock(interfaceLock);
+       IOLockUnlock(interfaceLock);
 
-    return ret;
+       return ret;
 }
 
-void IOPerfControlClient::unregisterDevice(__unused IOService *driver, IOService *device)
+void
+IOPerfControlClient::unregisterDevice(__unused IOService *driver, IOService *device)
 {
-    IOLockLock(interfaceLock);
+       IOLockLock(interfaceLock);
 
-    if (interface.version > 0)
-        interface.unregisterDevice(device);
-    else
-        deviceRegistrationList->removeObject(device);
+       if (interface.version > 0) {
+               interface.unregisterDevice(device);
+       } else {
+               deviceRegistrationList->removeObject(device);
+       }
 
-    IOLockUnlock(interfaceLock);
+       IOLockUnlock(interfaceLock);
 }
 
-uint64_t IOPerfControlClient::workSubmit(IOService *device, WorkSubmitArgs *args)
+uint64_t
+IOPerfControlClient::workSubmit(IOService *device, WorkSubmitArgs *args)
 {
-    return kIOPerfControlClientWorkUntracked;
+       return kIOPerfControlClientWorkUntracked;
 }
 
-uint64_t IOPerfControlClient::workSubmitAndBegin(IOService *device, WorkSubmitArgs *submitArgs, WorkBeginArgs *beginArgs)
+uint64_t
+IOPerfControlClient::workSubmitAndBegin(IOService *device, WorkSubmitArgs *submitArgs, WorkBeginArgs *beginArgs)
 {
-    return kIOPerfControlClientWorkUntracked;
+       return kIOPerfControlClientWorkUntracked;
 }
 
-void IOPerfControlClient::workBegin(IOService *device, uint64_t token, WorkBeginArgs *args)
+void
+IOPerfControlClient::workBegin(IOService *device, uint64_t token, WorkBeginArgs *args)
 {
 }
 
-void IOPerfControlClient::workEnd(IOService *device, uint64_t token, WorkEndArgs *args, bool done)
+void
+IOPerfControlClient::workEnd(IOService *device, uint64_t token, WorkEndArgs *args, bool done)
 {
 }
 
-IOReturn IOPerfControlClient::registerPerformanceController(PerfControllerInterface pci)
+IOReturn
+IOPerfControlClient::registerPerformanceController(PerfControllerInterface pci)
 {
-    IOReturn result = kIOReturnError;
+       IOReturn result = kIOReturnError;
 
-    IOLockLock(interfaceLock);
+       IOLockLock(interfaceLock);
 
-    if (interface.version == 0 && pci.version > 0) {
-        assert(pci.registerDevice && pci.unregisterDevice && pci.workCanSubmit && pci.workSubmit && pci.workBegin && pci.workEnd);
-        result = kIOReturnSuccess;
+       if (interface.version == 0 && pci.version > 0) {
+               assert(pci.registerDevice && pci.unregisterDevice && pci.workCanSubmit && pci.workSubmit && pci.workBegin && pci.workEnd);
+               result = kIOReturnSuccess;
 
-        OSObject *obj;
-        while ((obj = deviceRegistrationList->getAnyObject())) {
-            IOService *device = OSDynamicCast(IOService, obj);
-            if (device)
-                pci.registerDevice(device);
-            deviceRegistrationList->removeObject(obj);
-        }
+               OSObject *obj;
+               while ((obj = deviceRegistrationList->getAnyObject())) {
+                       IOService *device = OSDynamicCast(IOService, obj);
+                       if (device) {
+                               pci.registerDevice(device);
+                       }
+                       deviceRegistrationList->removeObject(obj);
+               }
 
-        interface = pci;
-    }
+               interface = pci;
+       }
 
-    IOLockUnlock(interfaceLock);
+       IOLockUnlock(interfaceLock);
 
-    return result;
+       return result;
 }