rebalance_interrupts: Change affinity ownership to system
authorEdmond Chung <edmondchung@google.com>
Wed, 18 Aug 2021 20:37:04 +0000 (13:37 -0700)
committerJan Altensen (Stricted) <info@stricted.net>
Fri, 21 Jun 2024 04:02:30 +0000 (04:02 +0000)
Bug: 196058977
Test: Check affinity file ownerships
Change-Id: I4e63d9e6574e4730c452de4e18ae4b60b4ef8c64

rebalance_interrupts/rebalance_interrupts.cpp

index b0d2f69edb450594737a848fc866fedb61cd82e6..77a0bfb0d03b845a7a6659bc3a9b2dda0aa3f71e 100644 (file)
@@ -224,6 +224,33 @@ bool RebalanceIrqs(const list<pair<string, list<string>>>& action_to_irqs) {
   return true;
 }
 
+void ChownIrqAffinity() {
+    std::unique_ptr<DIR, decltype(&closedir)> irq_dir(opendir(PROC_IRQDIR), closedir);
+    if (!irq_dir) {
+        PLOG(ERROR) << "opening dir " PROC_IRQDIR;
+        return;
+    }
+
+    struct dirent *entry;
+    while ((entry = readdir(irq_dir.get()))) {
+        // If the directory entry isn't a parsable number, skip it.
+        // . and .. get skipped here.
+        unsigned throwaway;
+        if (!ParseUint(entry->d_name, &throwaway))
+            continue;
+
+        string affinity_path(PROC_IRQDIR "/");
+        affinity_path += entry->d_name;
+        affinity_path += "/smp_affinity";
+        chown(affinity_path.c_str(), 1000, 1000);
+
+        string affinity_list_path(PROC_IRQDIR "/");
+        affinity_list_path += entry->d_name;
+        affinity_list_path += "/smp_affinity_list";
+        chown(affinity_list_path.c_str(), 1000, 1000);
+    }
+}
+
 int main(int /* argc */, char* /* argv */[]) {
   map<string, list<string>> irq_mapping;
   list<pair<string, list<string>>> action_to_irqs;
@@ -238,6 +265,10 @@ int main(int /* argc */, char* /* argv */[]) {
     return 1;
   }
 
+  // Change ownership of smp_affinity and smp_affinity_list handles
+  // from root to system.
+  ChownIrqAffinity();
+
   // Some IRQs are already assigned to a subset of cores, usually for
   // good reason (like some drivers have an IRQ per core, for per-core
   // queues.)  Find the set of IRQs that haven't been mapped to specific