From nobody Fri Feb 13 14:09:41 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 4821D36AE4 for ; Wed, 17 Apr 2024 19:14:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713381296; cv=none; b=qDOZX/hIf92HOLqtTRCLU5PZSaTsynF9X0HQmNV+wEV44MyRTr+fZ7aKeXyQCv2JYvoYVfjJjzX3rFHqsaCdYv43uMrnjvVuGTEdiXwl7dFi1uB+0Y385e6JRWy/g+Mgqkv+e0wNXHlb0YcFuqOQvNXxxhdond2C2/KuzyejfEM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713381296; c=relaxed/simple; bh=IKNpru5OPVki2SHKGA6nEmwCLM3XR3Z/O47OScdmKY0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=iqc2gDZt7Fd/LrU/2dhS237tQKu0nuFn2scTnP46AsMJ7V8GqMIFkQZkvqJ4KR/29bvIVyCwVmZLC/kRE0r/FhsqAi10rzyE+LcIaTKoAeXfB23QYNtwxxmn4aeJUaT4N2VP5kLpaKFcXPoW8goLgsGfkhCNv0bxPanR8YPbCOU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--cmllamas.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vyAyEgWh; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--cmllamas.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vyAyEgWh" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-5e5022b34faso38081a12.0 for ; Wed, 17 Apr 2024 12:14:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713381294; x=1713986094; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=PafBYw7ONOcmBuCbUCHZmMlU0Q7ADjoXpXWusviXFGE=; b=vyAyEgWh/9pt/YgiIDwf54idaHt1S1hYtWOkX823HBgyBMb1a2IyEfcQp/hISju0mg TgYwngD/KYgyUpvUIm7adsyg2GdCPaSTpI2VO9KsVYuorsnumqbRP0It336JE7pG6ASA idDBDDBhUdKOOSJGpJGzDN7juQW01qZ9ETtMSfHuJFMf/ri29ypM8CBcN6v6Nl+HgGzR kdWxU/5X0sZIMOMPit9uYCyAC1MhIPCCum1AdLlhsLyhqCLSIe/7vYX2nW7MFTCSX0lS gRfLCL7xRi0cBEBrgQUiL+eJGIIaQm8xWehNtVD1kBzOyqdyVhcwCyXyznsvVqJxXMAs 7lyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713381294; x=1713986094; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=PafBYw7ONOcmBuCbUCHZmMlU0Q7ADjoXpXWusviXFGE=; b=Pm7RrARFH3Vz3WlDfc3QA24Vg3fd2z0y3lSff+lhyRD2S62ZlRn1KqzAZ7Cxhqwu2E r2Qcs3kNFkT8jNIhIxLHbfLfabPlFyvs51DVsjRAvy/qgXd9kXNkPq1KGAfVYNMJ32PU 4KB6OwVwDKT7qdO/MlL3gZIIQYxaKCKLhCdnGa3a1zT9jGpXUn6j/AdJaaHJZx8vUHgx hogFnappGDbSoB3TFKoSziGAAnuRqZH7wnq3iq1YgM9U8b/6cjuYKm3QbAGEbzH+YHYU QkvR7rczWtghvVjmT24Ue49weWAdEFia3HJGUlxWwib4QIBaErjHmn066qxo8NKzZ1U3 DECA== X-Gm-Message-State: AOJu0YyuRShQc9lLvXpAYjCfUFhAgDC6d+mTN0Yi00rtCULBOl5q1JGl jsfznNEN7NSRENOdpdWwtrSxfSx+XNaaMAEX6zRx31Vcd3DhvsNbFmh+ylj7rniUlb36aEC/Cwo OAXkZSbRmOQ== X-Google-Smtp-Source: AGHT+IGtRoeqa9/s3PLrLUxy8CjokWV6b4MpFaVUxIoXCMqg3uRU+jsHFhwZ6hkIBayrQyka8srgIHmr/EALcQ== X-Received: from xllamas.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5070]) (user=cmllamas job=sendgmr) by 2002:a17:902:fa05:b0:1e7:b7c8:f79e with SMTP id la5-20020a170902fa0500b001e7b7c8f79emr6195plb.5.1713381294383; Wed, 17 Apr 2024 12:14:54 -0700 (PDT) Date: Wed, 17 Apr 2024 19:13:41 +0000 In-Reply-To: <20240417191418.1341988-1-cmllamas@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240417191418.1341988-1-cmllamas@google.com> X-Mailer: git-send-email 2.44.0.683.g7961c838ac-goog Message-ID: <20240417191418.1341988-2-cmllamas@google.com> Subject: [PATCH 1/4] binder: introduce BINDER_SET_PROC_FLAGS ioctl From: Carlos Llamas To: Greg Kroah-Hartman , "=?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?=" , Todd Kjos , Martijn Coenen , Joel Fernandes , Christian Brauner , Carlos Llamas , Suren Baghdasaryan , Alice Ryhl Cc: linux-kernel@vger.kernel.org, kernel-team@android.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This new ioctl enables userspace to control the individual behavior of the 'struct binder_proc' instance via flags. The driver validates and returns the supported subset. Some existing ioctls are migrated to use these flags in subsequent commits. Suggested-by: Arve Hj=C3=B8nnev=C3=A5g Signed-off-by: Carlos Llamas --- drivers/android/binder.c | 25 +++++++++++++++++++++++++ drivers/android/binder_internal.h | 4 +++- include/uapi/linux/android/binder.h | 6 ++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index bad28cf42010..e0d193bfb237 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -5334,6 +5334,26 @@ static int binder_ioctl_get_extended_error(struct bi= nder_thread *thread, return 0; } =20 +static int binder_ioctl_set_proc_flags(struct binder_proc *proc, + u32 __user *user) +{ + u32 flags; + + if (get_user(flags, user)) + return -EFAULT; + + binder_inner_proc_lock(proc); + flags &=3D PF_SUPPORTED_FLAGS_MASK; + proc->flags =3D flags; + binder_inner_proc_unlock(proc); + + /* confirm supported flags with user */ + if (put_user(flags, user)) + return -EFAULT; + + return 0; +} + static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned lon= g arg) { int ret; @@ -5542,6 +5562,11 @@ static long binder_ioctl(struct file *filp, unsigned= int cmd, unsigned long arg) if (ret < 0) goto err; break; + case BINDER_SET_PROC_FLAGS: + ret =3D binder_ioctl_set_proc_flags(proc, ubuf); + if (ret < 0) + goto err; + break; default: ret =3D -EINVAL; goto err; diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_int= ernal.h index 7270d4d22207..a22e64cddbae 100644 --- a/drivers/android/binder_internal.h +++ b/drivers/android/binder_internal.h @@ -346,6 +346,8 @@ struct binder_ref { * @cred struct cred associated with the `struct file` * in binder_open() * (invariant after initialized) + * @flags: enum proc_flags set via BINDER_SET_PROC_FLAGS. + * (protected by @inner_lock) * @deferred_work_node: element for binder_deferred_list * (protected by binder_deferred_lock) * @deferred_work: bitmap of deferred work to perform @@ -409,6 +411,7 @@ struct binder_proc { int pid; struct task_struct *tsk; const struct cred *cred; + u32 flags; struct hlist_node deferred_work_node; int deferred_work; int outstanding_txns; @@ -417,7 +420,6 @@ struct binder_proc { bool sync_recv; bool async_recv; wait_queue_head_t freeze_wait; - struct list_head todo; struct binder_stats stats; struct list_head delivered_death; diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/andro= id/binder.h index d44a8118b2ed..281a8e2e734e 100644 --- a/include/uapi/linux/android/binder.h +++ b/include/uapi/linux/android/binder.h @@ -251,6 +251,11 @@ struct binder_extended_error { __s32 param; }; =20 +/* Used with BINDER_SET_PROC_FLAGS ioctl */ +enum proc_flags { + PF_SUPPORTED_FLAGS_MASK, +}; + enum { BINDER_WRITE_READ =3D _IOWR('b', 1, struct binder_write_read), BINDER_SET_IDLE_TIMEOUT =3D _IOW('b', 3, __s64), @@ -266,6 +271,7 @@ enum { BINDER_GET_FROZEN_INFO =3D _IOWR('b', 15, struct binder_frozen_status_in= fo), BINDER_ENABLE_ONEWAY_SPAM_DETECTION =3D _IOW('b', 16, __u32), BINDER_GET_EXTENDED_ERROR =3D _IOWR('b', 17, struct binder_extended_error= ), + BINDER_SET_PROC_FLAGS =3D _IOWR('b', 18, __u32), }; =20 /* --=20 2.44.0.683.g7961c838ac-goog From nobody Fri Feb 13 14:09:41 2026 Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (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 034A122F19 for ; Wed, 17 Apr 2024 19:15:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713381309; cv=none; b=qYdRMrxKFCv9QJDvoCMoWFmNlNVWfrcxJwhO3BaGR0ULfeS08umCCoVFyGltMeFw85miYCz90YPkTul3z5cE73woj++ybIYLyZBuRgiZjJHaq4C+u5ZDO+kbWyhoUPa+HrYLKtemdNx6rpaml+2gZ+cNHwSFPqfu651AKKbDvS0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713381309; c=relaxed/simple; bh=9m6EeZARuCquPm7RqgMRj/Y6+Pz9ykI3aeF46NyBRd8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=EbTK6Afb5zuanFpqQXphy3mA+rn++K9Nlv+ShmldhPixjwNlnmW5akxHi1Tah0FfsCYukIDBviepIBLHJVKZwrM2XRBtMMs77+OvsFTV4YHh5Fr2ej7SYG1pEmVTkqa0aRL/gcmgQfeH6Jz4gM5h4wlBFFu016LIu9/1z0WZvX0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--cmllamas.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=AwgLfEIC; arc=none smtp.client-ip=209.85.219.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--cmllamas.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="AwgLfEIC" Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-dc3645a6790so198845276.0 for ; Wed, 17 Apr 2024 12:15:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713381307; x=1713986107; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=wtuC/jSL94p6uXVWmWyzEtwt8JX/bgW/Wy1kn2uTmbk=; b=AwgLfEICw6SectDDMYBA31zejC6ZTV59zOZQ4ohGXQ/YEi7ie6lZY0udXRjYsvwjFq MWXiOSQZVpKLYlsU6QMzGBo3BW/q7l2WokcGQrUKeHq6lDrBuZDKvqk2jvvX5CkBgPrA 9nSzFwx9pHIXAWml7fg60gY8Fhl8allqiPxw0OUnUzjFgTK0Fkwj52AC6tTUi4M1bO/5 l+OHJBesArUHUjTg+1YfH5Clf2bG/lT6Yz+pA2kl9ZjUSrzrzRDXix3Jkx2Itc2BaC+C rr5hwLUwjL15nLZtTG/IisHMyfK/KsYVBjHJhhgbE1WfXbHzgYORFFz74DatI9OHwY3q LqBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713381307; x=1713986107; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=wtuC/jSL94p6uXVWmWyzEtwt8JX/bgW/Wy1kn2uTmbk=; b=pWsSVk0KTk2YIvZYlzG8TzDZdHZxEnsgS5aFJ64TIyiflB2XS+vNoQ4jVm1CQGnbaz GRqLU3Rc5eXnLCBHz3BmJ16zQIfggeuPIKBuhSKcUTZ5yJxa2VkDO2409pYh6dxBq6co crXRcOjznU4P759vE7JgwSNn7xM82Pt9MWTdT+S9Uac7w3MgATKNXFhuk4zdd1DZ65gv efB4RFNzgJke48IXtTcqDfmx+NBrSzXL81d7q4bbvGDQ0MzLSXLiP/7tbCVxfR9qM1hj 5+b5tsjIcOxaOnya45L7EhzxsP8QMNr63FGDnGpGJnB5bWtKUAEoJIMKXRb73DnM0S9O I5SA== X-Gm-Message-State: AOJu0YzxCm1LxSQNSUHGJKESXdhHK2lMJFff1/tAkfzO2Z1f8onXiYA/ 9J+DbY/WMBQy71xAHVNeovwpqDqwNRSzatYGG3QE3He2OFVNdIjpp1SkiZfgqIU/IbnwAb0aPRJ cZGd3ARe+5A== X-Google-Smtp-Source: AGHT+IFnAylSDwidRckCpHK4Ltu3c7DPl7aywbX7vV2VTuv7KcgZ6Ho/+Ds9VfyU9pjc6n/QTu+AecIFm+iJzA== X-Received: from xllamas.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5070]) (user=cmllamas job=sendgmr) by 2002:a05:6902:2b08:b0:dc6:d233:ffdd with SMTP id fi8-20020a0569022b0800b00dc6d233ffddmr80854ybb.0.1713381306966; Wed, 17 Apr 2024 12:15:06 -0700 (PDT) Date: Wed, 17 Apr 2024 19:13:42 +0000 In-Reply-To: <20240417191418.1341988-1-cmllamas@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240417191418.1341988-1-cmllamas@google.com> X-Mailer: git-send-email 2.44.0.683.g7961c838ac-goog Message-ID: <20240417191418.1341988-3-cmllamas@google.com> Subject: [PATCH 2/4] binder: migrate ioctl to new PF_SPAM_DETECTION From: Carlos Llamas To: Greg Kroah-Hartman , "=?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?=" , Todd Kjos , Martijn Coenen , Joel Fernandes , Christian Brauner , Carlos Llamas , Suren Baghdasaryan , Alice Ryhl Cc: linux-kernel@vger.kernel.org, kernel-team@android.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Deprecate the BINDER_ENABLE_ONEWAY_SPAM_DETECTION ioctl in favor of the new PF_SPAM_DETECTION flag. The ioctl can be lumped together with other flags to avoid a separate system call. The driver still supports the old ioctl for backwards compatibility. Suggested-by: Arve Hj=C3=B8nnev=C3=A5g Signed-off-by: Carlos Llamas Reviewed-by: Alice Ryhl --- drivers/android/binder.c | 7 ++++--- drivers/android/binder_internal.h | 1 - include/uapi/linux/android/binder.h | 8 ++++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index e0d193bfb237..54d27dbf1de2 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -4486,8 +4486,8 @@ static int binder_thread_read(struct binder_proc *pro= c, case BINDER_WORK_TRANSACTION_COMPLETE: case BINDER_WORK_TRANSACTION_PENDING: case BINDER_WORK_TRANSACTION_ONEWAY_SPAM_SUSPECT: { - if (proc->oneway_spam_detection_enabled && - w->type =3D=3D BINDER_WORK_TRANSACTION_ONEWAY_SPAM_SUSPECT) + if (proc->flags & PF_SPAM_DETECTION && + w->type =3D=3D BINDER_WORK_TRANSACTION_ONEWAY_SPAM_SUSPECT) cmd =3D BR_ONEWAY_SPAM_SUSPECT; else if (w->type =3D=3D BINDER_WORK_TRANSACTION_PENDING) cmd =3D BR_TRANSACTION_PENDING_FROZEN; @@ -5553,7 +5553,8 @@ static long binder_ioctl(struct file *filp, unsigned = int cmd, unsigned long arg) goto err; } binder_inner_proc_lock(proc); - proc->oneway_spam_detection_enabled =3D (bool)enable; + proc->flags &=3D ~PF_SPAM_DETECTION; + proc->flags |=3D enable & PF_SPAM_DETECTION; binder_inner_proc_unlock(proc); break; } diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_int= ernal.h index a22e64cddbae..3312fe93a306 100644 --- a/drivers/android/binder_internal.h +++ b/drivers/android/binder_internal.h @@ -434,7 +434,6 @@ struct binder_proc { spinlock_t inner_lock; spinlock_t outer_lock; struct dentry *binderfs_entry; - bool oneway_spam_detection_enabled; }; =20 /** diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/andro= id/binder.h index 281a8e2e734e..972f402415c2 100644 --- a/include/uapi/linux/android/binder.h +++ b/include/uapi/linux/android/binder.h @@ -253,7 +253,9 @@ struct binder_extended_error { =20 /* Used with BINDER_SET_PROC_FLAGS ioctl */ enum proc_flags { - PF_SUPPORTED_FLAGS_MASK, + PF_SPAM_DETECTION =3D (1 << 0), /* enable oneway spam detection */ + + PF_SUPPORTED_FLAGS_MASK =3D PF_SPAM_DETECTION, }; =20 enum { @@ -269,9 +271,11 @@ enum { BINDER_SET_CONTEXT_MGR_EXT =3D _IOW('b', 13, struct flat_binder_object), BINDER_FREEZE =3D _IOW('b', 14, struct binder_freeze_info), BINDER_GET_FROZEN_INFO =3D _IOWR('b', 15, struct binder_frozen_status_in= fo), - BINDER_ENABLE_ONEWAY_SPAM_DETECTION =3D _IOW('b', 16, __u32), BINDER_GET_EXTENDED_ERROR =3D _IOWR('b', 17, struct binder_extended_error= ), BINDER_SET_PROC_FLAGS =3D _IOWR('b', 18, __u32), + + /* This is deprecated, use BINDER_SET_PROC_FLAGS instead. */ + BINDER_ENABLE_ONEWAY_SPAM_DETECTION =3D _IOW('b', 16, __u32), }; =20 /* --=20 2.44.0.683.g7961c838ac-goog From nobody Fri Feb 13 14:09:41 2026 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) (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 6B657364AE for ; Wed, 17 Apr 2024 19:15:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713381322; cv=none; b=bK4mr7aMQcGfhdbEU41zQdvoZ/mzr8Q70rXJQusn/AapelKk6mXD8HEp7Hxjg58bidZRYdBfo2WG2F8j8tj8o7QRSmz1tKxD1EhphaZy9IojJPtZCfN6iSplcfyVh87uJpxFMpl5c26u+33+HyAZ11s16MNPPMNBtbGaYodBEGU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713381322; c=relaxed/simple; bh=XDRUCy/tblmy0O5EO2E0OEsZFi4P01wqWmDopqbyHAE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rE1UZDmHPGX2bmENgSubHZEbC2spknPpZHtgdpIjtIaPdO96QLulvBvNfVsUYbSOZWrO2BYQlM/M4AqtvI2z9bE9oSVbt9y4+1++0a0rRld4XwYx0tESY8TMEdodvbapVtR9BDet7YXmz1k8Hft4Id8FFfyOKc0Ke5T5+RBMDCU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--cmllamas.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vIZHqRuU; arc=none smtp.client-ip=209.85.128.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--cmllamas.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vIZHqRuU" Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-615372710c4so322997b3.1 for ; Wed, 17 Apr 2024 12:15:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713381319; x=1713986119; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=mgzviX8tertEbO58FSXLy5axm5X38SqIZ9fho1sI7Is=; b=vIZHqRuU9xNT6QPG8WrveBugqzL15nIhIQUTFe5z82/K81q38ivU6wbt6SZtw37wWf 8SkGd4S/11c0Af7WeQDj5VScY/r4EAVeNU+791aQhFJkegVA1Xf6d5u3AR1xe0943IBg VZu7HZyxg4jJNmXLCxHCZ3vtScQn4oVArZ3NIvXK5bpHK7i2UMQZ9E0mRMK3UORrR9xU 2cxX3zdaY6HzPZuw3+znfibp/DLuwHFC0goDn+rBWu0o0gGsxgftLDxcWmrzg12n0PkL IWU1l8yyVLuGsMvDEWA3d5UfOJ9bGvTRhfZ37mabiFjpZg4gp/PJwvNlLDeMFmYdxlQz c+fA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713381319; x=1713986119; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=mgzviX8tertEbO58FSXLy5axm5X38SqIZ9fho1sI7Is=; b=OMf+/kK0ItG4Hm+lnW+zCawKfgcjNOVxDT0HgsMNzq0mnDOndy1Av3si+nT/andvXz DFRAqMckKVc60KEKF/7dF3JlDbo9ExbKGzOqIrtRwPUQKeT/QPD3P/SCUfeJEBs0Z+E7 EHPM9+fk3ovVmq/Prl06JptuFOsaveojw47+w3F+q23uSCHU7geKpPvM9O4Cj3B9N51x 6kN+YaDbZdh+I5E/9QC3fiSoYLSGifZOfd6WKT7CbbrdxZ7xZscTSvwFq0F8NjfSwYBN VR40TfNBCknqpOcMoM48LnN2b+wvwvnQZ9WaGeenoJxropayyfihar1kUgWdD3tA5iMh BP5Q== X-Gm-Message-State: AOJu0YyjDTNWm5Gba9Om1r7jHuc/D8sdXoTA6Lu7sTh8LqyW7Fuc72ij zMJVbbk/QtKJkZ5MjCF3QQN+XtpLkiPUrcp02OKWaw6tV1a7zm9dTTI8MPFu73WuV30oF4ROoNc c8DT1uZK+vg== X-Google-Smtp-Source: AGHT+IH48BhlnuGsixBDdQqgsIeKhJr8qbkwL4npU8TNJdkUNG+s71onx1n6kkhZfSloJbxdb2GnbZHlgExmFw== X-Received: from xllamas.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5070]) (user=cmllamas job=sendgmr) by 2002:a0d:d94d:0:b0:618:8e4b:f4b0 with SMTP id b74-20020a0dd94d000000b006188e4bf4b0mr27664ywe.9.1713381319484; Wed, 17 Apr 2024 12:15:19 -0700 (PDT) Date: Wed, 17 Apr 2024 19:13:43 +0000 In-Reply-To: <20240417191418.1341988-1-cmllamas@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240417191418.1341988-1-cmllamas@google.com> X-Mailer: git-send-email 2.44.0.683.g7961c838ac-goog Message-ID: <20240417191418.1341988-4-cmllamas@google.com> Subject: [PATCH 3/4] binder: add support for PF_LARGE_HANDLES From: Carlos Llamas To: Greg Kroah-Hartman , "=?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?=" , Todd Kjos , Martijn Coenen , Joel Fernandes , Christian Brauner , Carlos Llamas , Suren Baghdasaryan , Alice Ryhl Cc: linux-kernel@vger.kernel.org, kernel-team@android.com, Tim Murray Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce the PF_LARGE_HANDLES flag to enable the use of monotonically increasing counters to generate handles. This improves performance in transactions when dealing with a large number of references. The legacy logic performs an inorder traversal of an rbtree to find the smallest unused handle. This limitation is due to userspace using the handles as indexes (e.g. in vectors). The new logic scales much better but requires userspace to support large handle numbers. The benchmark below with 100,000 references shows the performance gains in binder_get_ref_for_node_olocked() calls with PF_LARGE_HANDLES. [ 167.855945] binder_get_ref_for_node_olocked: 17us (flag on) [ 237.088072] binder_get_ref_for_node_olocked: 18178us (flag off) Suggested-by: Tim Murray Suggested-by: Alice Ryhl Signed-off-by: Carlos Llamas Reviewed-by: Alice Ryhl --- drivers/android/binder.c | 44 ++++++++++++++++++++++------- drivers/android/binder_internal.h | 3 ++ include/uapi/linux/android/binder.h | 3 +- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 54d27dbf1de2..f120a24c9ae6 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -1045,6 +1045,35 @@ static struct binder_ref *binder_get_ref_olocked(str= uct binder_proc *proc, return NULL; } =20 +static u32 next_ref_desc(struct binder_proc *proc, struct binder_node *nod= e) +{ + struct binder_ref *ref; + struct rb_node *n; + u32 desc; + + /* Handle 0 is reserved for context manager refs */ + if (node =3D=3D proc->context->binder_context_mgr_node) + return 0; + + /* Get the next handle (non-zero) */ + if (proc->flags & PF_LARGE_HANDLES) + return proc->next_ref_desc++ ? : proc->next_ref_desc++; + + /* + * Userspace doesn't support large handles. Find the smallest + * unused descriptor by doing an in-order traversal (slow). + */ + desc =3D 1; + for (n =3D rb_first(&proc->refs_by_desc); n; n =3D rb_next(n)) { + ref =3D rb_entry(n, struct binder_ref, rb_node_desc); + if (ref->data.desc > desc) + break; + desc =3D ref->data.desc + 1; + } + + return desc; +} + /** * binder_get_ref_for_node_olocked() - get the ref associated with given n= ode * @proc: binder_proc that owns the ref @@ -1068,11 +1097,9 @@ static struct binder_ref *binder_get_ref_for_node_ol= ocked( struct binder_node *node, struct binder_ref *new_ref) { - struct binder_context *context =3D proc->context; struct rb_node **p =3D &proc->refs_by_node.rb_node; struct rb_node *parent =3D NULL; struct binder_ref *ref; - struct rb_node *n; =20 while (*p) { parent =3D *p; @@ -1095,14 +1122,8 @@ static struct binder_ref *binder_get_ref_for_node_ol= ocked( rb_link_node(&new_ref->rb_node_node, parent, p); rb_insert_color(&new_ref->rb_node_node, &proc->refs_by_node); =20 - new_ref->data.desc =3D (node =3D=3D context->binder_context_mgr_node) ? 0= : 1; - for (n =3D rb_first(&proc->refs_by_desc); n !=3D NULL; n =3D rb_next(n)) { - ref =3D rb_entry(n, struct binder_ref, rb_node_desc); - if (ref->data.desc > new_ref->data.desc) - break; - new_ref->data.desc =3D ref->data.desc + 1; - } - +retry: + new_ref->data.desc =3D next_ref_desc(proc, node); p =3D &proc->refs_by_desc.rb_node; while (*p) { parent =3D *p; @@ -1112,6 +1133,8 @@ static struct binder_ref *binder_get_ref_for_node_olo= cked( p =3D &(*p)->rb_left; else if (new_ref->data.desc > ref->data.desc) p =3D &(*p)->rb_right; + else if (proc->flags & PF_LARGE_HANDLES) + goto retry; else BUG(); } @@ -5663,6 +5686,7 @@ static int binder_open(struct inode *nodp, struct fil= e *filp) get_task_struct(current->group_leader); proc->tsk =3D current->group_leader; proc->cred =3D get_cred(filp->f_cred); + proc->next_ref_desc =3D 1; INIT_LIST_HEAD(&proc->todo); init_waitqueue_head(&proc->freeze_wait); proc->default_priority =3D task_nice(current); diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_int= ernal.h index 3312fe93a306..221ab7a6384a 100644 --- a/drivers/android/binder_internal.h +++ b/drivers/android/binder_internal.h @@ -337,6 +337,8 @@ struct binder_ref { * (protected by @outer_lock) * @refs_by_node: rbtree of refs ordered by ref->node * (protected by @outer_lock) + * @next_ref_desc: monotonic wrap-around counter to get the next ha= ndle + * (protected by @outer_lock) * @waiting_threads: threads currently waiting for proc work * (protected by @inner_lock) * @pid PID of group_leader of process @@ -407,6 +409,7 @@ struct binder_proc { struct rb_root nodes; struct rb_root refs_by_desc; struct rb_root refs_by_node; + u32 next_ref_desc; struct list_head waiting_threads; int pid; struct task_struct *tsk; diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/andro= id/binder.h index 972f402415c2..d257ab8689ce 100644 --- a/include/uapi/linux/android/binder.h +++ b/include/uapi/linux/android/binder.h @@ -254,8 +254,9 @@ struct binder_extended_error { /* Used with BINDER_SET_PROC_FLAGS ioctl */ enum proc_flags { PF_SPAM_DETECTION =3D (1 << 0), /* enable oneway spam detection */ + PF_LARGE_HANDLES =3D (1 << 1), /* use large reference handles */ =20 - PF_SUPPORTED_FLAGS_MASK =3D PF_SPAM_DETECTION, + PF_SUPPORTED_FLAGS_MASK =3D (PF_SPAM_DETECTION | PF_LARGE_HANDLES), }; =20 enum { --=20 2.44.0.683.g7961c838ac-goog From nobody Fri Feb 13 14:09:41 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 AA14B23758 for ; Wed, 17 Apr 2024 19:15:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713381324; cv=none; b=EEd8h5Kn2Ja8MiY356SVEHbhHPkJBmpmKvin+nevkoR458Qu40Gh7bJJo2Zr9aIX6DsqHr3ROUykt+LLkpxbV/65BhhszTX22UcsIjdlusn969Vaq/GWShIyIaLDggPmeJaKE/5CnzNeUXKGcGWqBJYMK0y8DNMdFW3UIvWqzsw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713381324; c=relaxed/simple; bh=uI8tSqgzNQr2KV6CBwiC+zzrx9zKH+jxJVnlJoO9Zao=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=DX5HrE11Cb6+vJYBv3liMi7AqmzPmF/4DC9Sp84FwxEyqpyUmFAk7F3O39/YPdwfqPXe3utNQBMjSqptIKMFXRYy65mkaAhba0wb3RPxTWfMKGbiV8Dw0wJ1EoFvwxJ//F83pWntXdT6aJulWU6wsazV0AfPcl3NM/XgO4H+G7E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--cmllamas.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=kEXbZHfC; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--cmllamas.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="kEXbZHfC" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-6f041e39bc7so196874b3a.1 for ; Wed, 17 Apr 2024 12:15:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713381322; x=1713986122; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=yw0xNn0IGHj4PbZTLDlFMunyd5B02kMRO4eEUv/pl/M=; b=kEXbZHfCH6F29rWHamKyLmCvDghnNAajhN9huaYMs3Bm46ZHq6zRtVQ8A1YsC2GSap Omp+ti1qPuBT7z4lYm+hgXxTk4UIsL8sTfGl0Yuligni4vePa8QtLWSj2sPCvlYUZA+k PAw7wxoAebc/CgmgY1Pez/gz1vWvYjekN36zxEYf2tqFGZdLqrfi104k+D7s2CnNXSRX TkljiW8fRTY6T+f272Xb8UKKW3D5oH6zRJOuDC+1YD1EF7rwz3MggYy6XNKAnfq6nh6E gu7QNMrfKNYyJhQiHkM6nQlgXtQJvM2rLzsaM/LOeYjd9eTliY1LXaDS6ktXzWTRldhG b2Bg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713381322; x=1713986122; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=yw0xNn0IGHj4PbZTLDlFMunyd5B02kMRO4eEUv/pl/M=; b=wB9+A3swjsPXBoVdHNrstH+gapYPKZ8uv9SqC7F32jMAzLN08Q2AhKNzS6sGB9nHMp qwbrVu+QmdufHmRT6V9PT3OQ+UhWo0R+SRIY3N52/TgYtYxk21xYA5zaBjPknEIOg4K/ wLMYghG2r5ncIIp0HjbRLlVJhPUz822gMhuojSmODqZsXJaAtQAqK5BHTgwbLVF+/S8l 81DT/si7kTVpQ5UQlQKA1k/N2UG1nqggfS4PQYA1TEK/pPlN8AFLJzqYKeXplcR/IbFI sxBhGBHiFVpHS0WznY6Zh8BinlYehuKzuI3Xs8pcPHAEeIwuNywaQOYM5o+20Jutvycw 0HEg== X-Gm-Message-State: AOJu0Ywb/5rHJ5PKxWuscIj26x2DzjZLVfuL8NW6mjnN8X4fxTOr87Sj GKo8ESur9TWTczKsYOqEimOZNh+1IeokqSf1xvBljXELNlTCrMWgmMB+8uDqF6Ahl2nXzfiV+11 IkE/fBrvkcA== X-Google-Smtp-Source: AGHT+IH38TtfKM2Mr8apHkGPxGYU2dAh7XueTrQaf5Unr5eg1HhWygxnsjTkNpU67yyve2aPRl/L3z7Y3tlbcw== X-Received: from xllamas.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5070]) (user=cmllamas job=sendgmr) by 2002:a05:6a00:98f:b0:6ed:344:9faa with SMTP id u15-20020a056a00098f00b006ed03449faamr51828pfg.1.1713381321996; Wed, 17 Apr 2024 12:15:21 -0700 (PDT) Date: Wed, 17 Apr 2024 19:13:44 +0000 In-Reply-To: <20240417191418.1341988-1-cmllamas@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240417191418.1341988-1-cmllamas@google.com> X-Mailer: git-send-email 2.44.0.683.g7961c838ac-goog Message-ID: <20240417191418.1341988-5-cmllamas@google.com> Subject: [PATCH 4/4] binder: fix max_thread type inconsistency From: Carlos Llamas To: Greg Kroah-Hartman , "=?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?=" , Todd Kjos , Martijn Coenen , Joel Fernandes , Christian Brauner , Carlos Llamas , Suren Baghdasaryan , Serban Constantinescu Cc: linux-kernel@vger.kernel.org, kernel-team@android.com, Alice Ryhl , stable@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The type defined for the BINDER_SET_MAX_THREADS ioctl was changed from size_t to __u32 in order to avoid incompatibility issues between 32 and 64-bit kernels. However, the internal types used to copy from user and store the value were never updated. Use u32 to fix the inconsistency. Fixes: a9350fc859ae ("staging: android: binder: fix BINDER_SET_MAX_THREADS = declaration") Reported-by: Arve Hj=C3=B8nnev=C3=A5g Cc: stable@vger.kernel.org Signed-off-by: Carlos Llamas --- drivers/android/binder.c | 2 +- drivers/android/binder_internal.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index f120a24c9ae6..2596cbfa16d0 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -5408,7 +5408,7 @@ static long binder_ioctl(struct file *filp, unsigned = int cmd, unsigned long arg) goto err; break; case BINDER_SET_MAX_THREADS: { - int max_threads; + u32 max_threads; =20 if (copy_from_user(&max_threads, ubuf, sizeof(max_threads))) { diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_int= ernal.h index 221ab7a6384a..3c522698083f 100644 --- a/drivers/android/binder_internal.h +++ b/drivers/android/binder_internal.h @@ -426,7 +426,7 @@ struct binder_proc { struct list_head todo; struct binder_stats stats; struct list_head delivered_death; - int max_threads; + u32 max_threads; int requested_threads; int requested_threads_started; int tmp_ref; --=20 2.44.0.683.g7961c838ac-goog