Merge "ui: Add a command to show uninterruptible thread count" into main
diff --git a/src/trace_processor/perfetto_sql/stdlib/sched/thread_level_parallelism.sql b/src/trace_processor/perfetto_sql/stdlib/sched/thread_level_parallelism.sql
index e7081ee..50331e6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/sched/thread_level_parallelism.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/sched/thread_level_parallelism.sql
@@ -37,6 +37,24 @@
 FROM intervals_overlap_count!(runnable, ts, dur)
 ORDER BY ts;
 
+-- The count of threads in uninterruptible sleep over time.
+CREATE PERFETTO TABLE sched_uninterruptible_sleep_thread_count(
+  -- Timestamp when the thread count changed to the current value.
+  ts INT,
+  -- Number of threads in uninterrutible sleep, covering the range from this timestamp to the
+  -- next row's timestamp.
+  uninterruptible_sleep_thread_count INT
+) AS
+WITH
+uninterruptible_sleep AS (
+  SELECT ts, dur FROM thread_state
+  where state = 'D'
+)
+SELECT
+  ts, value as uninterruptible_sleep_thread_count
+FROM intervals_overlap_count!(uninterruptible_sleep, ts, dur)
+ORDER BY ts;
+
 -- The count of active CPUs over time.
 CREATE PERFETTO TABLE sched_active_cpu_count(
   -- Timestamp when the number of active CPU changed.
diff --git a/ui/src/plugins/dev.perfetto.Sched/index.ts b/ui/src/plugins/dev.perfetto.Sched/index.ts
index a72c0f3..68d3d0b 100644
--- a/ui/src/plugins/dev.perfetto.Sched/index.ts
+++ b/ui/src/plugins/dev.perfetto.Sched/index.ts
@@ -17,7 +17,10 @@
 import {Trace} from '../../public/trace';
 import {PerfettoPlugin} from '../../public/plugin';
 import {ActiveCPUCountTrack, CPUType} from './active_cpu_count';
-import {RunnableThreadCountTrack} from './runnable_thread_count';
+import {
+  RunnableThreadCountTrack,
+  UninterruptibleSleepThreadCountTrack,
+} from './thread_count';
 import {getSchedTable} from './table';
 import {extensions} from '../../public/lib/extensions';
 
@@ -40,6 +43,26 @@
         addPinnedTrack(ctx, runnableThreadCountUri, 'Runnable thread count'),
     });
 
+    const uninterruptibleSleepThreadCountUri = `/uninterruptible_sleep_thread_count`;
+    ctx.tracks.registerTrack({
+      uri: uninterruptibleSleepThreadCountUri,
+      title: 'Uninterruptible Sleep thread count',
+      track: new UninterruptibleSleepThreadCountTrack({
+        trace: ctx,
+        uri: uninterruptibleSleepThreadCountUri,
+      }),
+    });
+    ctx.commands.registerCommand({
+      id: 'dev.perfetto.Sched.AddUninterruptibleSleepThreadCountTrackCommand',
+      name: 'Add track: uninterruptible sleep thread count',
+      callback: () =>
+        addPinnedTrack(
+          ctx,
+          uninterruptibleSleepThreadCountUri,
+          'Uninterruptible Sleep thread count',
+        ),
+    });
+
     const uri = uriForActiveCPUCountTrack();
     const title = 'Active CPU count';
     ctx.tracks.registerTrack({
diff --git a/ui/src/plugins/dev.perfetto.Sched/runnable_thread_count.ts b/ui/src/plugins/dev.perfetto.Sched/thread_count.ts
similarity index 77%
rename from ui/src/plugins/dev.perfetto.Sched/runnable_thread_count.ts
rename to ui/src/plugins/dev.perfetto.Sched/thread_count.ts
index 9b5e9c5..88fe892 100644
--- a/ui/src/plugins/dev.perfetto.Sched/runnable_thread_count.ts
+++ b/ui/src/plugins/dev.perfetto.Sched/thread_count.ts
@@ -18,7 +18,7 @@
 } from '../../frontend/base_counter_track';
 import {NewTrackArgs} from '../../frontend/track';
 
-export class RunnableThreadCountTrack extends BaseCounterTrack {
+abstract class ThreadCountTrack extends BaseCounterTrack {
   constructor(args: NewTrackArgs) {
     super(args);
   }
@@ -35,7 +35,9 @@
       `INCLUDE PERFETTO MODULE sched.thread_level_parallelism`,
     );
   }
+}
 
+export class RunnableThreadCountTrack extends ThreadCountTrack {
   getSqlSource() {
     return `
       select
@@ -45,3 +47,14 @@
     `;
   }
 }
+
+export class UninterruptibleSleepThreadCountTrack extends ThreadCountTrack {
+  getSqlSource() {
+    return `
+      select
+        ts,
+        uninterruptible_sleep_thread_count as value
+      from sched_uninterruptible_sleep_thread_count
+    `;
+  }
+}