From mboxrd@z Thu Jan 1 00:00:00 1970 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 6BF0A21ADC4 for ; Tue, 29 Apr 2025 14:44:43 +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=1745937885; cv=none; b=srSh4KefjkEiFtubj+hcu3/8wV3oqlgvBE4T6OCGvP+UvKHrBOy4YPv0ZfNE9RJqkJyKMtV7xjQt+spCCdHMq5SzR2b8Mrs1YS5+Wstm3HAOMlBgo7YWpThtrRVFCZnqWRgAfFtENTfqih7frVT7nRD1H8aLcyTaygMnODqfiSs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745937885; c=relaxed/simple; bh=Hiakr7Y9aYp+t0qkrintpujLcwt0vMBhaVvBld3CMvQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=D4kPCpCj39voNSmnxReW1Z9zqhYoQghz4HpUvb6fHuBRWnFjLS/ZmfJGUaYjbrVWsN37K3iKx8fIO1Bwke2Spi911/myG0Ig66Npk1URpg4EiBZYqiS8WEcVe5Ud0zmKKhVAlFVvncRbXhkWJM7l6/Xo95lzB4tYRwafDn+pohU= 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=A6wIORcY; 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="A6wIORcY" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43d0830c3f7so47076195e9.2 for ; Tue, 29 Apr 2025 07:44:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1745937882; x=1746542682; 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=s939wDzCcsIUv32fGMnjwXbycHwC2LyhdpkAIZGUK8E=; b=A6wIORcY7pWBFLxQPxION0b/v80wbAr2uEwEIrOA5zKoVX6XzUVsCcGD35PUbLWZS3 8PF7aXaYV2/By54Lwh0HmjGy2u7+sIvtQZLE5cGP0cywc86Ms9etckedWn6mnXUtkzq9 XdAxsXp+yof5Fb/haJFKZMm3mqFwLO1G1YR5gvFaE0WikABtEWQkk5cSWyivnP/hCKtu ESWqOzJp/2PlI//epL0BTCYaYn4cDkebsmY4kTNk/Lid0r1AQSPkFdIIq1rIL4SDUY2u uV3h7GAh84zIhv5OSRP3yV6oU+wvnBxVkeB6/Ns/azTIXVyJpKzfEBZYmXwg+kPokDuc KLSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745937882; x=1746542682; 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=s939wDzCcsIUv32fGMnjwXbycHwC2LyhdpkAIZGUK8E=; b=qX3v+2pQbMLr04RrHKM1nig8+7zFeZTkcfB8LYcs3qrqyW14r4+KDLmRXzwTaclALz B6JAHUcRj0jHFA6Jx1dQp2Kg96fssl3ZhVkzwl2iFEuDwayvF6TdVrNoytH42kWN50S8 Lt2jmn0XU73QQyF9UbWwRSIeacIrzjcpde83gbZjENLzVJbHpoNldjZS+6/4a1js2vwb iBRuBvuBrM8rPg9bTgJwhF8JiDWbSvfFxthdGWCtMoS2yMl3b1YCf80KDphtybhMRO87 V5FfNMNTHheP06oEGyhqCw+nI+B0psz0B4a0xQeQilfyvmNThydO8awGnTHULezXf7HD HA9g== X-Forwarded-Encrypted: i=1; AJvYcCWOPi0oPfGzVM3jprQa29QZGYk53IwAwGZs7WKgVoEh4B9JmNjxHQ+yQEUNPjDbUMYbtPayHOLVSyNgbvpYng==@vger.kernel.org X-Gm-Message-State: AOJu0YwM62MWzURuVzCIuHby3DiUuHm7OBYUVxm1J17gt2MgZEy9ya2E yTiLOZidJ7IFb1cM97LmdqPbmlckGRldTgJNbzc7P4Pl/DS2SU5Tmzg+41b/TXF910ejUpL61HM TgN+MFwk0UwSsUw== X-Google-Smtp-Source: AGHT+IFD19DC6VNFdYNHaJ5B7QYfDpABloUHji8YWEgBpm0M3wFbbm8SDhfVUUEtTh/LkNEshZM3o0hDQuHw7n0= X-Received: from wmbbd17.prod.google.com ([2002:a05:600c:1f11:b0:440:5e10:a596]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:3b0a:b0:43c:f63c:babb with SMTP id 5b1f17b1804b1-441ac84b420mr30698235e9.1.1745937881832; Tue, 29 Apr 2025 07:44:41 -0700 (PDT) Date: Tue, 29 Apr 2025 14:44:22 +0000 In-Reply-To: <20250429-vec-methods-v4-0-dad4436ff82d@google.com> Precedence: bulk X-Mailing-List: rust-for-linux@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250429-vec-methods-v4-0-dad4436ff82d@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=1873; i=aliceryhl@google.com; h=from:subject:message-id; bh=Hiakr7Y9aYp+t0qkrintpujLcwt0vMBhaVvBld3CMvQ=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBoEOXSNUMSfaKjzrQ8//RXnlSgRBdfrVgIxEqPV n/6wNru+VKJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCaBDl0gAKCRAEWL7uWMY5 RlmiEACIdJOy+8wpGjYitzbsFLExkryvyKH+MbykJsYTYqDZjsQGFdT4+9q0q2womW5yrrag8qP vixnqJ4xGGBaLv0xtMD41UESRvHuV4xXuQYarqGC6vbmVWajdOSPjxH9H7kd9k+py7a92Cak0iT IxRmZ5RpcV9rZ9WEdXOthMC/5NtNTa1/TmMY9PJWHdjknsOUPdJP7d6jvf9Qa4wxieDJclJOBTg lBpTb+9E8fi5bsw3QZLN7nMPZoHBeYQvyA+poQ8qluFTVrg97OJdhVe+yCvbMeuSRC2FtEG+OrN bUKSg0pyq37oNY1KIxrViGFDhdhpTrP4gevrhUbToGV4zga5t/f6P69AUx7vchrpp2IwPlNXz+A qZvGjeHtSU3fPq405GorDflI2r4cTg0QjvxE1uDJOj/IdTqvjtzD6p/ikwStTLPWpefMYhGOB0m +ihAflNQutzotktkTvmXo+9w277W9ZuHV0ymKr/IjM+M90waKuvFIfdtmDW4wcoENHhrY9mQ7+7 HU/2+4d7ew1afSYyBjwW+20PlPEA4H7/8vI850aB0XEpvthp+pdRQ8hVmPtegeH0wpfXCiv0dSD rFTTLE93K9ycZ17yIPwhbAiarl+aHpUwCdn9egxavBn1CrTGt8mSVwLnq7dWKzJczWBkz4dgnci 5DsIGS28+xlpmDw== X-Mailer: b4 0.14.2 Message-ID: <20250429-vec-methods-v4-2-dad4436ff82d@google.com> Subject: [PATCH v4 2/7] rust: alloc: add Vec::pop From: Alice Ryhl To: Danilo Krummrich Cc: Matthew Maurer , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Alice Ryhl Content-Type: text/plain; charset="utf-8" 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 412a2fe3ce79a0681175bf358e8e0f628e77e875..ebca0cfd31c67f3ce13c4825d7039e34bb54f4d4 100644 --- a/rust/kernel/alloc/kvec.rs +++ b/rust/kernel/alloc/kvec.rs @@ -320,6 +320,37 @@ pub fn push(&mut self, v: T, flags: Flags) -> Result<(), AllocError> { Ok(()) } + /// Removes the last element from a vector and returns it, or `None` if it is empty. + /// + /// # Examples + /// + /// ``` + /// let mut v = 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 { + if self.is_empty() { + return None; + } + + let removed: *mut T = { + // SAFETY: We just checked that the length is at least one. + let slice = unsafe { self.dec_len(1) }; + // SAFETY: The argument to `dec_len` was 1 so this returns a slice of length 1. + unsafe { slice.get_unchecked_mut(0) } + }; + + // SAFETY: The guarantees of `dec_len` allow us to take ownership of this value. + Some(unsafe { removed.read() }) + } + /// Creates a new [`Vec`] instance with at least the given capacity. /// /// # Examples -- 2.49.0.901.g37484f566f-goog