From nobody Wed Dec 17 08:51:17 2025 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) (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 C1ED22222CF for ; Thu, 20 Mar 2025 13:53:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742478807; cv=none; b=msH2278qPQ1bTB7CPrMzrJ/C+QpTPtudBwYfm2ArpFmz0mx1AudUMW5kjdTunK3VmlSvcsa1YaNXUlp8HATU05kXp9WT79n8gQhw8a8osID1BB+odphZB8uOYEvXRwEg/2I5emmqBxnX7rBjFK0JvJ6O1J0LtKrht3+w1piBW1M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742478807; c=relaxed/simple; bh=J0uC3aDL3oLj6YZnD9xA76IjEfmuaz3e24F5seLBKfg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ElUUWPSpmNamvzPvxYp22i54c31m4DEuWXJzCGFnQCKoT3qCnOYqna3Qv755WTwUYecm3Te5b0t7405MhYgMK7+QxgO4iOio8/qtoyaR8rG6XVVZjI/VMk8r3EgRpadl33O5yXSAFb+LQbmGdXA+fM9Nn2xCtHnlRV068Ex3d4E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=sKjKCnhy; arc=none smtp.client-ip=209.85.128.73 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--aliceryhl.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="sKjKCnhy" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-43d08915f61so5198965e9.2 for ; Thu, 20 Mar 2025 06:53:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742478804; x=1743083604; 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=kQtVj02TwiJWG/v1zh3yiQ3sv6heIvyrUqYF6Q0ROk0=; b=sKjKCnhy7XqMLb8z41h9M9Qt1UaB9w7HmgL47TOiQzDyS5y+MrufP6JbiZgFiYBlvB CdKQ6pCxERYlweaxH2iAqpmS/0KGq5b/DvVfIxxgfiAWVcEQsqtt0ygkCEAJ3XcCZv6a KTmRWH25lLLX6xXw7s6V8oQ3d9nXk2uAyeotqAcLsh/mgxtTyWviusRrgWLfAxocNOAj QASEy1zAah0XaxQb8TcoBpZkoQ4lgWV3VyXbS2mtLaAYt+fipuSZ/QIFP++hcteAjiMV 7IBvyHORj5Gmksg39j/T8VIsmpnz0qPsnVpG9K3S7+f/fa+EvdaqEjn2TIRBCXiTxtU5 vNcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742478804; x=1743083604; 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=kQtVj02TwiJWG/v1zh3yiQ3sv6heIvyrUqYF6Q0ROk0=; b=k8RWcAD7RDmKet63UEtgHhNFJLi3JvLqsFXDf93CoTly5uFJTTzH7kT95YmZkzkL7I x6LL+QkagO57YsdvxhsMQO4CaxFqRJpC8zqnyt1CSUCMIvg97C3a3yUmMO/Zj8T0qGz2 h1pv1n0rZak1NxHhnweAt/2ZVG4TcsYr0sRPG5dqJ8sja7OQqOx3gA3TA3b/mokXj0JF lykbhkSW7HTz+zo2zSDLZ+NgcqcbaBV6pNxtoGXxg3aadaM0SOBJqhY2hy1nfTTPVBkU zTWmSYlbzl//BjlZBAWF2ZIb9GiiwHn0lgmTjSfYxWdN8JCQZ0YS8nAwf6x4vBzEDmg/ JPXQ== X-Forwarded-Encrypted: i=1; AJvYcCW8DEbxwPslsQGERNujzx/uEih3+PDwAhj7ws6KxFvDOkSkDa//Ij04IDrL5DURulNyQYDffSRJHU3s3m8=@vger.kernel.org X-Gm-Message-State: AOJu0YxUZC+R1a7GGP8PxUR8ZkvHqEWPyzGBubqH2OVhHwKmpdEyIqO+ RnkHFVtWpntTbN1YzvVL2kfB2fBuLRluAO16xVV35/BbbhLUNLuF8mFggGUSOqiTUAR9pvFEGXV 2aCzvX1ks/C40dw== X-Google-Smtp-Source: AGHT+IFr3Jaj0KxKPJPv7ncKiiwCCnuUTmQHVT4JfL4+3EqeDzlnpXRpxUryKFoeIn/HAR32t8mMRrDNBJ3oHIk= X-Received: from wmbay17.prod.google.com ([2002:a05:600c:1e11:b0:43b:c7e5:66e0]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:648a:0:b0:391:487f:27e4 with SMTP id ffacd0b85a97d-399795addbcmr3428016f8f.27.1742478804116; Thu, 20 Mar 2025 06:53:24 -0700 (PDT) Date: Thu, 20 Mar 2025 13:52:56 +0000 In-Reply-To: <20250320-vec-methods-v1-0-7dff5cf25fe8@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250320-vec-methods-v1-0-7dff5cf25fe8@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=1241; i=aliceryhl@google.com; h=from:subject:message-id; bh=J0uC3aDL3oLj6YZnD9xA76IjEfmuaz3e24F5seLBKfg=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBn3B3MjwY+fdJbvVjrUawAkOZzMIdMN+e8hxSVk TebQA0+IQCJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ9wdzAAKCRAEWL7uWMY5 RtSrD/4sBYp8utYA8ZOva763NUJsYY/WLMy59OqkHqFhV0FBql202y1DvBSZI0K0yBqq7zA4JlK 8OHMKL0PhAnRvPzlVRDdH0HS6B5GzJDCdnITvE/P0V2HXtut5GQWxQHm6AkUv2Kyq3aEC0CZoSK 05tBbHCsCfDtANwCjS39uuBIENsHAvFCrgyK32t/Ao4tZcQseyBAjTTkgEqE+CWIRkq0eCDm5qR TsVDL4WjDwrAXgaqZ4Cd9RzMKFgBhGnwpkNWi6V+c70++0dfzC/aos5McVCdX2F7csHRu9XzCHq 6UyCeVQPvuyOEK5ZEM2HucjVStBS0BSyNMPm0bT2GBQ5E4Y7SMEzsFl12UIYjO/VySKEug5fno0 yNi6NOkkyapNbuR3Gd8rjTOHz2qMIF0exSKcCruWVyDNj96YkI9cH8xl5KfWWxRCsRZ4g6SBrWa efVG2khzRkPEYqO6S6k/TzmVN5koopJ/guyvMLGzj+cMChhqJuKkgDAgCyO/Qf/XKBgHp+wFbPO HgVeullU+MoX8W2RG+YlKTUCZZ+ZwwlSvA+/FCHsOgl8u5PAr7F4pGMhXCHSSWgC0S2HlGdylGM fl+ePofFq3FicdePkeWL30j9Qp8OD3cuND0ffFIGLOkl97J3atWHiXrWMJkXNfMNYOEQW3q41VL iq7gfkf4AQT6jJg== X-Mailer: b4 0.14.2 Message-ID: <20250320-vec-methods-v1-1-7dff5cf25fe8@google.com> Subject: [PATCH 1/5] rust: alloc: add Vec::clear From: Alice Ryhl To: Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Our custom Vec type is missing the stdlib method `clear`, thus add it. It will be used in the miscdevice sample. Signed-off-by: Alice Ryhl Reviewed-by: Benno Lossin Reviewed-by: Tamir Duberstein --- rust/kernel/alloc/kvec.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/rust/kernel/alloc/kvec.rs b/rust/kernel/alloc/kvec.rs index eb6d40a1bf8ba45126bd47f1dd4a7b7ef86112c4..95e752ed27395fce72d372976b7= 4fb1b0e957194 100644 --- a/rust/kernel/alloc/kvec.rs +++ b/rust/kernel/alloc/kvec.rs @@ -395,6 +395,26 @@ pub fn into_raw_parts(self) -> (*mut T, usize, usize) { (ptr, len, capacity) } =20 + /// Clears the vector, removing all values. + /// + /// Note that this method has no effect on the allocated capacity + /// of the vector. + /// + /// # Examples + /// + /// ``` + /// let mut v =3D kernel::kvec![1, 2, 3]?; + /// + /// v.clear(); + /// + /// assert!(v.is_empty()); + /// # Ok::<(), Error>(()) + /// ``` + #[inline] + pub fn clear(&mut self) { + self.truncate(0); + } + /// Ensures that the capacity exceeds the length by at least `addition= al` elements. /// /// # Examples --=20 2.49.0.rc1.451.g8f38331e32-goog From nobody Wed Dec 17 08:51:17 2025 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) (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 1716D22333B for ; Thu, 20 Mar 2025 13:53:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742478809; cv=none; b=AUZ0rD2WhfnynbU4D91KvijxLICh7JE7o6eyuUJ6gBxLn0amvfv/rnZLNtsy8QS0I4AAHQZLFfnd8NWGFA/SOcOKWlpzVT7dkYqQFpXQ0S//P78Aua4B7Q9Bvq6s+f+2XfTxsSwJ2Q07gejeKcyj8FgRMQBz0Dr8ueHIUrzXJyc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742478809; c=relaxed/simple; bh=jvc5aqPuj6cpy8mAjME7Te6ewZpKMqocp6qr8+dQ3IM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=K1ZZhCtccb5ayIRYIlcm6S9VAbpZCtrSAq70mUcGUaw2g+4dqfIf1GArLBXmLT61i2Tx3iElHhmoIdXqeEwuYfCLGSKEirsH1zFjdC2LxxDdzZCcHnrWk09BixDK09he91Y48fTub7eU+XPpn89MDMOLUiiO0+/aLFgJxNBCz6w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=wFEiTarA; arc=none smtp.client-ip=209.85.128.73 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--aliceryhl.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="wFEiTarA" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-43ceb011ea5so4556105e9.2 for ; Thu, 20 Mar 2025 06:53:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742478806; x=1743083606; 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=sN7afcPDPiX+BQZO8olJjhA9mf3Yzn3ZwZ14RycPq9w=; b=wFEiTarAjy+GHA4z87EmvNAyjt/ZOeYKGj7WkQZCg1X+FE7NauuC3ACPdAs6iiOugp 1UapdUqckzDAaiEXQq3pN8/iPaXNLamYBZsMyFAOEkep1MLh5os+y7TiUahVvek/QH+Y yHqxKK769Rr5TiORvDy4HTFgTAy7ngqg5xTykBDJFq4s3jvoEL3DpoT0tfq1hqyY7As1 TOA8+btan5RTzK6OGm5drCHO+yMMdFeHXutPg4f3o4rR+4ITyYpc+V667fSsJ+kuA5uF 8HmHbqgvGJi7MNsYRGctgPmjy+lcZOSXvL45ZIw+5kyCMRUtnWk13YXRW2WCq/mour31 Y6pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742478806; x=1743083606; 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=sN7afcPDPiX+BQZO8olJjhA9mf3Yzn3ZwZ14RycPq9w=; b=kJ9z1viDCf53XEs5t0IQ6xxId7RQv0hCD6CgK5jH4sB3EOlva2beKm3RGZ67E877Yx t4s6fmKx+ai544zvuFjzxCG2qQMqEYvq6weLdtlGW2MCjOuOaBjlsOMhTGwfieIvzTB8 PbGRcpRbmoUyvBjtrdyoqexXFKUIvELqMdmRoKjE2XNyZgQ1xDGsGtx3+aJ6tsljmuRV rvgPP5qlU2iUGzPrgRrnt7hs/YsLDBGzhr8fiOqC8Y2EmTzYl71aH2uvQMds2epD6vop xwr7xkl51RU/uNwTADyykrjtRAye8ogM2FAujOwXejb7Gt2xHZIWVxKmnitHMd6IdPM7 +h6Q== X-Forwarded-Encrypted: i=1; AJvYcCWWATZP0mLn4e90a9ntAQX0RYg4wPiLd7ZL0VHoCaw+zXSKoVD0jWB+/tdhDHhgh2TqVJL++bQGucnYDRU=@vger.kernel.org X-Gm-Message-State: AOJu0YzEWWj6z+rssI3kh1967Q4C0aLGZWxR8WpslIeCieiULBgyyKpQ q+yeDidEyczPOwCE2MJoNMExypgjqUzoSNR7hfRRVmp5JH1nNwXipl2bolsUNvEaAg2vEM05oSy rOGvSj2JBOXoNVA== X-Google-Smtp-Source: AGHT+IG60HlsW2NRPTHuSpCoWI8rVhaRsVP7DbTo5wOCqM5d6S/JM/4Uh+WJmsy23pV8BsW+b+2fllH6ZBT87Q4= X-Received: from wmbfj6.prod.google.com ([2002:a05:600c:c86:b0:43c:faa1:bb58]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4fc8:b0:43a:b8eb:9e5f with SMTP id 5b1f17b1804b1-43d43781d7dmr64525285e9.3.1742478806414; Thu, 20 Mar 2025 06:53:26 -0700 (PDT) Date: Thu, 20 Mar 2025 13:52:57 +0000 In-Reply-To: <20250320-vec-methods-v1-0-7dff5cf25fe8@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250320-vec-methods-v1-0-7dff5cf25fe8@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=2000; i=aliceryhl@google.com; h=from:subject:message-id; bh=jvc5aqPuj6cpy8mAjME7Te6ewZpKMqocp6qr8+dQ3IM=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBn3B3MaTdrB2aY4O2BZr16vy1l8wvqBjEVosoD6 XSrMWV396+JAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ9wdzAAKCRAEWL7uWMY5 RqEBD/4opACkgQLqBBXkkpfSTU7IMIpJwgFY49h66limIJrZncvTBbjgwnZ8DXuJSDBsoimaHiF SYH7S5RHoI7SRgaD5QgPm/dCTk6EwgrcROuxNcyOEsWMX8exqZnZjuGnzR8HfVprRP4QizJRfdV kBuonUUppZypbYegNoDWREcKeCVuCjAChd0DfB+BlT5N8gqgNA7tp4kXwmbzDe9C9ra6tUn2dcJ iNlQ1Yq/qWdA+sROfS4c88ONZKpS9p3dH79J4UDJNJbUBOMMrYAL2I+tQpYvSKCE3LV2PK1HUF6 OXGTwVUY8ivswN1ctrlWqrbJaiu1CoKUUHnn2ONC2H16qg1OVbx2KBD6tZbDnF4Ygcclj8OvOBc 2oFY3XdMcnrXJD9pnalKSLVNHdljWxMqtUGFdciqwsIddmTkTecbbe7AZgP3IYHzJFj3SNdNwWE VU1aGpJNkh6UcIzegrN2p47Hm95x2Uh8o2zvpucbRozPi1GNOi+Jisiv0aZE/llY38+7Db2P+xy 8VHiKcDUmh2vdXLGks+o+vLi2qHHvMVDIKdhYW9qIUDKa3N+nt78dCnGPDNgluOhN8JRnaDtKhW TRnfkHu6ycP+5juuBleeZBOEMBFg7Sj3dsdp/qsUQkvjHJ3Gx8OofL0kiY5Fvr5qdgvw65I4PrL iY8qhO9R8eMysVg== X-Mailer: b4 0.14.2 Message-ID: <20250320-vec-methods-v1-2-7dff5cf25fe8@google.com> Subject: [PATCH 2/5] rust: alloc: add Vec::pop From: Alice Ryhl To: Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This introduces a basic method that our custom Vec is missing. I expect that it will be used in many places, but at the time of writing, Rust Binder has six calls to Vec::pop. Signed-off-by: Alice Ryhl --- rust/kernel/alloc/kvec.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/rust/kernel/alloc/kvec.rs b/rust/kernel/alloc/kvec.rs index 95e752ed27395fce72d372976b74fb1b0e957194..9943358c70aa63f5ad7ed9782cb= 8879d7a80a8fb 100644 --- a/rust/kernel/alloc/kvec.rs +++ b/rust/kernel/alloc/kvec.rs @@ -302,6 +302,37 @@ pub fn push(&mut self, v: T, flags: Flags) -> Result<(= ), AllocError> { Ok(()) } =20 + /// Removes the last element from a vector and returns it, or `None` i= f it is empty. + /// + /// # Examples + /// + /// ``` + /// let mut v =3D KVec::new(); + /// v.push(1, GFP_KERNEL)?; + /// v.push(2, GFP_KERNEL)?; + /// assert_eq!(&v, &[1, 2]); + /// + /// assert_eq!(v.pop(), Some(2)); + /// assert_eq!(v.pop(), Some(1)); + /// assert_eq!(v.pop(), None); + /// # Ok::<(), Error>(()) + /// ``` + pub fn pop(&mut self) -> Option { + let Some(len_sub_1) =3D self.len.checked_sub(1) else { + return None; + }; + + // INVARIANT: If the first `len` elements are valid, then the firs= t `len-1` elements are + // valid. + self.len =3D len_sub_1; + + // INVARIANT: This invalidates a value in this vector's allocation= , but the Vec invariants + // do not require it to be valid because `self.len <=3D len_sub_1`. + // SAFETY: Since `len_sub_1` is less than the value `self.len` had= at the beginning of + // `pop`, this index holds a valid value. + Some(unsafe { self.as_mut_ptr().add(len_sub_1).read() }) + } + /// Creates a new [`Vec`] instance with at least the given capacity. /// /// # Examples --=20 2.49.0.rc1.451.g8f38331e32-goog From nobody Wed Dec 17 08:51:17 2025 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) (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 37B8F224231 for ; Thu, 20 Mar 2025 13:53:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742478811; cv=none; b=I/Fyb1TeWgOdWqpGp4kMKfzsCWka82ZCKztD9GoHl/wWyQg1qfpLtBm8hHwtCVD2WwqLGJdBeHnbahBp8YoZ33ojRyhwsOd91x2ukKV9+ai7rhOI0h++qV4UZP29LjGpxQMG/4GzFGPq8K8O3QL7JPf4jlt351An1ZKsUEmD4QI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742478811; c=relaxed/simple; bh=oq9udGuCcSsMEvbqP89aogF1VgUZC37t/ErsD/OVHrw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=qJSzKmmwW/QN5OEDz1QLgfyZEDmE7fp0nqtHwgpjNds/P8L4nLWhDZZZuMLrldOdq3ul4ZjYUptMNBN2gs0SugyMDVzzf1TRjGET823rvpB1XwmmNniEz9rM6xzp5EYYdMmE/ZmQP9uFXu95rUJcHqQAriXYaYCDJBmW0N8qZtI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=KtQg/PjO; arc=none smtp.client-ip=209.85.128.74 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--aliceryhl.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="KtQg/PjO" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43cf3168b87so4468435e9.2 for ; Thu, 20 Mar 2025 06:53:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742478808; x=1743083608; 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=7M2VtU5PPRczkAaCd/oYdvo4gCCR2tO6CUbKZTZQCTA=; b=KtQg/PjODm+GRQCjBwAyblXK0jChVnfFTEo1CJE+6lZZDL+HojJGzaQ59d9s9ENrBI vh8zgDZJwRDRVZAb5JMnVfruog3k8/k6bGt75MwT7UWpmkXKhth0HPFO8g4BJtpLmQT8 1NHi1Y00IYHOA2sUU6CuQl2oWTdZ4uBrMJaT3CGzwrSHhVsflPClezI0IwpTaaFATwdv eFw77TleLkznXvQ+I2GITSrka3g1+bWNSbNifseUlUkaBAgdmMWokgf0a4MYf2bhrg5U pOBNVHFEHpB0fL4ZTqCx/wcuKJoMzzrQh/7WWxzAWz7pmuZGXPVynaqdFlAkDYyXEuIu 0Q1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742478808; x=1743083608; 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=7M2VtU5PPRczkAaCd/oYdvo4gCCR2tO6CUbKZTZQCTA=; b=oGMfuZo5JWbHSBIBWQ0wi3fxYtepxfIbYMly1ZPhU5l4bcm8DIVPG6yeIQeSOXoTWt V4KqErvJj3sc6Wgq/NwFwZ4HgCQubqmXpa+RCOJwh8xXe34C/RfdDTPg1BkxLXALHk0w xfL2dAM6ZRRdeXbcbMGbSrlMODTk2/PbOHhCOJ/utqF3AgQ7bj/N+XGniNYabKFffDJx 1EKDg+7VdSjnr/L8qYLeqh8D6d0E3ey9ngU9lPW5Lb4pVPvq0aKWhDjDVpEjGEdgLPnk se+cvG5OpG3gEYcVnw5llTEzAdxHlSEjt2Lpg2KmiTOIFzTlJSiCoAyeaM92rYlxU9ba cFCQ== X-Forwarded-Encrypted: i=1; AJvYcCV4M08yS0lt2gPfS16clj8JufGaVt1iLOrCY+uYDwN1PVtzo8Nnjhn3u3Xv2GEtW99EmZorgyaWZ7sb5gw=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5sC7JigKoqZCHidLjTP2SRu2QlE1adncsPuAwftcgLxNpnP3t qi2CI1IxrcmAwRRTkJpUIJsN5JzUflj9T2v2BllJLwFKaXVJ1q03LbtMLKqyXg/2Ra2TcbxppWT XqpwXwubQ9RjRiQ== X-Google-Smtp-Source: AGHT+IEHBEzOJAPJ5ezuipJ3siAvbyjFeXNO5sAc0d3iTiI/rmXTEivVMWgnRI+74eXAZJm34UhpBQMONlmhSYY= X-Received: from wmbep16.prod.google.com ([2002:a05:600c:8410:b0:43c:eaf6:525e]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4e44:b0:43c:f4b3:b094 with SMTP id 5b1f17b1804b1-43d4378041cmr72309735e9.6.1742478808680; Thu, 20 Mar 2025 06:53:28 -0700 (PDT) Date: Thu, 20 Mar 2025 13:52:58 +0000 In-Reply-To: <20250320-vec-methods-v1-0-7dff5cf25fe8@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250320-vec-methods-v1-0-7dff5cf25fe8@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=1917; i=aliceryhl@google.com; h=from:subject:message-id; bh=oq9udGuCcSsMEvbqP89aogF1VgUZC37t/ErsD/OVHrw=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBn3B3NFeE1Ogr3RQZHN9/v7DaROFK5k4mpOMKCD 1Bd7vq5b1SJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ9wdzQAKCRAEWL7uWMY5 RgB6D/0WkW5RJz0jjMuXX3XTipgrz//n0nnWXy+rkrG5AGwSDuVf3M4Pio0sjmwpUUIw1uWFewq FCeIWWqhvI1k8xFxhXzkGXobRcV2V7agTcSuheKZwR5cIHu4zTBdu4ixma4xl+PrH9PpNptnnbx cjKzDQeS4Tuc6Cp2tdcsz9DG+Gpy38V0184/y2k3RFf8RCvWaFUN1FVNeSN53SI9QOVImcyL8CD 5P6MuQkgyaVRCDU3F9gQzJ79VDNbxCRPdKTHzoAGoW+9I4LQX0Up+qUORWONQNaZ4nT0nAKnY6B z5JcOXwELHaNMqCoiy7xPr85LYgJ4DHuqXp+WOJP4aBgwoUlVA4bkSx9TpMf3BJmaYfrRTPpnpu Ji7jw+sjx+UddZ7X7J6lCfrJTYEm2QHQvAtvFh7bBTjI+aeMV9syMuii0aUXkgsxPCSP91Nh4xI uokdy/KAnkk1Shz4V6+Gr+870N9TQx414tLvmduVix5D9q2xYEvyxEaOgZduvIvhHBiW+8mYJ9W YbiX+p4ZII5fHHxZErqUrje8kXdgDeRRFIkuN8FJHWfsrRF3kCUwQphuQpbRlBCLm0MrrYD4bur bj7mHFHm1rNBaqvWJIwMV62lrKw4z/bsJlH1gpHzsl6uFalCYCpMKc4saFWoFaep/YQenO8dZmx v6y+Oy7M5/gyWVw== X-Mailer: b4 0.14.2 Message-ID: <20250320-vec-methods-v1-3-7dff5cf25fe8@google.com> Subject: [PATCH 3/5] rust: alloc: add Vec::push_within_capacity From: Alice Ryhl To: Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This introduces a new method called `push_within_capacity` for appending to a vector without attempting to allocate if the capacity is full. Rust Binder will use this in various places to safely push to a vector while holding a spinlock. The existing Vec::push method is reimplemented in terms of the new method. Signed-off-by: Alice Ryhl Reviewed-by: Benno Lossin --- rust/kernel/alloc/kvec.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/rust/kernel/alloc/kvec.rs b/rust/kernel/alloc/kvec.rs index 9943358c70aa63f5ad7ed9782cb8879d7a80a8fb..df930ff0d0b85b8b03c9b7932a2= b31dfb62612ed 100644 --- a/rust/kernel/alloc/kvec.rs +++ b/rust/kernel/alloc/kvec.rs @@ -284,6 +284,31 @@ pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUni= nit] { /// ``` pub fn push(&mut self, v: T, flags: Flags) -> Result<(), AllocError> { self.reserve(1, flags)?; + let err =3D self.push_within_capacity(v); + // SAFETY: The call to `reserve` was successful, so `push_within_c= apacity` cannot fail. + unsafe { err.unwrap_unchecked() }; + Ok(()) + } + + /// Appends an element to the back of the [`Vec`] instance. + /// + /// Fails if the vector does not have capacity for the new element. + /// + /// # Examples + /// + /// ``` + /// let mut v =3D KVec::with_capacity(10, GFP_KERNEL); + /// for i in 0..10 { + /// v.push_within_capacity(i).unwrap(); + /// } + /// + /// assert!(v.push_within_capacity(11).is_err()); + /// # Ok::<(), Error>(()) + /// ``` + pub fn push_within_capacity(&mut self, v: T) -> Result<(), T> { + if self.len() >=3D self.capacity() { + return Err(v); + } =20 // SAFETY: // - `self.len` is smaller than `self.capacity` and hence, the res= ulting pointer is --=20 2.49.0.rc1.451.g8f38331e32-goog From nobody Wed Dec 17 08:51:17 2025 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) (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 09CCB2248B8 for ; Thu, 20 Mar 2025 13:53:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742478813; cv=none; b=ajMe8b2S6vmSpLbVY8C7Y+ITe7VuNUuAPr4ZQSG9bLLSUhBwpkOTNb0zv3+eIEAUe03KW8tXIZ0OVzWHg/8pv2RgzGdAkOPdMf0GVcP9b67nxNIbbz71OHU4WZpidFObH+xYw00J+bomCzFOz90E9H0bxG58fDGmROQMmjPkQSs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742478813; c=relaxed/simple; bh=yLjhmMd/m/H55074HEYVORdOcdctvj3JoTlXaRNTHPM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ug/tAoo/rxZPY7Kcmo8Df+TD4M5H6fzVu9cmwB5+kbjEMRf36Spj/Xfa2qUTCm4Rr0AnBWHlFQejID7dCUmCjBgZJ/aKD0mg8f1qb1xUc5Q90nhlv08JHlbrRvnl2HZlRgMVJ69RipvzTiFLJKFw3Ldg8JHULONBosYg9jwBbbo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=mY20bmNc; arc=none smtp.client-ip=209.85.128.73 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--aliceryhl.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="mY20bmNc" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-43d0a037f97so4609375e9.2 for ; Thu, 20 Mar 2025 06:53:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742478810; x=1743083610; 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=nuEUHx8MPrCQicFsoRZBu6HG4ZIchgsQHrIZJXNn6G4=; b=mY20bmNcbOhQuK5OJuUq5f6lDU4YpRtEPgse8m/erTsLI4CVootXl7BnNyp/+lyUTl 60ZG6Omab675/8ZD+lLVLMkHi6iPsDvVrFf8FQrSX00olNbbOv/fKTwoojNPfwA/XXfs H8QSyAyxPHlrTtyu1iarTZTqFOsaX+Gyerq/OSQ5sKdgJfQPSk1C4IzI9hIUR1FC9RRX xtBUgyNnoBxGseanOMDgnwRyx63fNkhvoG9bcdFmucegY1C4I9PfzlvcTN1LogVr2QuP J9Nk/g5Kyu+r1TNkFzylj/2YXWTih2U0MqQB7ARpUM/csnQDNclZyeqoYn+HpLEWwGT8 14QA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742478810; x=1743083610; 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=nuEUHx8MPrCQicFsoRZBu6HG4ZIchgsQHrIZJXNn6G4=; b=KeFiUsknLWmllLukMFnO+U5cAWMtTfuYg9Zf533ob0T/6bD9F3rCyJ+fw75uLWbZsj bxTu0xLzYl5V3GyunO7UzMIgM+FLTtaIiO8Ow9167+FyJyYst7vjo0Oi3RJXQelWLOin m8t5jHYTdynlAI5BP097E/RzD9vukZhNAPijsyNto2lWxH170N6lcN44UXV3b9qW4hEZ VQOo7B+plnfjv0cUzaCuHkhEWAvOesxBwbCG2qj3VLzlhxt5QEb/2OneXNJwWoo17V2v 0WIpJ7Qk1wvgFZxAmMXlxUuIeatmFhNRZYzQ5KvMLyNBvCbL0Ff3BlPjawbWH5EurOUl Wafw== X-Forwarded-Encrypted: i=1; AJvYcCW9t3XsQWRpQOBqPUtGoX+P8C1Upi0bN/ll6lmTAU/D7KOWe0Gl6ZAo7LCPueX6fuwFPkJEpXyQMwDCH0c=@vger.kernel.org X-Gm-Message-State: AOJu0YwkyuCunjkDeuQ5NyGn3ndQMFImP+2+QaFHmnCqJAL3oDbxOEzB U8GAi5Nv2MnpTwuQxqn7yfmxYsGOWwN3O/GUZb5OVwtELmFvjtFtk52WKTOhg6j2Znv0NH4ZXGz QulNXQOuFOZ9wFw== X-Google-Smtp-Source: AGHT+IEqYmzU76ihbeSsWGVf5seCrmCHx0d0WG+50BExIHwTnel5Diq5fLh1i+SQTHQN/ZBzeS1vpm7r+Yy9MPw= X-Received: from wmbeq8.prod.google.com ([2002:a05:600c:8488:b0:43c:eba5:f9b3]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4e90:b0:43c:f332:703a with SMTP id 5b1f17b1804b1-43d438813bfmr67438825e9.31.1742478810733; Thu, 20 Mar 2025 06:53:30 -0700 (PDT) Date: Thu, 20 Mar 2025 13:52:59 +0000 In-Reply-To: <20250320-vec-methods-v1-0-7dff5cf25fe8@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250320-vec-methods-v1-0-7dff5cf25fe8@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=2941; i=aliceryhl@google.com; h=from:subject:message-id; bh=yLjhmMd/m/H55074HEYVORdOcdctvj3JoTlXaRNTHPM=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBn3B3OfmokVlnLyfYpQimu+G/cgJ5t7bDTRFR/A sifydHpS2iJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ9wdzgAKCRAEWL7uWMY5 RqVRD/wOBuAntCDhrO5Fl/e4wRgNmEkbNX6Qf6AgPY3lZnPz2qlp7QOhyF3SZbRqcRN98R/G0ab 3FPlQQe36AbbuynfJe1jC1HX05SHDXdbT2z5BBfT8iTjSoddqpFuB/lArYQzXsdVLWzKmesspgx /YzZmA0NQbwX4oxvA7yEvH9Jf8gI8fpotiNc1fgFpbR6rijGGFXHz9Rbw6AUHm75UI6waVZj6sN S6AGjQc6n0JqadxRQ4/chOR1dT8lDCHZ0lX+dM64+NJAtf/SPbtsFrpwFusoZlnAts2mTd4P3Wc pNx8l4yh7Q094MiAO4mQvfjNGu5v7UzpiEmmCmP7VlBKaAs5o+KTi6cbvxJvHNuO14rIAhpS0CP WAr04TEvq4PX/4R3kIv/UIes4VUIh0oS850NiiPRdTgWZDiYeCD6bmUeHr9gf3DaKRRO1fVapuj FvT073Kewq/pUsZDLCmoPPXQVJDY9mW7IXAqftpLEOz1kTGNRdtQUIFg5+kRY3nt+yzGi+UY5UU NoA/go5nMtwktKOvsnVG2ZSaknxqUS4+2Cr3iTs779lgYKHRuHSC+T/UPtEtcC6vZRf2yN/lXF7 vrjchCbjJWhLXrs7kdlnq0Oz5jcjf/uqwqsc1F3n7nSSNo7Ah1zbzHg27jO2yUEhsp2tspcREYG D9nRHCgKEPm0L6g== X-Mailer: b4 0.14.2 Message-ID: <20250320-vec-methods-v1-4-7dff5cf25fe8@google.com> Subject: [PATCH 4/5] rust: alloc: add Vec::drain_all From: Alice Ryhl To: Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This is like the stdlib method drain, except that it's hard-coded to use the entire vector's range. Rust Binder uses it in the range allocator to take ownership of everything in a vector in a case where reusing the vector is desirable. Implementing `DrainAll` in terms of `slice::IterMut` lets us reuse some nice optimizations in core for the case where T is a ZST. Signed-off-by: Alice Ryhl --- rust/kernel/alloc/kvec.rs | 57 +++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 57 insertions(+) diff --git a/rust/kernel/alloc/kvec.rs b/rust/kernel/alloc/kvec.rs index df930ff0d0b85b8b03c9b7932a2b31dfb62612ed..303198509885f5e24b74da5a923= 82b518de3e1c0 100644 --- a/rust/kernel/alloc/kvec.rs +++ b/rust/kernel/alloc/kvec.rs @@ -564,6 +564,30 @@ pub fn truncate(&mut self, len: usize) { // len, therefore we have exclusive access to [`new_len`, `old_l= en`) unsafe { ptr::drop_in_place(ptr) }; } + + /// Takes ownership of all items in this vector without consuming the = allocation. + /// + /// # Examples + /// + /// ``` + /// let mut v =3D kernel::kvec![0, 1, 2, 3]?; + /// + /// for (i, j) in v.drain_all().enumerate() { + /// assert_eq!(i, j); + /// } + /// + /// assert!(v.capacity() >=3D 4); + /// ``` + pub fn drain_all(&mut self) -> DrainAll<'_, T> { + let len =3D self.len(); + // INVARIANT: The first 0 elements are valid. + self.len =3D 0; + // INVARIANT: The first `len` elements of the spare capacity are v= alid values, and as we + // just set the length to zero, we may transfer ownership to the `= DrainAll` object. + DrainAll { + elements: self.spare_capacity_mut()[..len].iter_mut(), + } + } } =20 impl Vec { @@ -1049,3 +1073,36 @@ fn into_iter(self) -> Self::IntoIter { } } } + +/// An iterator that owns all items in a vector, but does not own its allo= cation. +/// +/// # Invariants +/// +/// Every `&mut MaybeUninit` returned by the iterator contains a valid = `T` owned by this +/// `DrainAll`. +pub struct DrainAll<'vec, T> { + elements: slice::IterMut<'vec, MaybeUninit>, +} + +impl<'vec, T> Iterator for DrainAll<'vec, T> { + type Item =3D T; + + fn next(&mut self) -> Option { + let elem =3D self.elements.next()?; + // SAFETY: By the type invariants, we may take ownership of the va= lue in this + // `MaybeUninit`. + Some(unsafe { elem.assume_init_read() }) + } + + fn size_hint(&self) -> (usize, Option) { + self.elements.size_hint() + } +} + +impl<'vec, T> Drop for DrainAll<'vec, T> { + fn drop(&mut self) { + if core::mem::needs_drop::() { + while self.next().is_some() {} + } + } +} --=20 2.49.0.rc1.451.g8f38331e32-goog From nobody Wed Dec 17 08:51:17 2025 Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) (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 3A2162253FD for ; Thu, 20 Mar 2025 13:53:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742478817; cv=none; b=O8I8q+EshmNyGmaCQXylzvm7M/9HuqwW1h/xk9SQUdkLBEAYA3i6C0H2M3kGdFr4rtU6uy0Pg79/YJmx5IuaiXZdz3Xkukir6PLJtpzbRqBh9yXN3CaoCarLj0JpwZfbxPagIaQCwCcyNiMahj08VfqL9gcX/mCipwN2LLvCAuQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742478817; c=relaxed/simple; bh=NCAdAD7zcQQG3DmPxpb4nW9umd28Sgb4e1h7Xd2XolE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=utiG03c+kLfl9reDlhSX79AukuxRAZMXUqL+Coqz6/J51e6hP8phuHLYUFIKEAsntTcGmXzeblscnL9CzReaeTYeFVh5CwEx1dr2QOKJ82ehvux5/xpFX0d9S/DCPyzvFHL2n24BHFlvfzG2WoKkfqmdK9jJjuntlINYaU9xz2Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--aliceryhl.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=on1QeZwF; arc=none smtp.client-ip=209.85.221.73 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--aliceryhl.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="on1QeZwF" Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-3912aab7a36so316015f8f.0 for ; Thu, 20 Mar 2025 06:53:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742478814; x=1743083614; 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=ARoR/4rbfxmbwkx8MsUi2O1VKkXGVBlgDqberViU+Ls=; b=on1QeZwF4l5IKECzJ7cTm9j25hxrgfckeqj3a1y4+SFE+h4bV5g7JvTRI7IpWa9rl9 V1VWmwxxBHDR5DsKnUfQFMi6B2DUjt1UTBVRdRD8PqIp079CQRYo5UG88DHTFKr/0Pgw p7aEvCKFdOzUi4VgQpPyMFaUQh6aN7iAUR5KqVJTvgM0RUWDTQp/lduKRMWzVPCC2XvW Dm7sqgWwALRVLCWvLnZaGVRL8E15sQQpr4i9PV2mGicl+EFSUYc0yhYzZDGrl4Nl1WuK EmLHsT0zJzu5CAP7SyDSo0RETqmTICGBOvcMxtXC2MlTvhbm0FtsmAQ7ndbX9NJKPb7H 1KOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742478814; x=1743083614; 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=ARoR/4rbfxmbwkx8MsUi2O1VKkXGVBlgDqberViU+Ls=; b=hyh4dGhOpVo7q3KcfVFD7Jiu1A5b6nZw4vkx/T2bppo5kIeB6eK4LM4FUI+76NBg+D xhoovIJhOo0JlTiWWtjXmyo/hmKgR/yBgcFz1eqzjD3L+ELB3JfqYnHGybRjhpn01qir 3VIKN3Al60n4QRyQnffEKNb8uM/QF/ay3fc+y1khv4nNbH87ZhsEU4u9HTSkF+pfWFQ4 AXhKXyK9hka39fY2C/gS+NWymByNoorAxzAG1WqWvf1tQOG/17hOnd+vV5wC711xTn5r jXlGsXYiREjj+g53VCYmbkyZOTtphavt7NS8B3d9oFUi6IvVf5vdA/p2laI7/iq1chid 4YlA== X-Forwarded-Encrypted: i=1; AJvYcCV4ug3ksim263+kMPvCf9EB6o/gjgL2l/dUEUuA+j/fuQjMm2nNcFIecqIzzRuvtryMySi8cRGAMFtOgr4=@vger.kernel.org X-Gm-Message-State: AOJu0YwG+43eqVtZVHDHA5GoFvFSGdL0BiVk4I3STCYnPajHEqydm5m9 kcFBONwnTYAKD6MPjBMTGF6U3HhP2WpdEZ9L6Nh5NfHrzH7jtTh2rHDE07VUA06SdMnFCUAcCoV hJ12UUY5kIFRoVw== X-Google-Smtp-Source: AGHT+IGk1VdvocsBb4oxWBkhM8eKGeq/5oOXyCMhkbRPxkFUqPnga50GXXG8kVbBNsuNobfY3vnahdRVjW03aOE= X-Received: from wrbfu22.prod.google.com ([2002:a05:6000:25f6:b0:394:d453:93f4]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:64ee:0:b0:392:c64:9aef with SMTP id ffacd0b85a97d-399739c1f58mr7094721f8f.20.1742478814714; Thu, 20 Mar 2025 06:53:34 -0700 (PDT) Date: Thu, 20 Mar 2025 13:53:00 +0000 In-Reply-To: <20250320-vec-methods-v1-0-7dff5cf25fe8@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250320-vec-methods-v1-0-7dff5cf25fe8@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=2846; i=aliceryhl@google.com; h=from:subject:message-id; bh=NCAdAD7zcQQG3DmPxpb4nW9umd28Sgb4e1h7Xd2XolE=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBn3B3OAP6GNwr3WDtZT5V/xWKWknls04prEXKq0 YkqvMbPSgWJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ9wdzgAKCRAEWL7uWMY5 RqaFEAC4C1slxPMFONjtELvLg3Z2lonhLkvPeEiY+ubrSjRI6bJMkQvEekJ74MNGhyEwiLPklmm hAbZAOVsSPed/Bus+tlXu47Tb+c8xTYS23KAmdJb+uCAOywmTxAHM+a9HKQQp/jWujTzXi+AUvo V1s8oGFSnoCRn0WyttpV9ah/dIGyPKJ1EMlASd8f7aiAItmjdCjDbXzXEgYeDTSAwcMMwCK7eVq IwXDwaUuZoK39a/EuyQvtQIb92h+6/9byvlaUXkBxRb9n7RjYsu2ZNRIOltlIUrcks+tOKTJvxm V/r5ZOO+kJMYTmro6rOHexRvsV1grH4+ppq8O5pAE2PSIKGJjEBrDmQULKyHYnHku0UjLSD5JFo xu8BZ7Gjw0ycHDA2ZsdWD/DCqOFrDe3lyeDsQnDvNs9iMzuimTF97RLi/gW/EBVBvfjHpslBBs7 mjny3n3xeUz8u2S74a8bPTKd2cx29U4sjDS2s4mQWlyJtGDuuckB5svz9xwqe5zj/C6Oa/SqZX1 KVAAJRrbsQBA9FudWPBK2t/aINplQkyVoO/aS94Y5EKGa+e2+cK1DQHpy5e+y67PvYLIgNDfUqD kANC31eOX1v5/6rsAT7/5eLsDh1iRlgk49x6imrLPH2SNXO1v1CS1iegVcxTjNW2YMRlhDdlHYF 3rDRib1JkmiBWlA== X-Mailer: b4 0.14.2 Message-ID: <20250320-vec-methods-v1-5-7dff5cf25fe8@google.com> Subject: [PATCH 5/5] rust: alloc: add Vec::retain From: Alice Ryhl To: Danilo Krummrich Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This adds a common Vec method called `retain` that removes all elements that don't match a certain condition. Rust Binder uses it to find all processes that match a given pid. The stdlib retain method takes &T rather than &mut T and has a separate retain_mut for the &mut T case. However, this is considered an API mistake that can't be fixed now due to backwards compatibility. There's no reason for us to repeat that mistake. To verify the correctness of this implementation, you may run the following program in userspace: fn retain(vec: &mut Vec, f: impl Fn(&T) -> bool) { let mut num_kept =3D 0; let mut next_to_check =3D 0; while let Some(to_check) =3D vec.get_mut(next_to_check) { if f(to_check) { vec.swap(num_kept, next_to_check); num_kept +=3D 1; } next_to_check +=3D 1; } vec.truncate(num_kept); } fn verify(c: &[bool]) { let mut vec1: Vec =3D (0..c.len()).collect(); let mut vec2: Vec =3D (0..c.len()).collect(); vec1.retain(|i| c[*i]); retain(&mut vec2, |i| c[*i]); assert_eq!(vec1, vec2); } // Used to loop through all 2^n bit vectors. fn add(value: &mut [bool]) -> bool { let mut carry =3D true; for v in value { let new_v =3D carry !=3D *v; carry =3D carry && *v; *v =3D new_v; } carry } fn main() { for len in 0..10 { let mut retain =3D vec![false; len]; while !add(&mut retain) { verify(&retain); } } println!("ok!"); } Signed-off-by: Alice Ryhl --- rust/kernel/alloc/kvec.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/rust/kernel/alloc/kvec.rs b/rust/kernel/alloc/kvec.rs index 303198509885f5e24b74da5a92382b518de3e1c0..00dabea8ea6c8a742a7fc95954d= 8de58be124493 100644 --- a/rust/kernel/alloc/kvec.rs +++ b/rust/kernel/alloc/kvec.rs @@ -588,6 +588,20 @@ pub fn drain_all(&mut self) -> DrainAll<'_, T> { elements: self.spare_capacity_mut()[..len].iter_mut(), } } + + /// Removes all elements that don't match the provided closure. + pub fn retain(&mut self, mut f: impl FnMut(&mut T) -> bool) { + let mut num_kept =3D 0; + let mut next_to_check =3D 0; + while let Some(to_check) =3D self.get_mut(next_to_check) { + if f(to_check) { + self.swap(num_kept, next_to_check); + num_kept +=3D 1; + } + next_to_check +=3D 1; + } + self.truncate(num_kept); + } } =20 impl Vec { --=20 2.49.0.rc1.451.g8f38331e32-goog