From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id B3FABD4414B for ; Tue, 19 Nov 2024 11:46:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 51B0D6B009B; Tue, 19 Nov 2024 06:46:07 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 4CC036B009E; Tue, 19 Nov 2024 06:46:07 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 36B1D6B009F; Tue, 19 Nov 2024 06:46:07 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 17AEC6B009B for ; Tue, 19 Nov 2024 06:46:07 -0500 (EST) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id C4652403EE for ; Tue, 19 Nov 2024 11:46:06 +0000 (UTC) X-FDA: 82802664000.06.70DAD32 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) by imf25.hostedemail.com (Postfix) with ESMTP id 8DA9AA000D for ; Tue, 19 Nov 2024 11:45:28 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=jsMgq54B; spf=pass (imf25.hostedemail.com: domain of aliceryhl@google.com designates 209.85.221.46 as permitted sender) smtp.mailfrom=aliceryhl@google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1732016616; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=JKFNFU0TxSRVfbmDrokfeS6Zi7x7KpPj06RucnV2NPE=; b=fItebLmZ2971tEOZi7qxiO5yJ+e5iGSrrgGVvdFp58lCNJY9i9QLdqq957GplfNiCAUxUN ppZlP8l59o/u8dB39nezZrmjih/e8q5s1j4m40IFFjMU3CN3bk0sUPJqseENUeqZwJlvGn V9OH7ni9brEgj+LSSplKPF59QEatFOc= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1732016616; a=rsa-sha256; cv=none; b=uPUKm0xLTzsg8vH2JDNmuv9swRDNs9zlBmsil1W4IeowT9x4aX5zhPR6O137x3NvkDL++8 UdLjKrfzj3hJaMExxLWzAsZ1bI4vOlPZVW4eGYpWKha8kbl3xE6rzGGgEh8tMv5Mpgw/YW 4wjZ0hWilURo/VgD9Iaaz51jeqdB7QI= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=jsMgq54B; spf=pass (imf25.hostedemail.com: domain of aliceryhl@google.com designates 209.85.221.46 as permitted sender) smtp.mailfrom=aliceryhl@google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-382442b7d9aso739721f8f.1 for ; Tue, 19 Nov 2024 03:46:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1732016763; x=1732621563; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=JKFNFU0TxSRVfbmDrokfeS6Zi7x7KpPj06RucnV2NPE=; b=jsMgq54B0BCVuaUN6Gsqa2J8AEXA4dNnp1pVoEl/+49Omo9effmzEBWeAfeOoKO+MS rtoiy6Sh1BPTaPGp7ywW/YGUACPiyqeqfzo9I3ipy/gMlrDCKtxw7LzXCBaSRzFUU/1I +SL8Kb6eQJ+/7eV6AEczCP9cYPghTEwR/0z1DTkgU5PeaLLEbmnap9C+SaANn7qQ9tCc IJHBsRLpx4fsUPTYPNY9psEgwqMi2bl1wRM78qboxSpnBrInSjU2+eExQc9Etg2n2dsp Wn901SJ/kBXeXEWSxn4HsWYyiORC/EGL+dQ5pqsqeLv2e3hE87N3xN6kBpIAF8TgoUec d91A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732016763; x=1732621563; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JKFNFU0TxSRVfbmDrokfeS6Zi7x7KpPj06RucnV2NPE=; b=wGw5P/YQPXac5/e+97orLLEnoWu637uRd1spHJ1tD0dbdyDonMViQhs2Xurhl6213C S7Dg/SsfItZMO/tbBfqalPcHsMMYh1895hF8HYuTGVugHT5Y8k5NMmHPnFll7GjCYUqk Fu6su4McbtW+dbwM25+1qNfZyl9ZzRlRoaPaFvTvlQVEkLuBH3cKZWFwvekU45JL+IoR dxZBvqh9WkLwpDLPv0sATRShjnlh4xSAbpQLsUDjLb6fyb7jCZ4gDAEwTruRc6gfOmO9 Eyp3XB5Z/udShm7/6RjEx5h6CnN7+QCIENR2SDBWbo1UI+qXclexlLyiKQo4I7+hPPZV C0gw== X-Forwarded-Encrypted: i=1; AJvYcCVNDrfOLi89XOIWQodVopNoGCHa/tfZ6TE7o16TZ1x3ZGhHs2ocO7fuzC6OhcRa13ZxF3R/yjekzQ==@kvack.org X-Gm-Message-State: AOJu0Yy22CvpBU38Um+0gwtRpXaYpiP1cGsn06BZtlzG1khtl8RZicSW sjN8aLzvqa9x11N+df5ygaZ6Xdmp3taqzQy87BU9PZbg8Rmkkq4ft2GjAKDk7ctqM2z6/NfjCdg sVEUDbWHkHIyqmEkArC1YY4XsUzX6lTL9913F X-Google-Smtp-Source: AGHT+IGWejOR/TW8BG5tkq5cCrc9rUhPCdGE3X60q4JttnjZIq//FJLWmLVDtvwmRo/TQwBKnG0iQu0TvUX5ulQrW8I= X-Received: by 2002:a05:6000:1887:b0:382:44e0:c5e9 with SMTP id ffacd0b85a97d-38244e0ca0fmr6477944f8f.25.1732016763336; Tue, 19 Nov 2024 03:46:03 -0800 (PST) MIME-Version: 1.0 References: <20241119112408.779243-1-abdiel.janulgue@gmail.com> <20241119112408.779243-2-abdiel.janulgue@gmail.com> In-Reply-To: <20241119112408.779243-2-abdiel.janulgue@gmail.com> From: Alice Ryhl Date: Tue, 19 Nov 2024 12:45:51 +0100 Message-ID: Subject: Re: [PATCH v3 1/2] rust: page: use the page's reference count to decide when to free the allocation To: Abdiel Janulgue Cc: rust-for-linux@vger.kernel.org, Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?Q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , Danilo Krummrich , Wedson Almeida Filho , Valentin Obst , open list , Andrew Morton , "open list:MEMORY MANAGEMENT" , airlied@redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 8DA9AA000D X-Stat-Signature: tf5wj6djfxexz5f833hpoc1egjuraidf X-HE-Tag: 1732016728-612533 X-HE-Meta: U2FsdGVkX1/nRNqn+qo9n9Fio0hlBpMm0kkCyvheDNT+oeVaC46Xo2wC0SmWtGvIPIEOMXyBgNyRCIzxfMu3SVFrt9riTC8uxLUe+ftqSL4sleFVg4J2OLHOCeGuAYiHChmsj8T5YrBSJFG4J52OSxm8Si5LgO+58ikQTgZO6z+OAXZimMOSoEeAcPV13UlglpXEMwQ6kgLwdF9r20vvtPwpgXXluLhV6qCE2/qhJ8R2OVGx76PN93FQXBi1mf5+mZFZvgX3JMllpeWEjYkRrD1/4p/zEoz/EXZjGnsf2uqkhBUJ6/TmjOA/kSTp2gbm3uH682fYpHptyz18yIvOpjgUStJeuYCaldC5hMqfnYn3B9CaWNUUzrdO+FsuezqhrqTH81FLV14fbpasHMC1lO0clm+CfWO0Y10YIb4/Jrn8q+8m+E5YCnzsro0JJcMdh44mu3X12edT0HuXKIZb0+zOprzGIYT6TuMDWS+EXRQDHckTfimbmd2nOxA7gMI5kiJe3B3zhmzqiOOw0I8qK1YWOtY4vLYFVr/xifVC1Z6HmqkgXDbLgq70jQ3osV/lq0K9GCq1JOoKsyRHn4J+LjGAmp3RlNK8HD8N1dtYa3Yv0Z8oTEu4CuGwU4tlRhzb3xpV3pbhDx5uLvMGxYqnlHLwuRTZRT2LLjsmZd+jtJekqv4RIhXnvj2YxHe1HMDRhQ4V1CNmf8LNdbHhDLkXfyeDVJn+THrNeQFedVB19S2ky0517DaD+RYfODUADiMlFJInrWNpyk3zwhiGTkK83sMk6k8rBikoKKgHoHIpv3IjvS6fH0O0hOsLJhAQ5TZMSmgkI4GCpf63UYSwrKwbOuGXeCYbXsg+vvMh4yLyiaggwEmB//32+qnNbjiqLazAjTLj4y6kvT8eLYOmJUmTB2drYgG+Gr9hGXHKWVPwa+kOEgrWOk7AA4FcuZviOO3U1/VTJ+PfQhYlTNvU3oB saos+H7A WQ8I+CTjc0fEQju9CcIyZttTsi/0KMaUBFBbQxYOX/P14rcT0uiU3HJe97YvoheJDsyDmuiTSOsqx20Wgl1qt7KDuxswBQ1lZSY0k5WUGFx2MarxtjL5+TxZntVTSKND2K35uGBT/5btMikS/Hf6LUwFoeem2xnlW8BXgs/F3dFxL8KIwRbfjISsSZVuHvjmjmY3wkvYeUMAItJpt1jlpCdPreLSQYvLOdbpFLVTacLnXkohQxHmYomAMbcrxeU2MzHJPFTO+s1yzmFAh3oFgaFTsbcp1FztuFhjsEr+aJ5gRXIZi4YVDPl9iP/TQLHgy/P+t X-Bogosity: Ham, tests=bogofilter, spamicity=0.000704, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Tue, Nov 19, 2024 at 12:24=E2=80=AFPM Abdiel Janulgue wrote: > > Ensure pages returned by the constructor are always reference counted. > This requires that we replace the page pointer wrapper with Opaque instea= d > of NonNull to make it possible to cast to a Page pointer from a raw struc= t > page pointer which is needed to create an ARef instance. > > Signed-off-by: Abdiel Janulgue > -/// A pointer to a page that owns the page allocation. > +/// A pointer to a reference-counted page. > /// > /// # Invariants > /// > -/// The pointer is valid, and has ownership over the page. > +/// The pointer is valid. > +#[repr(transparent)] > pub struct Page { > - page: NonNull, > + page: Opaque, With this change, Page is no longer a pointer, nor does it contain a pointer. The documentation should be updated to reflect this. > // SAFETY: Pages have no logic that relies on them staying on a given th= read, so moving them across > @@ -71,19 +73,23 @@ impl Page { > /// let page =3D Page::alloc_page(GFP_KERNEL | __GFP_ZERO)?; > /// # Ok(()) } > /// ``` > - pub fn alloc_page(flags: Flags) -> Result { > + pub fn alloc_page(flags: Flags) -> Result, AllocError> { > // SAFETY: Depending on the value of `gfp_flags`, this call may = sleep. Other than that, it > // is always safe to call this method. > let page =3D unsafe { bindings::alloc_pages(flags.as_raw(), 0) }= ; > - let page =3D NonNull::new(page).ok_or(AllocError)?; > - // INVARIANT: We just successfully allocated a page, so we now h= ave ownership of the newly > - // allocated page. We transfer that ownership to the new `Page` = object. > - Ok(Self { page }) > + if page.is_null() { > + return Err(AllocError); > + } > + // CAST: Self` is a `repr(transparent)` wrapper around `bindings= ::page`. > + let ptr =3D page.cast::(); > + // INVARIANT: We just successfully allocated a page, ptr points = to the new `Page` object. > + // SAFETY: According to invariant above ptr is valid. > + Ok(unsafe { ARef::from_raw(NonNull::new_unchecked(ptr)) }) Why did you change the null check? You should be able to avoid changing anything but the last line. Alice