From nobody Sat Jul 25 18:54:12 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94C92480974 for ; Tue, 14 Jul 2026 18:36:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784054179; cv=none; b=ZrQBxGObc5AKUNlRaW3V84qdG0DddNUDS+YJzUqxHcAaDUmE93DFkAOqESbT6j9+DhMiZUxVTm/jdHZHZHINn7AZZIrn1Z5hoacqz2xwTdeDtg6WNIf2Wy46NKdhA3Hllp4Sf0fxFv9sjfyQ4UTJkNuNpR6RToWl9v0wlAmz1Ck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784054179; c=relaxed/simple; bh=gGKP4tv4QIjIygYp68CrFBwrwdUWuyWNqbiEimabSlw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cQIE7go5CSxByaXYSF9tuzX+WFrEWe37JVNEA1FNbyI7N1NnfEozMvOb8yXveM8aRzsfkP18z2o+e5b08soGAprk0wYD9VFRud2ssbLUCaDeKIfY1Z5/imhhabo4L3D9NItkfDf6u19YjX3LdDJPYwz4PQ4wmxXUQteH+mLwNt0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=lge.corp-partner.google.com; spf=pass smtp.mailfrom=lge.corp-partner.google.com; dkim=pass (2048-bit key) header.d=lge-corp-partner-google-com.20251104.gappssmtp.com header.i=@lge-corp-partner-google-com.20251104.gappssmtp.com header.b=wOxlSxx/; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=lge.corp-partner.google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lge.corp-partner.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lge-corp-partner-google-com.20251104.gappssmtp.com header.i=@lge-corp-partner-google-com.20251104.gappssmtp.com header.b="wOxlSxx/" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2cc891373e0so55809825ad.2 for ; Tue, 14 Jul 2026 11:36:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lge-corp-partner-google-com.20251104.gappssmtp.com; s=20251104; t=1784054170; x=1784658970; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=jDyjqt/1vyvDGDLS6ehPk7xiLQw9s+yJqoGEDrCqVBY=; b=wOxlSxx/HSfeTs+s4Qhgl/aPfdpGh07LR4Hi2wYA/TBSV1D54KdDpoVjIRq1Y7toTw 5cu9n6Q7m5iSN/ymgtzU7zxTY5HB6/z4lp+wZSGuLktqNwKH9Lbbo6KJ6uRsKYp710uO gAO0YMelJiKuFwzk3iPvZkDq6QF3MYbenAsyBZ2rWgx/oVDtLuFToetbaaQb7uLywDg0 w+Uj2FYXD2bxvJhuQWnkFz4hDkbFeKLLFXowBBFb/QpmsfOwsoRC8pgyHGfVam/OdIoy 8XFtpEYauiXVyTzz8tFU7192IwcLBUPb2df0pmbF5vjzFcQzc6O16kpN/a2FUuZfNeyX oi9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784054170; x=1784658970; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=jDyjqt/1vyvDGDLS6ehPk7xiLQw9s+yJqoGEDrCqVBY=; b=POb5fagsfinTH5JwAzrCaxTIh3Ygz0Vr5r/5YRF0a/Xd2lzxmC2+moRMlW5xewQWqO QcPH4vcb/y510MxyT1euYe3oFSXJOxJ25WZ7RT3ET3k0IGNm99XpBzXjrqmgJ7Gr7KWB ornaSDclDWe3PKhNl3VKbw3/bAA+TdSxYOi94gDqq6vvPxEkxTrzAu4kMoJyRSzk6Cdw TNVUlKKPsKr2GBbCl8cVFygb4YMTKzzsVDWkQridIkG4+4FWc8eO8yxtU/Rpslx784qr ZCLnla0O0yqV6dEBHYpI52lCqulpt8CEhmKJSWikiUzGev4o7hjmPJ8vOSmKjfw+QlsB xZsw== X-Forwarded-Encrypted: i=1; AHgh+Rr0gdqkyTpXuc8jXetOIfYoXpTXsanHaHht6fIT4RHg5viSWtvIEtGmUpLhEKE/x6xtCFUhdbWcC00hLJY=@vger.kernel.org X-Gm-Message-State: AOJu0YwEF5cY1Q6Gk+cZm00rjKftmELPenIoNloFmUvptQbJVbcWYuch VTH2/Fp+dkkBmTzHp/pPEVTAefygwEraKztarzY1z7vNFQjkYyoLyma+mZeGbnkl84U= X-Gm-Gg: AfdE7ckjAdJJQ8vNuTDjDzzekxxUOT13MjROYTleICzHfqTXcrKyg3Je6/KiIak+6bv pYle6QPQerZwKpMozl0B/aAQZNnCMWo4/blAt1miPCM0W8r6fpCYDKjHYpsz2ZhwcTSu48Dl7Xw J07Q2SltnXzp9jbeWUKWRRCgIJeC14/qWirJ3lFn/rBGRIy66HeSgRwr0SDCCAqemOj+8nBUHEf 5g0IBibcuy25DC47lIjjDNrOKPwsXDeAexeny+T9JlHR+XMsHgUrTsyW0LdjEjK6/cJ349Jvkkj xHwzDYIrDEG80EHvJMK+y+Cajs0QZcMUI5PPLBLQUAo0LDXsTwtz86jdg2tRn1HnFhnZA7xzKM6 jG0saBJP/yL6q7ZRst6ygO6HNP6dcksB38zn6SKgn9CynEBSC689Os7ZtpvaeuIhPivn1SiB4Ua hn1EOew/hpQIqjhzwVzFI9ObS4sk2R8dFX9Ff/JCIv4bRENoH84Ef+eKaBTY8Pq1MAAD7gLgB2B DHH06xYp/Aavy8CYrF3Yrps2P8= X-Received: by 2002:a17:902:d546:b0:2c9:cf62:6f61 with SMTP id d9443c01a7336-2ce9eac212bmr151451845ad.17.1784054169159; Tue, 14 Jul 2026 11:36:09 -0700 (PDT) Received: from trieu2-huynh-trieuhpn-ubuntu24.bee-live.svc.cluster.local ([27.122.242.65]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ccc9bdb877sm119951825ad.14.2026.07.14.11.36.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2026 11:36:08 -0700 (PDT) From: "trieu2.huynh" To: gregkh@linuxfoundation.org Cc: arve@android.com, tkjos@android.com, brauner@kernel.org, cmllamas@google.com, aliceryhl@google.com, linux-kernel@vger.kernel.org, "trieu2.huynh" Subject: [PATCH 1/2] drivers: android: binder: implement CTABS heuristic Date: Wed, 15 Jul 2026 03:35:51 +0900 Message-ID: <20260714183553.39773-2-trieu2.huynh@lge.corp-partner.google.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260714183553.39773-1-trieu2.huynh@lge.corp-partner.google.com> References: <20260714183553.39773-1-trieu2.huynh@lge.corp-partner.google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce Cluster/Topology-Aware Binder Selection (CTABS) to optimize IPC transaction dispatching. On asymmetric multi-cluster ARM64 architectures (e.g., big.LITTLE), the default binder thread selection algorithm is topology-blind. This leads to frequent cross-cluster thread wakeups, resulting in severe CPU cache misses, interconnect bottlenecks, and unnecessary cache ping-pongs. To mitigate this latency penalty, CTABS evaluates idle waiting threads based on their last-executed CPU ID and prioritizing them as follows: (*) Immediate Selection: Favors threads whose last-executed CPU matches the caller's CPU exactly, exiting the selection loop early to ensure optimal L1/L2 cache locality. (*) Cluster Match: Selects threads that ran on the same CPU cluster as the caller, maximizing local cache reuse. (*) Cross-Cluster: Falls back to any available thread across different clusters if no local affinity is found. This topology prioritization maximizes CPU cache reuse, minimizes inter- cluster snooping overhead, and significantly reduces overall transaction turnaround latency on modern multi-cluster SoCs. Signed-off-by: trieu2.huynh --- drivers/android/binder.c | 76 +++++++++++++++++++++++++++++-- drivers/android/binder_internal.h | 2 + 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 8f2ef1bd539f..2a7be45368c1 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -42,6 +42,7 @@ =20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 +#include #include #include #include @@ -52,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -65,6 +67,7 @@ #include #include #include +#include #include #include =20 @@ -624,6 +627,56 @@ binder_select_thread_ilocked(struct binder_proc *proc) return thread; } =20 +/* CTABS: topology-aware selection with low-risk load-avoidance heuristic. + * Prefer threads with score: 3 (last_cpu =3D=3D caller_cpu), + * 2 (same cluster and task_cpu =3D=3D last_cpu), 1 (same cluster), else 0. + * This uses only thread->last_cpu and task_cpu() and falls back to FIFO. + */ +static struct binder_thread * +binder_select_thread_topology_ilocked(struct binder_proc *proc, int caller= _cpu) +{ + struct binder_thread *thread, *best =3D NULL; + int caller_cluster =3D -1; + int best_score =3D -1; + + assert_spin_locked(&proc->inner_lock); + + if ((unsigned int)caller_cpu < (unsigned int)nr_cpu_ids) + caller_cluster =3D topology_cluster_id(caller_cpu); + + list_for_each_entry(thread, &proc->waiting_threads, waiting_thread_node) { + int tcpu =3D READ_ONCE(thread->last_cpu); + int score; + + /* Highest priority: exactly the same CPU */ + if (tcpu =3D=3D caller_cpu && caller_cpu >=3D 0) { + best =3D thread; + goto found_best; + } + + if (caller_cluster >=3D 0 && (unsigned int)tcpu < (unsigned int)nr_cpu_i= ds) { + /* Prefer threads that last ran on the same cluster */ + if (topology_cluster_id(tcpu) =3D=3D caller_cluster) { + score =3D 1; + goto check_score; + } + } + score =3D 0; + +check_score: + if (score > best_score) { + best_score =3D score; + best =3D thread; + } + } + +found_best: + if (best) + list_del_init(&best->waiting_thread_node); + + return best; +} + /** * binder_wakeup_thread_ilocked() - wakes up a thread for doing proc work. * @proc: process to wake up a thread in @@ -672,9 +725,12 @@ static void binder_wakeup_thread_ilocked(struct binder= _proc *proc, =20 static void binder_wakeup_proc_ilocked(struct binder_proc *proc) { - struct binder_thread *thread =3D binder_select_thread_ilocked(proc); + struct binder_thread *thread =3D + binder_select_thread_topology_ilocked(proc, raw_smp_processor_id()); + if (!thread) + thread =3D binder_select_thread_ilocked(proc); =20 - binder_wakeup_thread_ilocked(proc, thread, /* sync =3D */false); + binder_wakeup_thread_ilocked(proc, thread, /* sync =3D */false); } =20 static void binder_set_nice(long nice) @@ -2877,6 +2933,12 @@ static int binder_proc_transaction(struct binder_tra= nsaction *t, node->has_async_transaction =3D true; } =20 + /* + * Compute caller CPU before acquiring inner_lock to avoid + * doing CPU queries while holding spinlocks + */ + int caller_cpu =3D raw_smp_processor_id(); + binder_inner_proc_lock(proc); if (proc->is_frozen) { frozen =3D true; @@ -2891,8 +2953,11 @@ static int binder_proc_transaction(struct binder_tra= nsaction *t, return frozen ? BR_FROZEN_REPLY : BR_DEAD_REPLY; } =20 - if (!thread && !pending_async) - thread =3D binder_select_thread_ilocked(proc); + if (!thread && !pending_async) { + thread =3D binder_select_thread_topology_ilocked(proc, caller_cpu); + if (!thread) + thread =3D binder_select_thread_ilocked(proc); + } =20 if (thread) { binder_enqueue_thread_work_ilocked(thread, &t->work); @@ -4788,6 +4853,7 @@ static int binder_thread_read(struct binder_proc *pro= c, } =20 thread->looper &=3D ~BINDER_LOOPER_STATE_WAITING; + WRITE_ONCE(thread->last_cpu, raw_smp_processor_id()); =20 if (ret) return ret; @@ -5295,6 +5361,8 @@ static struct binder_thread *binder_get_thread_ilocke= d( thread->reply_error.work.type =3D BINDER_WORK_RETURN_ERROR; thread->reply_error.cmd =3D BR_OK; thread->ee.command =3D BR_OK; + /* CTABS: initialize last_cpu to -1 (unknown) */ + WRITE_ONCE(thread->last_cpu, -1); INIT_LIST_HEAD(&new_thread->waiting_thread_node); return thread; } diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_int= ernal.h index 342574bfd28a..d01688cf0961 100644 --- a/drivers/android/binder_internal.h +++ b/drivers/android/binder_internal.h @@ -506,6 +506,8 @@ struct binder_thread { struct binder_stats stats; atomic_t tmp_ref; bool is_dead; + /* CTABS: last CPU this thread ran on (smp_processor_id()), -1 if unknown= */ + int last_cpu; }; =20 /** --=20 2.43.0 From nobody Sat Jul 25 18:54:12 2026 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 65CAE48AE28 for ; Tue, 14 Jul 2026 18:36:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784054191; cv=none; b=du20hn1yv+9PlQ58qpeNaEJdu7YzD0n2CHwSszwDvPcP6nHUlKqTNgkAg+wcFMPllRCpaxDZGpDgLgvSoKYGz64iP4D9El5ITC0mydCNIcttDaT1209fbbBDnpmlYFDe7zitYWIax5nXaRXSeUrInZoBreNm5jAPIx3FOR+u68c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784054191; c=relaxed/simple; bh=M+THC1RGHTTWAZiMmn8faA7XxbsUWyHxGtQqNjqaxrQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pXbtBOLBDTlQX8F62bMl8Uj0nD5RiJYxqnsjt4oFTP2hCXER+sqspsUz6HdURQJtV7/+Dh0MJzfGgVLpjveQPPP/x5XojyuOjFXkzxS9ZwGYuRIajzYgg0zDxQEIwcOzhLGL1ePWHHos+ZIYX4uLsSH4p3vxNbMf3SWGYDlpZOU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=lge.corp-partner.google.com; spf=pass smtp.mailfrom=lge.corp-partner.google.com; dkim=pass (2048-bit key) header.d=lge-corp-partner-google-com.20251104.gappssmtp.com header.i=@lge-corp-partner-google-com.20251104.gappssmtp.com header.b=kk9Lowup; arc=none smtp.client-ip=209.85.214.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=lge.corp-partner.google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lge.corp-partner.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lge-corp-partner-google-com.20251104.gappssmtp.com header.i=@lge-corp-partner-google-com.20251104.gappssmtp.com header.b="kk9Lowup" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2cc61541f8cso17640925ad.0 for ; Tue, 14 Jul 2026 11:36:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lge-corp-partner-google-com.20251104.gappssmtp.com; s=20251104; t=1784054177; x=1784658977; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HOQA+qsqqG2R0NV10JI2NvOFsoOKSX6ccxgnvC0K81k=; b=kk9LowupbsrfvVDbDOev2Ve7kNHOeflP4rxDzxvIS1Wj5G6SHNzTPkB6XEcxypwmsw +F7DwsGPLbI/70jZtqmJSDzVKiv8YzkudX6H7euF7XhKskMioLMClN4/4moCJ/e6y7WQ 0/t7XUjoLtbIXxWa/aJzFtcM9P2eOdm6p0d1N42wyG5ZnySlVcVLX78raRoY8TkcNDHB dBW3eNrxOHGIAC7YjA9wurKAnDtb8S0qPMLF4aMPQ/UP5MEUBOeUq5uDS0tkwe4QzabN zYPvRS3FCR9Cd8Uk5HmQQ6kQyspvQWb1OLCAYReX972FxaZOPi659oUP74A/1rGBOOyD i8+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784054177; x=1784658977; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=HOQA+qsqqG2R0NV10JI2NvOFsoOKSX6ccxgnvC0K81k=; b=Fl93dIEv9ERSeMrokVP266rhZc5IhbKU7G4nZoUvnwOHGiBQdzM7mnXXKQjkNbCoR3 xRCtPpryDPpnwYFz9cyNC/hr5h53tA9GBp2mUjvpJRP8R5qvHrk521SiafTZltXOzhpq GL8Kc+iAUNg8Arb430I1NQJCWRYSCay0bqcvNUBhPKfH2ppWsTxqgkyvEfpNYpOqh8qj ga1SXTRDLapIEPa1yrVuAv56vMg7fK0zSuiujddJ6fhA9KIKSuo6YNPIiWNN62EqfwX7 gLv+yxo5JRgHFOe31bRk9RYJFNamyfiO6Z54ABKXpDTZykaPjTWqO81phqHFULEeQVFa n0Xg== X-Forwarded-Encrypted: i=1; AHgh+RoSMTEIgkHxCO1s9QoP9BXTYPnwVQzcmnoZPEZ61zyI6XGXbmDPLWiEyDXHjaKLQf8+ZjtGTGYTIj++EKE=@vger.kernel.org X-Gm-Message-State: AOJu0Yx3P7VzU/4EQUYvthAAo4CCgs3hRiKJAuaR68KTfCHJlFVS+HA4 RVW+1jalcpaloeo2Ng0Y43V8IUNdnajJQQ0VyG8bNkeGDQfAWkLdvtbzBRHz8/8Aick= X-Gm-Gg: AfdE7cnohneqASa+0k2w/B9JPltppSEpgjhtbIBcdXIPcvgu6YVN6/RO7MjXfjXLS9e dyNA5TTt9sb36Akaud2Rhv/J7Eq1bDjszXttmSvhJUDSi9yOFyrgKRIiKwrVMt4Is9u4m6dpc7F gQHr6M9o/Wn8L8/MEfUOE8JixJQq5UYdFH0rx0xhm7B7b0PRzHjgx75csw9ndLdjsuWdeQmTpq0 myfJA+8tcdkVKcLlnORhvLqDPVLY3yeSi4nXdGn8veAaPepI0iU8KWX7KiH/gOaVpM1T+cHVMpv FAnLpMg7YZUbOe6KXh3Bz52FNU6+z1OKCQCTJh6hzuX3kBfJEtx2u0V9OmCAeHm+6OyrfjGAJGB xLu0npkLBPMv4hfX/uIMeGQxH0itOLMs8rYZxO8LR3YA7Gtje50IwHHafIjHxO4ON6Gx1dyW50H VcSTLXklHY0PzReLe9FRwgnX3RXcs+a2DvPXahOtNNrMdlXczRGrSxmADjzJMiIypem+pVDJz8n d7QF4MgAl/ieU/h+3Lt3eviPb4= X-Received: by 2002:a17:902:d591:b0:2ce:803c:6f09 with SMTP id d9443c01a7336-2cea18327a5mr134705115ad.18.1784054177185; Tue, 14 Jul 2026 11:36:17 -0700 (PDT) Received: from trieu2-huynh-trieuhpn-ubuntu24.bee-live.svc.cluster.local ([27.122.242.65]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ccc9bdb877sm119951825ad.14.2026.07.14.11.36.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2026 11:36:16 -0700 (PDT) From: "trieu2.huynh" To: gregkh@linuxfoundation.org Cc: arve@android.com, tkjos@android.com, brauner@kernel.org, cmllamas@google.com, aliceryhl@google.com, linux-kernel@vger.kernel.org, "trieu2.huynh" Subject: [PATCH 2/2] drivers: android: binder: add preferred CPU wake-up nudge for waiting threads Date: Wed, 15 Jul 2026 03:35:52 +0900 Message-ID: <20260714183553.39773-3-trieu2.huynh@lge.corp-partner.google.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260714183553.39773-1-trieu2.huynh@lge.corp-partner.google.com> References: <20260714183553.39773-1-trieu2.huynh@lge.corp-partner.google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement a wake-up nudge mechanism that hints the scheduler to wake up the selected Binder thread on its preferred CPU. This maximizes cache locality for the incoming transaction. The preferred CPU is recorded during thread selection and stored in the thread structure. Right before waking up the thread, this value is safely injected into the task's 'wake_cpu' field. Signed-off-by: trieu2.huynh --- drivers/android/binder.c | 39 +++++++++++++++++++++++++++++-- drivers/android/binder_internal.h | 4 ++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 2a7be45368c1..580889b773b7 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -638,6 +638,7 @@ binder_select_thread_topology_ilocked(struct binder_pro= c *proc, int caller_cpu) struct binder_thread *thread, *best =3D NULL; int caller_cluster =3D -1; int best_score =3D -1; + int chosen_cpu =3D -1; =20 assert_spin_locked(&proc->inner_lock); =20 @@ -648,9 +649,14 @@ binder_select_thread_topology_ilocked(struct binder_pr= oc *proc, int caller_cpu) int tcpu =3D READ_ONCE(thread->last_cpu); int score; =20 - /* Highest priority: exactly the same CPU */ + /* Highest priority: exactly the same CPU. No wake_cpu nudge + * needed here: __set_task_cpu() already keeps task->wake_cpu + * in sync with task_cpu(p) (=3D=3D tcpu), so writing + * chosen_cpu =3D tcpu back would be a no-op. + */ if (tcpu =3D=3D caller_cpu && caller_cpu >=3D 0) { best =3D thread; + chosen_cpu =3D -1; goto found_best; } =20 @@ -667,12 +673,29 @@ binder_select_thread_topology_ilocked(struct binder_p= roc *proc, int caller_cpu) if (score > best_score) { best_score =3D score; best =3D thread; + /* Nudge toward caller_cpu (not the thread's own stale + * tcpu) so the wake_cpu hint conveys new information: + * the transaction data was just touched on caller_cpu, + * and it shares an L2/L3 with tcpu within the cluster, + * so migrating there is cheap and cache-friendly. + */ + if (score =3D=3D 1 && caller_cpu >=3D 0) { + /* Only nudge if caller_cpu is idle */ + if (available_idle_cpu(caller_cpu)) + chosen_cpu =3D caller_cpu; + else + chosen_cpu =3D -1; + } else { + chosen_cpu =3D -1; + } } } =20 found_best: - if (best) + if (best) { list_del_init(&best->waiting_thread_node); + best->preferred_cpu =3D chosen_cpu; + } =20 return best; } @@ -700,6 +723,16 @@ static void binder_wakeup_thread_ilocked(struct binder= _proc *proc, assert_spin_locked(&proc->inner_lock); =20 if (thread) { +#ifdef CONFIG_SMP + /* CTABS nudge: hint scheduler to wake thread on preferred CPU. + * This improves cache locality for the transaction. Only do + * this for sync wakeups, for oneway/async work the caller + * keeps running on caller_cpu. + */ + if (sync && thread->preferred_cpu >=3D 0 && thread->task) + WRITE_ONCE(thread->task->wake_cpu, thread->preferred_cpu); +#endif + thread->preferred_cpu =3D -1; if (sync) wake_up_interruptible_sync(&thread->wait); else @@ -5363,6 +5396,8 @@ static struct binder_thread *binder_get_thread_ilocke= d( thread->ee.command =3D BR_OK; /* CTABS: initialize last_cpu to -1 (unknown) */ WRITE_ONCE(thread->last_cpu, -1); + /* CTABS: initialize preferred_cpu to -1 (no nudge) */ + WRITE_ONCE(thread->preferred_cpu, -1); INIT_LIST_HEAD(&new_thread->waiting_thread_node); return thread; } diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_int= ernal.h index d01688cf0961..285846e6068f 100644 --- a/drivers/android/binder_internal.h +++ b/drivers/android/binder_internal.h @@ -506,8 +506,8 @@ struct binder_thread { struct binder_stats stats; atomic_t tmp_ref; bool is_dead; - /* CTABS: last CPU this thread ran on (smp_processor_id()), -1 if unknown= */ - int last_cpu; + int last_cpu; /* CTABS: last CPU this thread ran on */ + int preferred_cpu; /* CTABS: preferred CPU for wake-up nudge */ }; =20 /** --=20 2.43.0