Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp2971016lqp; Mon, 25 Mar 2024 15:06:07 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCV2wSr679yh8dEraT1eV7PyIzwZ2c0zesjAXggWKz7MWPoqXzNwzcOEiRZcmsi8dqd0t6NqVJh/kukD3xY5foW23U1zUGRyPAEuf9aPPA== X-Google-Smtp-Source: AGHT+IHITc0v5iv78SlRDj3qO/amSS5pmN3P/Y1drbPTW/Cc4YPWqJ2WHaPgygVI/KrGPVyTI2ud X-Received: by 2002:a05:622a:42:b0:431:618d:6b57 with SMTP id y2-20020a05622a004200b00431618d6b57mr2677139qtw.23.1711404366722; Mon, 25 Mar 2024 15:06:06 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711404366; cv=pass; d=google.com; s=arc-20160816; b=OVQyDtNf+bZnxLTMmdeZm96h9vjdPm3XxGog6prbn3WznaTnSfPvuYvXMaeHqENiLr Cnk5PH9hmG+cDrgXRRgHHb7C4VHC34jCeHh8MSn2ywCtKMNzu6NcLSiFIoiag4c/1w/v MG9dMuUr0+HrHjNWOQWDMu+crksl/zxW2ocZK9AX1z8wDBif90D5u1bBMBLL7dQntWhr iPK5C97E7g3ziZQz4tbuamp83j3kcdpTtehQQbgqKxSC/0tWAZ336qN4pBx+/cYlQSnz OVsnucOfta11xsQmctJTvDFiWg/FJMX6IDGAQ4+xz6lsAPpU2IwJZPFF5qXr9mvZ+J78 6sMA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:feedback-id:references :in-reply-to:message-id:subject:cc:from:to:date:dkim-signature; bh=tN0+ubZJmKVdLvvMpKN2/OFQiM5GjH39Al+PCbsrl/Q=; fh=A/Ua4Q351kuGQC3NJfXQlutNC8uk5uNbUXW4Yyk8Cas=; b=qZdlXtYIaQXPYariDQ+iyP6n/SMx7U6psGYiYkoDoMfoZQsNsLK21LG9tlPEw8bWDK OWLbMd7vYmSDGWFJRGLisjM61gGAf0MYgTbEDHTvLDnzNwztWnxF1DQmI/IPQvcoYAWY ihzV0uujuy4TrdyRurTZ+Y8ih2XXp0mxwStdRHGyJ0huYQQrPzIZQsdqko56E2vCByVQ Ru/xSTBJjBwzX307lJCsgW9fc61UO/rhEVwSxMsJa1PcurDb6xkZXs8v/nSOLqoXP6cg uMaPxaRbk1Tqy0OCiRqPPQ/1n+JjiG/0mgmIYQv/Zt2jIZ58qxG01dCX2gybTCO+xCUM rehQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@proton.me header.s=protonmail header.b=OVRRyW8T; arc=pass (i=1 spf=pass spfdomain=proton.me dkim=pass dkdomain=proton.me dmarc=pass fromdomain=proton.me); spf=pass (google.com: domain of linux-kernel+bounces-118080-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-118080-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=proton.me Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id e3-20020a05622a110300b0043148caa2c9si5048055qty.253.2024.03.25.15.06.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Mar 2024 15:06:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-118080-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@proton.me header.s=protonmail header.b=OVRRyW8T; arc=pass (i=1 spf=pass spfdomain=proton.me dkim=pass dkdomain=proton.me dmarc=pass fromdomain=proton.me); spf=pass (google.com: domain of linux-kernel+bounces-118080-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-118080-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=proton.me Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 4D5B21C3BA2E for ; Mon, 25 Mar 2024 22:06:06 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4A8707175E; Mon, 25 Mar 2024 22:05:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=proton.me header.i=@proton.me header.b="OVRRyW8T" Received: from mail-40131.protonmail.ch (mail-40131.protonmail.ch [185.70.40.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E77670CA7 for ; Mon, 25 Mar 2024 22:05:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.70.40.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711404358; cv=none; b=VQ69FPLaerlZwlLmvrhbmoCUU9HjyCS16RK5vKY3XUzh6cV3+jW7D7N6Hi/qUq9emICcX2ft3k9R3xxyDIE3V+gmxCLq1Xll7DiaUpr+B98pjmml6WUzNTFgknTNXY727sN7TOrUAJr3YNAljU298Mkgqm6lxxES7D+6R+joFSM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711404358; c=relaxed/simple; bh=ZFvuyhlVXgsXqn+uiOPjOuC5HwV1VdVaF4Yn0pW8M4M=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=pzCnFedfnLvOdRSHs08lcklWmq/uKadinmx6OP6VxviOzRrjv+qHVhGg7PODZjcwjY+oK47WGlVdTbiRMuveJRts2Ovt1Auia0tqa+jjYE60ovBb6Irc1v4Wj9BcA37xbhnKHNRrvXB3VA8tX+P6Ric6eSWof9ahzp5/BRA3mf0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=proton.me; spf=pass smtp.mailfrom=proton.me; dkim=pass (2048-bit key) header.d=proton.me header.i=@proton.me header.b=OVRRyW8T; arc=none smtp.client-ip=185.70.40.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=proton.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=proton.me DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proton.me; s=protonmail; t=1711404348; x=1711663548; bh=tN0+ubZJmKVdLvvMpKN2/OFQiM5GjH39Al+PCbsrl/Q=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=OVRRyW8ThiI6rpDGKa5zg2dheAWiiV3l53xdA7onmobWe3rTmsBn0Nv9qOAdBtg0P LGGHI3L5/P17Z4lPpvted5S2vyYAZSBhwNKdzufXNXjCRh4B8fHkZm25dlSsgoCkWi ZsNCntOaYlPIqcTwtYpeFRQ+qT0mYBQX1SuUJ48wzrNUFlRFPL06afTtH7ZaM/bcLC INMudYDgzCAyPXDyXQf3B7jMTi8q5QmF1a0amvwd7+151Vdz6hNS1ETdK97OWVHZYS vThx9PsvTTllKWXrYyGccU8CUjpXwky4c0RIV01HhPb4TyK0SxAr/2mAk94+rwxgBP Ke6JzxBiF+8mg== Date: Mon, 25 Mar 2024 22:05:33 +0000 To: Wedson Almeida Filho From: Benno Lossin Cc: rust-for-linux@vger.kernel.org, Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?utf-8?Q?Bj=C3=B6rn_Roy_Baron?= , Andreas Hindborg , Alice Ryhl , linux-kernel@vger.kernel.org, Wedson Almeida Filho Subject: Re: [PATCH 02/10] rust: alloc: introduce the `VecExt` trait Message-ID: In-Reply-To: <20240325195418.166013-3-wedsonaf@gmail.com> References: <20240325195418.166013-1-wedsonaf@gmail.com> <20240325195418.166013-3-wedsonaf@gmail.com> Feedback-ID: 71780778:user:proton Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 25.03.24 20:54, Wedson Almeida Filho wrote:> From: Wedson Almeida Filho = >=20 > Make `try_with_capacity`, `try_push`, and `try_extend_from_slice` > methods available in `Vec` even though it doesn't implement them. It is > implemented with `try_reserve` and `push_within_capacity`. >=20 > This is in preparation for switching to the upstream `alloc` crate. >=20 > Suggested-by: Gary Guo > Signed-off-by: Wedson Almeida Filho > --- > rust/kernel/alloc.rs | 1 + > rust/kernel/alloc/vecext.rs | 52 +++++++++++++++++++++++++++++++++++++ > rust/kernel/lib.rs | 1 + > rust/kernel/prelude.rs | 2 ++ > 4 files changed, 56 insertions(+) > create mode 100644 rust/kernel/alloc/vecext.rs >=20 > diff --git a/rust/kernel/alloc.rs b/rust/kernel/alloc.rs > index ccd4149932c3..8ad57a2e693e 100644 > --- a/rust/kernel/alloc.rs > +++ b/rust/kernel/alloc.rs > @@ -5,3 +5,4 @@ > #[cfg(not(test))] > #[cfg(not(testlib))] > mod allocator; > +pub mod vecext; > diff --git a/rust/kernel/alloc/vecext.rs b/rust/kernel/alloc/vecext.rs > new file mode 100644 > index 000000000000..59e92bab534e > --- /dev/null > +++ b/rust/kernel/alloc/vecext.rs > @@ -0,0 +1,52 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +//! Extensions to [`Vec`] for fallible allocations. > + > +use alloc::{collections::TryReserveError, vec::Vec}; > +use core::result::Result; > + > +/// Extensions to [`Vec`]. > +pub trait VecExt: Sized { > + /// Creates a new [`Vec`] instance with at least the given capacity. > + fn try_with_capacity(capacity: usize) -> Result; > + > + /// Appends an element to the back of the [`Vec`] instance. > + fn try_push(&mut self, v: T) -> Result<(), TryReserveError>; > + > + /// Pushes clones of the elements of slice into the [`Vec`] instance= . > + fn try_extend_from_slice(&mut self, other: &[T]) -> Result<(), TryRe= serveError> > + where > + T: Clone; All of the non `try_` prefix functions require=20 `not(no_global_oom_handling)`, so we could also drop the `try_` prefix here. What do you think? > +} > + > +impl VecExt for Vec { > + fn try_with_capacity(capacity: usize) -> Result { > + let mut v =3D Vec::new(); > + v.try_reserve(capacity)?; > + Ok(v) > + } > + > + fn try_push(&mut self, v: T) -> Result<(), TryReserveError> { > + if let Err(retry) =3D self.push_within_capacity(v) { > + self.try_reserve(1)?; > + let _ =3D self.push_within_capacity(retry); > + } > + Ok(()) > + } > + > + fn try_extend_from_slice(&mut self, other: &[T]) -> Result<(), TryRe= serveError> > + where > + T: Clone, > + { > + let extra_cap =3D self.capacity() - self.len(); > + if extra_cap > 0 { > + self.try_reserve(extra_cap)?; > + } I am confused, why are you doing this? Did you mean to do this?: let extra_cap =3D self.capacity() - self.len() - other.len(); --=20 Cheers, Benno > + > + for item in other { > + self.try_push(item.clone())?; > + } > + > + Ok(()) > + } > +} > diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs > index 51f30e55bd00..7f2841a18d05 100644 > --- a/rust/kernel/lib.rs > +++ b/rust/kernel/lib.rs > @@ -19,6 +19,7 @@ > #![feature(offset_of)] > #![feature(receiver_trait)] > #![feature(unsize)] > +#![feature(vec_push_within_capacity)] >=20 > // Ensure conditional compilation based on the kernel configuration wor= ks; > // otherwise we may silently break things like initcall handling. > diff --git a/rust/kernel/prelude.rs b/rust/kernel/prelude.rs > index ae21600970b3..a0177f195dec 100644 > --- a/rust/kernel/prelude.rs > +++ b/rust/kernel/prelude.rs > @@ -14,6 +14,8 @@ > #[doc(no_inline)] > pub use core::pin::Pin; >=20 > +pub use crate::alloc::vecext::VecExt; > + > #[doc(no_inline)] > pub use alloc::{boxed::Box, vec::Vec}; >=20 > -- > 2.34.1 >