From patchwork Fri Dec 20 06:18:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13916287 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (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 E1A4E19D88B; Fri, 20 Dec 2024 06:21:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675666; cv=none; b=A0i8QcIokDCvhwsSyk3EHQaqgHiypY35HaDoJZyvbG+19muImxSL6/xlLjsSv9TsdC7UOSlKhQ76NiNL+qVdPLbkFbdeddayiYkfz6NjGMNRCQpN8NC+c8MRUDO8/7jBMAt+qrFlK6fvoXPxtqOWPxc1ogK7qlE8EqKbrRiMv5w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675666; c=relaxed/simple; bh=Vc+8HUJI9ajHvEkwsTV8Xxd958VCwxmLyh0VR+NP/iw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kgbyUcxfKEcn0uGdoGjTM71wNhZ3V8/IBbAInYfGrdwKVEpWpUWOqy7oE3B1WgU+ZwKeqLF3Cr4Ta8wmfiz+NUEs9nc4xaNQvCqnME0hae0vhS3vSQ1ZIk6cMH4DYLKVhLaC8ywxp4iXDfnPtvnuKJrV6hyg9M8IDt8UtwocEXU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Q8xTPzjr; arc=none smtp.client-ip=209.85.210.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Q8xTPzjr" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-728f1e66418so1378831b3a.2; Thu, 19 Dec 2024 22:21:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734675664; x=1735280464; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HHj7ri5OVtg4QKKoVCyZMM8tEP6V7lzENuUM05/wz2w=; b=Q8xTPzjriJhneQTG6iWzE6XXo7e5NvtDahjGU7xjpqKmB1idMgrjlZJwKEltcUGD9O AyTSo7a/9wROTqbIJuYVBQgUwW8cK70mu42ke2dVy7oq1aasEb9Iw5hZYE0CWi5JCpA1 nbFDlCE3bwThBKxVKnhYDESaZA87PRVAwNrLFY4Ha46ryzGD8iWCQQ3222beup9yUftP ep0XwPrIJ0n0+haQJ4FhsPnBF4AfLiAvCZNvDvk8Gpqhng4+0EVdlQLdGlmwkJKTX0EK v2en/79NM9Pd+8rvDac/9ui/hJY+NbG2OUev9C034CORJKuT8GoaqhvbC+MZtQurv80Z iv4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734675664; x=1735280464; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HHj7ri5OVtg4QKKoVCyZMM8tEP6V7lzENuUM05/wz2w=; b=Fw8vuzDMAPsixxxxUERnYDi5j8bvfs73U6yLboo6AfpGfS96BynR17gVZdbDbdc2Nx rDGv8t8//t4PsTaCpWyL53cpGhekybJe6+AppqSMG2uvPdr+emhKJdoqWQTR72hrzLxS u9VMUIW+lOQWZIevTRstCtY+iDkvX0eurJart8xkN9571TVeTRMCb1zf/tHJVe4Y/wLF LjOF7MZS2z3RiZPOM7pDxgZ5NbsnbOcC1wYNeTVyHoIbgAac6vR1aVuH5Bl90Fm5Wk/y DILC2m2L/7wr7LDuL5Ru/Jg20sNIChxlZ66RtaTHc3uXuBlvaooqdO62tODR2rUdBAMU f8GQ== X-Forwarded-Encrypted: i=1; AJvYcCU5nomfnAIC7gHvmNn0OeeXFIjJJAals3a0j3zLgYLfh7O8R8s4CEfr6nOe7LyKdwSJvzPgDlM=@vger.kernel.org, AJvYcCUz+U4lhX8u9O81M05ZpWlfO5BhyalnvmC07ulw7q6ZbcqAHF45cPTMLddWR3vJhA0ihlR5Q1HGmnGGJ26MkXE=@vger.kernel.org X-Gm-Message-State: AOJu0YxQdL4IuxA/v+56E5Iho5Z8xH/fhv4M5bSV8XedFpjRLvVtQNMC 0OOCyx3jtQxW4GZRjeV11nbOrSDCLUj7oBR+i7eN4ezY3e9fS3B4eKiSVuC0 X-Gm-Gg: ASbGncutou32eFPTsvxRCxxOjLe/5rNP3om+n0aSy5qCbB8y9L0Whicr9/agCs5hkFi OTuVF0pVQKwWqlxEFXzWSSgvyFXgowaNDghAKZ1G4rNOc1BKRrRJuarXXEu7JEwEEmO+EZgutcD 8KIennHN2C31DwGtlJ/yJ7Qny6Tn7FPd+gkhYXh/6dnkEsZdg9p2MuhwQCuVMzPlWG7tZ5L27Ai zAjDe9XA9UyVgufxr9N0hyMBq6UjWrSPqZ0Z1Ur59Hwfno/wSJ1VMSWvDP4YUGEEYw7F2aiNW5d 3w0ddO9mSoZPOtmaGw== X-Google-Smtp-Source: AGHT+IG7D6MbXLp2ExvCaSV05bTT8A1MXC2sr0IaBVywXBIdDRJbaDSpvvsL7c3fPIz6BgPPRX3acA== X-Received: by 2002:a05:6a00:2181:b0:729:49a:2db0 with SMTP id d2e1a72fcca58-72abdebf27cmr2065656b3a.25.1734675663978; Thu, 19 Dec 2024 22:21:03 -0800 (PST) Received: from snail23.. (p7659208-ipoefx.ipoe.ocn.ne.jp. [221.188.16.207]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-842b1ce01d3sm2158548a12.23.2024.12.19.22.20.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2024 22:21:03 -0800 (PST) From: FUJITA Tomonori To: linux-kernel@vger.kernel.org Cc: Trevor Gross , Alice Ryhl , rust-for-linux@vger.kernel.org, netdev@vger.kernel.org, andrew@lunn.ch, hkallweit1@gmail.com, ojeda@kernel.org, alex.gaynor@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@samsung.com, anna-maria@linutronix.de, frederic@kernel.org, tglx@linutronix.de, arnd@arndb.de, jstultz@google.com, sboyd@kernel.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, vschneid@redhat.com Subject: [PATCH v7 1/7] rust: time: Add PartialEq/Eq/PartialOrd/Ord trait to Ktime Date: Fri, 20 Dec 2024 15:18:47 +0900 Message-ID: <20241220061853.2782878-2-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241220061853.2782878-1-fujita.tomonori@gmail.com> References: <20241220061853.2782878-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add PartialEq/Eq/PartialOrd/Ord trait to Ktime so two Ktime instances can be compared to determine whether a timeout is met or not. Use the derive implements; we directly touch C's ktime_t rather than using the C's accessors because it is more efficient and we already do in the existing code (Ktime::sub). Reviewed-by: Trevor Gross Reviewed-by: Alice Ryhl Signed-off-by: FUJITA Tomonori --- rust/kernel/time.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/kernel/time.rs b/rust/kernel/time.rs index 379c0f5772e5..48b71e6641ce 100644 --- a/rust/kernel/time.rs +++ b/rust/kernel/time.rs @@ -27,7 +27,7 @@ pub fn msecs_to_jiffies(msecs: Msecs) -> Jiffies { /// A Rust wrapper around a `ktime_t`. #[repr(transparent)] -#[derive(Copy, Clone)] +#[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord)] pub struct Ktime { inner: bindings::ktime_t, } From patchwork Fri Dec 20 06:18:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13916288 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (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 A7FB819992E; Fri, 20 Dec 2024 06:21:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675673; cv=none; b=hGSyfi+7wBD+UZTjHpUwCX8r87Jw7OJub7E9Ge5agrvYjZ5NHeXIj1/foXdEQpJUGBLHvgpAV8cdKPye535dufqBFKGSWunKb9TQOkDizIF4vX6vSSTbmAY5ss0yL/wdoz4Tq2xmLmGweDOK79wVLj57OGIomAgKY09Ew9iQf7U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675673; c=relaxed/simple; bh=CNoU4j5DemidNSsl2YlTp/ZxnKxH4rxzD9POXhZ+6rg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YZd4D7omofZFiQLH2K13LlvhrZ04+CTes56SGLkoiKahnNWx+qRUcGVS3R7xjLBn8HZ5i+VTnQ9frvDoiGEY6tvDRyiyMJuZ3yzdxoB9vWKFTabFfkZ9Breystcd+jX7ClQJbFgc5dDGwRQenZYZf9uAV4CiQW27M546+AWr1AM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HP//NTQC; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HP//NTQC" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-728f337a921so1670291b3a.3; Thu, 19 Dec 2024 22:21:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734675670; x=1735280470; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JybksRFzIQq0QOOnjY7EbBhGN4P7Dv0rI/iDUoagoPM=; b=HP//NTQCI71V7tG5U0M6B1gXdJ/o2E8rJMreudSviqkRKLWFZW5HCMxXSbDPYXRASH ax9+AcEDQDOxpi/ZyD7C7UvMRGuBdoHV2GzxvRcPXdFZo6ke1j6v7JQRIiw7Gxu73nqi eZ0C2VWc5f6NMniq5XlNY4F0NcSLJkwgs62tFcnH2EgzsIHz1vaHiBelGVbCPyrDlRP/ 1b2huwsYeguLTU2u/QSLPMDujKqUB78EP0RxvDUxTBegp/iVoVJnN60jGBVLI1yED7H9 AiqMhIat6o9ArwKnTREnmZ2jlEqRigZ0P3IrsuhIdxwYVmaVj7KURNOaui3gHQ8CM9gX ICWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734675670; x=1735280470; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JybksRFzIQq0QOOnjY7EbBhGN4P7Dv0rI/iDUoagoPM=; b=ccF8j0Bp+j58zsr49elYpjjmG3kOA0O/8lBhLUGXYeb36DdVoNcmn78xNgBabNtd2W nEHyZw6GS1KD/v04+mQXLDb3ZUGTw4l8K1kwJ3j1T99Q4mymU1LrSM5AlB6s+SLevMup jCQZ2+TBiixCVczOlIMcVBOSRNM2a7Y6RhNjzbZ+O85tyTxWzkIr9o0AHut/vY0q4SL6 uEGivoCDvCvVcG2ZMLQMaqCJO6JpHBne7tPdBxR0sSRG2EtWol2Jlw57hJFB8J2aSmwj CiU7iACY7drjhMME24gv3IN5avakv7fN0t1F7q1AYxqiRMSRwbgE99cfZPW1pu1PJSaI tO2g== X-Forwarded-Encrypted: i=1; AJvYcCUNwucPskVFgezUp1xN/KogZQlNq5EDhuK76Fr8aoD8BQtqButUOFd3C5epFTEv4G3+oS/WltorNLuTaUUp4wg=@vger.kernel.org, AJvYcCX8B6LhxJr2ZHYqEfhgmeAYTS2/z44Cu2YMuFVezAlz//tgQDZ3+J/kFQU09UFBQPbwXDqUffo=@vger.kernel.org X-Gm-Message-State: AOJu0Yztv7GO8iNFrZkz1CGSRlk2aaDyfNYLSngW3XcEXxwUuSjhbNor nFJyRR+mInk3SRJF32oQe0Un3/QwMN3XMwiEzS6fuPj57EUxIMiljVpdYl0+ X-Gm-Gg: ASbGncuczTYT0vcSqogFwfL2k38x481ogPo81COvdoVhUhCI5iEslScbro0H2mlwJAo 08gqC3OcFr6BtmY9FPLyLLepHOYY8gx8WTgC07aVJCczFv9pklE3t5V1OLyOXWloiQMB9EwsX+/ Cmy49gJTsZmvmeZ4BItLJ9BECq7BiQbPlOZXduUYHks48N70rlw3oic9ES8JfiN6TLJld6BvvL7 VPXoikniINId4CkyM8kAUxf81sPoNoqG9B0LN2nJeGGET4OkFSYenCZwTe5mn8q6usvjayk2173 452PVnrHTOPsOvauZQ== X-Google-Smtp-Source: AGHT+IG19mcv21P2d2vJSQG45OU3NBCDfrtktwnunWgNY4wcL35ZaRl+SNGmky9n5T3eNEKVbK8o3g== X-Received: by 2002:a05:6a21:9985:b0:1e1:b183:2243 with SMTP id adf61e73a8af0-1e5e08432ecmr3394485637.39.1734675669726; Thu, 19 Dec 2024 22:21:09 -0800 (PST) Received: from snail23.. (p7659208-ipoefx.ipoe.ocn.ne.jp. [221.188.16.207]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-842b1ce01d3sm2158548a12.23.2024.12.19.22.21.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2024 22:21:09 -0800 (PST) From: FUJITA Tomonori To: linux-kernel@vger.kernel.org Cc: Andrew Lunn , rust-for-linux@vger.kernel.org, netdev@vger.kernel.org, hkallweit1@gmail.com, tmgross@umich.edu, ojeda@kernel.org, alex.gaynor@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@samsung.com, aliceryhl@google.com, anna-maria@linutronix.de, frederic@kernel.org, tglx@linutronix.de, arnd@arndb.de, jstultz@google.com, sboyd@kernel.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, vschneid@redhat.com Subject: [PATCH v7 2/7] rust: time: Introduce Delta type Date: Fri, 20 Dec 2024 15:18:48 +0900 Message-ID: <20241220061853.2782878-3-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241220061853.2782878-1-fujita.tomonori@gmail.com> References: <20241220061853.2782878-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Introduce a type representing a span of time. Define our own type because `core::time::Duration` is large and could panic during creation. time::Ktime could be also used for time duration but timestamp and timedelta are different so better to use a new type. i64 is used instead of u64 to represent a span of time; some C drivers uses negative Deltas and i64 is more compatible with Ktime using i64 too (e.g., ktime_[us|ms]_delta() APIs return i64 so we create Delta object without type conversion. i64 is used instead of bindings::ktime_t because when the ktime_t type is used as timestamp, it represents values from 0 to KTIME_MAX, which different from Delta. Delta::from_[millis|secs] APIs take i64. When a span of time overflows, i64::MAX is used. Reviewed-by: Andrew Lunn Signed-off-by: FUJITA Tomonori --- rust/kernel/time.rs | 63 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/rust/kernel/time.rs b/rust/kernel/time.rs index 48b71e6641ce..55a365af85a3 100644 --- a/rust/kernel/time.rs +++ b/rust/kernel/time.rs @@ -8,9 +8,15 @@ //! C header: [`include/linux/jiffies.h`](srctree/include/linux/jiffies.h). //! C header: [`include/linux/ktime.h`](srctree/include/linux/ktime.h). +/// The number of nanoseconds per microsecond. +pub const NSEC_PER_USEC: i64 = bindings::NSEC_PER_USEC as i64; + /// The number of nanoseconds per millisecond. pub const NSEC_PER_MSEC: i64 = bindings::NSEC_PER_MSEC as i64; +/// The number of nanoseconds per second. +pub const NSEC_PER_SEC: i64 = bindings::NSEC_PER_SEC as i64; + /// The time unit of Linux kernel. One jiffy equals (1/HZ) second. pub type Jiffies = crate::ffi::c_ulong; @@ -81,3 +87,60 @@ fn sub(self, other: Ktime) -> Ktime { } } } + +/// A span of time. +#[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Debug)] +pub struct Delta { + nanos: i64, +} + +impl Delta { + /// Create a new `Delta` from a number of microseconds. + #[inline] + pub const fn from_micros(micros: i64) -> Self { + Self { + nanos: micros.saturating_mul(NSEC_PER_USEC), + } + } + + /// Create a new `Delta` from a number of milliseconds. + #[inline] + pub const fn from_millis(millis: i64) -> Self { + Self { + nanos: millis.saturating_mul(NSEC_PER_MSEC), + } + } + + /// Create a new `Delta` from a number of seconds. + #[inline] + pub const fn from_secs(secs: i64) -> Self { + Self { + nanos: secs.saturating_mul(NSEC_PER_SEC), + } + } + + /// Return `true` if the `Detla` spans no time. + #[inline] + pub fn is_zero(self) -> bool { + self.as_nanos() == 0 + } + + /// Return `true` if the `Detla` spans a negative amount of time. + #[inline] + pub fn is_negative(self) -> bool { + self.as_nanos() < 0 + } + + /// Return the number of nanoseconds in the `Delta`. + #[inline] + pub fn as_nanos(self) -> i64 { + self.nanos + } + + /// Return the smallest number of microseconds greater than or equal + /// to the value in the `Delta`. + #[inline] + pub fn as_micros_ceil(self) -> i64 { + self.as_nanos().saturating_add(NSEC_PER_USEC - 1) / NSEC_PER_USEC + } +} From patchwork Fri Dec 20 06:18:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13916289 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (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 E6B8019992E; Fri, 20 Dec 2024 06:21:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675678; cv=none; b=nKq/Oadbh4CD1cJzVVFTSBaEnPood4piqwtggPqwLctl27OfDJSSBhFVYf4BnEfoa6Ckktcy04b2M9grLIsg9JA6eurVP7sOedfSq7fi764ggHkbro82y1IBSlyJ7J84td9zKC26mnJh4g1moTNZExnKoXHOFdejHewccKYzPjQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675678; c=relaxed/simple; bh=ZXb/0NiUcW1nSbcWaHbSM4MFinXMLJootRsCvXQzwhg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eEMONKded6LnWuPlGUhoYTSGTQTrBrwvqdriP6HSvmx2P4RRVyAnsAkUfZ7g5l389tAc4almKGpgXFqpNKk2wwJO85H6A2KnPY9IUKuceRxXtLTExLQ771OB1s4+3ervLhqvY1sZxi6FBQ06ociH7OsqmNbnpQR9lmXxGOx0R0M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NnkaX3jB; arc=none smtp.client-ip=209.85.210.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NnkaX3jB" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-728ea1573c0so1368583b3a.0; Thu, 19 Dec 2024 22:21:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734675676; x=1735280476; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+lsSO3XnrzhExT+J3VC9DmPLXbd0JuCQEKEpxIJs/0E=; b=NnkaX3jBcu5yzEK9nGwZjsoBwsy42J/bn4dD8RUocc485sbZGjZe0vDtO+LbgqxL5s m9Zq4gPX9SIvO4FT1xPI12HX+w0xRxUprULQ3ZStlrqzMfJZI9hReL2lVKO/zf0h6nIX 7oWDs1i3HK/RamjnEbkxZSzr/OamUUT+IbP5T+wWSv/AiM8pAYfmBBXGG9Z7/ML8eieD 1Cnncw1dJTP07xxEmsxFLITGc3Ym7r1EX/goSfZAgi5YYhzarIj30T9/ditceAEirOY2 PuDwuDvNDHpJSLJ6ii+WTKS1TSI/lbiT6RrdVYGloRyuC5Bkzq0nFph4xfqErjM0HR3S MuvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734675676; x=1735280476; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+lsSO3XnrzhExT+J3VC9DmPLXbd0JuCQEKEpxIJs/0E=; b=NHMsZ5KZJ/rXz7CLEc+kpLWMuaqp45T2a52gaJOPRfoc8zoPDfV3BUMO4cpIHIh5i1 mVSkclolbmzpc1GiepXyyuTSPMykkh2r9dgUSqFJeCR1FWE6UuOjKEPZSNAJkNVqLysz 5fFLyBs+yGgoVsv8TJijCY6NBTvPZVGsqwn3zG1zsJlktcGRZsMa6DhUDqPragAXJHf9 KVvTt+WplMbAm6wz445NncsH66vEOp7WZRyNA9D1fBD7vmeWPp8uoBN+uMPC6Ok1N89X 8WFc9to4CMDjtVEGfiYKX5wZDNZXRKLDPhnPOfckn5q8IqsoBEmDzluAHyUOAx51LEZy JX8Q== X-Forwarded-Encrypted: i=1; AJvYcCVN8x0K7BA3eDbE75wf8Ro4LP/YM3wWvYq7FUjCHqzuIiFq3k3aPS5zBkM8DX2qZCFaDn5XMxA=@vger.kernel.org, AJvYcCVvbksaGFHvggexY95WWCbTkuqCnBNgmUEDMzQgQsFnQUCrevnHsrpr7alkL1jSjSmuvQUE999lTwuMmc93Qgw=@vger.kernel.org X-Gm-Message-State: AOJu0Yy8KCBEv0g7F6CwJPwOZnwJ74Ovz+Y3b2lW05uIdqeInhWz6G30 Hvxuet3/L5FtZoYLjKrrJ3wXf1OBicmGqpAiGl5MKLm+wv8L3P8PNa+q4JmL X-Gm-Gg: ASbGnctbE035zstUIx5Yl6/wJNpl0FlVlSki9mqA0SZvQNyS2qmMpIA0FSEodSL1UER d5oK/JDokhfVCVrztsJGC9Vjhpi471leI1iaq0RJ7xCZYzRHOtw8Ci086ngXp0czjNy7DBWTyWo IzYRI7eCjPebd3Qymd+YbbKJbRaTiZl9E3nkBoCVowRe69AVTeT+GlSgSQT1krx/ucQUhe9tnD7 1QfkNyhpJdqTHaQEJtLXqPA2rHwFnMFr9SJtKlcfYkniOnYW032Il/KojziQn5RYRkE1FYbROdd cG3xqeoNmhl2bj+PmA== X-Google-Smtp-Source: AGHT+IHYRh/hiGPAcCFwkd14QTEDgHU+GnCBivxSODUgKP0REflraKvEy+dDEn0KGk1FyUJ3fyjtDw== X-Received: by 2002:a05:6a00:2c86:b0:725:cfa3:bc76 with SMTP id d2e1a72fcca58-72abdd4f2a7mr2880171b3a.4.1734675675736; Thu, 19 Dec 2024 22:21:15 -0800 (PST) Received: from snail23.. (p7659208-ipoefx.ipoe.ocn.ne.jp. [221.188.16.207]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-842b1ce01d3sm2158548a12.23.2024.12.19.22.21.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2024 22:21:15 -0800 (PST) From: FUJITA Tomonori To: linux-kernel@vger.kernel.org Cc: Boqun Feng , rust-for-linux@vger.kernel.org, netdev@vger.kernel.org, andrew@lunn.ch, hkallweit1@gmail.com, tmgross@umich.edu, ojeda@kernel.org, alex.gaynor@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@samsung.com, aliceryhl@google.com, anna-maria@linutronix.de, frederic@kernel.org, tglx@linutronix.de, arnd@arndb.de, jstultz@google.com, sboyd@kernel.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, vschneid@redhat.com Subject: [PATCH v7 3/7] rust: time: Introduce Instant type Date: Fri, 20 Dec 2024 15:18:49 +0900 Message-ID: <20241220061853.2782878-4-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241220061853.2782878-1-fujita.tomonori@gmail.com> References: <20241220061853.2782878-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Introduce a type representing a specific point in time. We could use the Ktime type but C's ktime_t is used for both timestamp and timedelta. To avoid confusion, introduce a new Instant type for timestamp. Rename Ktime to Instant and modify their methods for timestamp. Implement the subtraction operator for Instant: Delta = Instant A - Instant B The operation never overflows (Instant ranges from 0 to `KTIME_MAX`). Reviewed-by: Boqun Feng Signed-off-by: FUJITA Tomonori --- rust/kernel/time.rs | 48 +++++++++++++++------------------------------ 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/rust/kernel/time.rs b/rust/kernel/time.rs index 55a365af85a3..da54a70f8f1f 100644 --- a/rust/kernel/time.rs +++ b/rust/kernel/time.rs @@ -31,59 +31,43 @@ pub fn msecs_to_jiffies(msecs: Msecs) -> Jiffies { unsafe { bindings::__msecs_to_jiffies(msecs) } } -/// A Rust wrapper around a `ktime_t`. +/// A specific point in time. #[repr(transparent)] #[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord)] -pub struct Ktime { +pub struct Instant { + // Range from 0 to `KTIME_MAX`. inner: bindings::ktime_t, } -impl Ktime { - /// Create a `Ktime` from a raw `ktime_t`. +impl Instant { + /// Create a `Instant` from a raw `ktime_t`. #[inline] - pub fn from_raw(inner: bindings::ktime_t) -> Self { + fn from_raw(inner: bindings::ktime_t) -> Self { Self { inner } } /// Get the current time using `CLOCK_MONOTONIC`. #[inline] - pub fn ktime_get() -> Self { + pub fn now() -> Self { // SAFETY: It is always safe to call `ktime_get` outside of NMI context. Self::from_raw(unsafe { bindings::ktime_get() }) } - /// Divide the number of nanoseconds by a compile-time constant. #[inline] - fn divns_constant(self) -> i64 { - self.to_ns() / DIV - } - - /// Returns the number of nanoseconds. - #[inline] - pub fn to_ns(self) -> i64 { - self.inner - } - - /// Returns the number of milliseconds. - #[inline] - pub fn to_ms(self) -> i64 { - self.divns_constant::() + /// Return the amount of time elapsed since the `Instant`. + pub fn elapsed(&self) -> Delta { + Self::now() - *self } } -/// Returns the number of milliseconds between two ktimes. -#[inline] -pub fn ktime_ms_delta(later: Ktime, earlier: Ktime) -> i64 { - (later - earlier).to_ms() -} - -impl core::ops::Sub for Ktime { - type Output = Ktime; +impl core::ops::Sub for Instant { + type Output = Delta; + // never overflows #[inline] - fn sub(self, other: Ktime) -> Ktime { - Self { - inner: self.inner - other.inner, + fn sub(self, other: Instant) -> Delta { + Delta { + nanos: self.inner - other.inner, } } } From patchwork Fri Dec 20 06:18:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13916290 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (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 74E8F19992E; Fri, 20 Dec 2024 06:21:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675684; cv=none; b=THIk9wKpO8Rkd21b5P2c3jKV9X9vhuh+kZMlpvP0KSZJZpAKePNlyyUH1eMsIE2pVp8I1hMfq0bnbZUko8/Vm0sQzXruRLYnrrzms7oZYurCPnHC7bUljospTSZN8Jnwdssetyf2p7WxFhWO/GoW6xwnw5E1MsUV0DXjLky8xdA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675684; c=relaxed/simple; bh=O+kqL+5YpnCiY6731vR15kXmZyQfCfEoPbqW1DePO80=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L4Asa36GLZr9TIv+t8mAXIUqmhRW4fKTYwVkDWZfEmq5gC+yYKLciH1Yo5rTZni1KyG/XP7I5fvSwwiIsolSkKvrmakOL/7UgB6KPm8RJOrnDKcaCQb7k3YvTLT0M9WGLpQUCOOYbbdys5BirVjhn6e9KJ1LmwX3U/BQXe5MfEg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NgBkFtTB; arc=none smtp.client-ip=209.85.210.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NgBkFtTB" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-728eccf836bso1392321b3a.1; Thu, 19 Dec 2024 22:21:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734675682; x=1735280482; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=tG2rfgEzsdeXdQBcUUB2Ws17wlCYVB4wC33Z9prKhtg=; b=NgBkFtTBzxOww80uvHyrx5t4TvhEEqxOBIzucCyObGnEQsKw+aqCWGpjfhej5w+lCX lFQAoY9WDeblLETkksJdnsV7Gl3j7M7Sb9SanPaj1Y4j69bWwQRYoYK35JRdBKMRXDvi LcNyVeqcWvS01qf2RVqwgoxdp8pKZrhjjKkwaW3etz+VeurcrEwG/bQLyrrpWOc00pNA FgoRu4YbsKSB3AxomkjJLwL7KPp8CxejjlZXNpyPiVb9A4QENbqlu5k4Cq7Zi4fbeCKX gtTaA6rAosFe00rShRKztGUISW3qOfWjIylH8kez8rOAeihKeqm41gBh4WeGTHvQX7bG eSNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734675682; x=1735280482; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tG2rfgEzsdeXdQBcUUB2Ws17wlCYVB4wC33Z9prKhtg=; b=tGpFXgvYsEMSzFNBgnjLz3hzavuyI8whiv+BXPasKzWgQfY90eIRqe2o2PVB6ik2XP ObPCrCwRQYckFqJ3jcxeZYsWvcUJXHl6mZ0LRRlAjfH4WG+0BQkbb2beGaQFwBelGWms IYXHtVZHYclhyQ6vuRmQpEV9jTK+mQq0Zo6MQFYeL+zBFbG3C5vTN8KVq2IPLVPt+aWo 967k4r87VvodqmneMkm2/9OAhiMAlIqbF0larkgPpSv4OScB4gNUrx4oZ2hb2Bm1gBLo 7kILKtcLDfiT1zs6Lolfd4IsxJ8kcLudOakjfa48lxT2t/VFhgjC44SS77RtRlqxI0YW ldjg== X-Forwarded-Encrypted: i=1; AJvYcCWtOkrIADIaR9ncJlKhUD/qXKU1YPI/EwCx9WOZSVBlDHht2vr6jtnpbYU8TF7RomKvQ0HHVrA=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6IppG4NQJ+mVIk65Xk14htNmV/KSaXfL8xwS42T9eCB1mlDyD 9390UA8qrayuAqawOOfaUwXDqv+LDzTQkAl13tBTKEBLedrNfHqzYdfi+rsI X-Gm-Gg: ASbGncsINLOFD3FZ2qfYmEmlNYPGR0ClGJgihMZApMKQgNV1jSQpAB7XolvT3lblupP 5/0QGORecJ5zFsCOHR9UKjj0iUTXhrAZVF+Z3ECIZ9xHQWTG+/niyfZrrO/3uoe1dRwxBoT78Uf qBFVfTR4w+6Oqlt7xh2zfdqGt5M0yLug3nmR2UqC34VnHcrDkjsepcVuCxVjuTC5xFhjra3kN+8 nHT7RyJS/sGZg8g+c5AeUm+yDUHSYt0QsnW5psTCrbMGQ1KZVlDN5ZJaDgiNHyDRFRZrmD2TVSt NNohbqsmQWfMPEYFHg== X-Google-Smtp-Source: AGHT+IE1wG7gLPDsT2g+E96Z9HzGH5uyMJk3oD1PE18TWJfGKwR0wVEzlByk/HLfvXH9fiu1Nb62PQ== X-Received: by 2002:a05:6a00:44c4:b0:725:e405:6df7 with SMTP id d2e1a72fcca58-72abdd7f683mr2540509b3a.10.1734675681495; Thu, 19 Dec 2024 22:21:21 -0800 (PST) Received: from snail23.. (p7659208-ipoefx.ipoe.ocn.ne.jp. [221.188.16.207]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-842b1ce01d3sm2158548a12.23.2024.12.19.22.21.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2024 22:21:21 -0800 (PST) From: FUJITA Tomonori To: linux-kernel@vger.kernel.org Cc: rust-for-linux@vger.kernel.org, netdev@vger.kernel.org, andrew@lunn.ch, hkallweit1@gmail.com, tmgross@umich.edu, ojeda@kernel.org, alex.gaynor@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@samsung.com, aliceryhl@google.com, anna-maria@linutronix.de, frederic@kernel.org, tglx@linutronix.de, arnd@arndb.de, jstultz@google.com, sboyd@kernel.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, vschneid@redhat.com Subject: [PATCH v7 4/7] rust: time: Add wrapper for fsleep function Date: Fri, 20 Dec 2024 15:18:50 +0900 Message-ID: <20241220061853.2782878-5-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241220061853.2782878-1-fujita.tomonori@gmail.com> References: <20241220061853.2782878-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add a wrapper for fsleep, flexible sleep functions in `include/linux/delay.h` which typically deals with hardware delays. The kernel supports several `sleep` functions to handle various lengths of delay. This adds fsleep, automatically chooses the best sleep method based on a duration. `sleep` functions including `fsleep` belongs to TIMERS, not TIMEKEEPING. They are maintained separately. rust/kernel/time.rs is an abstraction for TIMEKEEPING. To make Rust abstractions match the C side, add rust/kernel/time/delay.rs for this wrapper. fsleep() can only be used in a nonatomic context. This requirement is not checked by these abstractions, but it is intended that klint [1] or a similar tool will be used to check it in the future. Link: https://rust-for-linux.com/klint [1] Signed-off-by: FUJITA Tomonori --- rust/helpers/helpers.c | 1 + rust/helpers/time.c | 8 ++++++++ rust/kernel/time.rs | 4 +++- rust/kernel/time/delay.rs | 43 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 rust/helpers/time.c create mode 100644 rust/kernel/time/delay.rs diff --git a/rust/helpers/helpers.c b/rust/helpers/helpers.c index dcf827a61b52..d16aeda7a558 100644 --- a/rust/helpers/helpers.c +++ b/rust/helpers/helpers.c @@ -26,6 +26,7 @@ #include "slab.c" #include "spinlock.c" #include "task.c" +#include "time.c" #include "uaccess.c" #include "vmalloc.c" #include "wait.c" diff --git a/rust/helpers/time.c b/rust/helpers/time.c new file mode 100644 index 000000000000..7ae64ad8141d --- /dev/null +++ b/rust/helpers/time.c @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include + +void rust_helper_fsleep(unsigned long usecs) +{ + fsleep(usecs); +} diff --git a/rust/kernel/time.rs b/rust/kernel/time.rs index da54a70f8f1f..3be2bf578519 100644 --- a/rust/kernel/time.rs +++ b/rust/kernel/time.rs @@ -2,12 +2,14 @@ //! Time related primitives. //! -//! This module contains the kernel APIs related to time and timers that +//! This module contains the kernel APIs related to time that //! have been ported or wrapped for usage by Rust code in the kernel. //! //! C header: [`include/linux/jiffies.h`](srctree/include/linux/jiffies.h). //! C header: [`include/linux/ktime.h`](srctree/include/linux/ktime.h). +pub mod delay; + /// The number of nanoseconds per microsecond. pub const NSEC_PER_USEC: i64 = bindings::NSEC_PER_USEC as i64; diff --git a/rust/kernel/time/delay.rs b/rust/kernel/time/delay.rs new file mode 100644 index 000000000000..db5c08b0f230 --- /dev/null +++ b/rust/kernel/time/delay.rs @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Delay and sleep primitives. +//! +//! This module contains the kernel APIs related to delay and sleep that +//! have been ported or wrapped for usage by Rust code in the kernel. +//! +//! C header: [`include/linux/delay.h`](srctree/include/linux/delay.h). + +use super::Delta; +use crate::ffi::c_ulong; + +/// Sleeps for a given duration at least. +/// +/// Equivalent to the kernel's [`fsleep`], flexible sleep function, +/// which automatically chooses the best sleep method based on a duration. +/// +/// `delta` must be 0 or greater and no more than `u32::MAX / 2` microseconds. +/// If a value outside the range is given, the function will sleep +/// for `u32::MAX / 2` microseconds (= ~2147 seconds or ~36 minutes) at least. +/// +/// This function can only be used in a nonatomic context. +pub fn fsleep(delta: Delta) { + // The argument of fsleep is an unsigned long, 32-bit on 32-bit architectures. + // Considering that fsleep rounds up the duration to the nearest millisecond, + // set the maximum value to u32::MAX / 2 microseconds. + const MAX_DURATION: Delta = Delta::from_micros(u32::MAX as i64 >> 1); + + let duration = if delta > MAX_DURATION || delta.is_negative() { + // TODO: add WARN_ONCE() when it's supported. + MAX_DURATION + } else { + delta + }; + + // SAFETY: FFI call. + unsafe { + // Convert the duration to microseconds and round up to preserve + // the guarantee; fsleep sleeps for at least the provided duration, + // but that it may sleep for longer under some circumstances. + bindings::fsleep(duration.as_micros_ceil() as c_ulong) + } +} From patchwork Fri Dec 20 06:18:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13916291 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (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 24CEC19992E; Fri, 20 Dec 2024 06:21:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675689; cv=none; b=qLK/5q2vqBtGBqaWl/I0qyrqyv+ijjHq+WEb7ijUGJThHS9U+J8AtJ/pWYEZvlST/+Z1vUH2S2syZg1UL32MEDaZcNZATk6UAxPETYc7Duy4YqH9hPby62iL1z1wXVnOzPQSpaqhd6PnZJRL5TjMDpq0hZKNhO1qe0L8jfxudh4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675689; c=relaxed/simple; bh=QCMniBBTurKlsiy0RrGlj3k+lcWNbYodF8V4zYwePL0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bkpu/MlXStwFW/rmd/zi+PTo3tcDzyNzg4m18uI14ijNsTqWdMPl9LpcgtTduH57o8fXZW/lrjuxhUYLQHv6Ia4rDCf8C0388HiS0gheLNwTKW+O6UOy2oWuBglW1hid3YmuZrunmFApO3PObqQay91ufE1bLhIFy2STQsLccHs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=joJnvPHn; arc=none smtp.client-ip=209.85.210.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="joJnvPHn" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-725ce7b82cbso1873515b3a.0; Thu, 19 Dec 2024 22:21:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734675687; x=1735280487; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=sR/+/dZXDRQ7/mF/Sv1q8TJwB25bHgFlrdQuIhySF5k=; b=joJnvPHnKBDxkBzUKEKkWJ6K5lAJBkosofa/nFN+10z14J4dT86d2g/w1YAEZS0xKw 702S+uHUG5IYRVnyJj8mIrtBU745YrBFLYWR5yNQR1ST7J6FnBSdWUdZbI3ZyO4ngV59 CRe5ck49P9LjcuLr+kxBYHpSGRUtKNHrcJVheLTT4/YhB3BhIA72UOoyGaKUwgXL1zm2 QNIBqUe1dOwB1U1qBj1Dv7GI0/dgP3AuRGi2NxP8bJrgC0vVQIzDXPqgMX07lXJ/N5N8 E1F1KpCrYfYokhJ5orGwacieNJvV6Z20F1hatv1himuGW/Tw19oX+RFDBdeVwhXV7pyp 4YJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734675687; x=1735280487; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sR/+/dZXDRQ7/mF/Sv1q8TJwB25bHgFlrdQuIhySF5k=; b=A0L+KSBqQ7lzMg1uYj0EwdLCf6MGPQ8M1XrOFsbXb5137tX6QpxhAJtAzCwGTxHlrP 2ZhzUul6dWvpeP/IGwr3RU1ygNwPWwyx010nWs5qgYi47Zs+NIkgssMZnHTripOk5ReV f/7czrvJuG6wskSYs3x2nd+obruUs6hZdh9Py/rXW7B3OfyNbWeL9fpcr/ox+hTmfax3 OCCAePWanh67twr+dDBwqBxlBnB4ICQ8Rg9cRBfIDGdagmbIq6rLtnkrTrk8A4gSCQOU CPRFrywUzbarkBGbGitBzuFct+nX8O+Ze0rqOa/PG8zvNzk4+3mPfy1vV73VOMn95ouo EDdQ== X-Forwarded-Encrypted: i=1; AJvYcCWCJLxAyrIDY1ujFeLb83+gaHV8uduTkP6aDEbHZpQ0pUze83eV6LfjVpJXsc4JJBmOhV+4EXY=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/29MTO3n6lLaAyosFkX+dhC5HV12uFEPe/ChVJikBKWAzj+P3 0ZWhwjj8slu7jqKTPBSCBxHADRdX65i2JDn+yCH7ztI5+2LoxqhzJTu56+JJ X-Gm-Gg: ASbGncvoF7ziHRSbhPQNxb6dw4BRVkIlAYPgKK7XCzNtj8tljxbIzNXBSmhtx+DIHtU DV1tJfXTAyG8ESc8yp5vD6q2odk/ftU5vJ3xVSTyU8pyB4DL1OyF3P+KqzkfhDTptWE6nxv4sam NR+FOmtApxz5XZLe6jy+DDsx7yGmV20rgE2jL0B9GRFMJO2EYULWc44QzlJwz/p12d3vAELBdMn Vm3eRYRMec9WbDgFP9u/L23XUY84mSrJVfZSrJ3a5oQCDxlPlGVskL989tEezBC18G7t2gktdLP HcCgAz9ugtcHhsXnaw== X-Google-Smtp-Source: AGHT+IHFV2t8OCPSA1zu+ewAPEOjpFRLFZt2xsJBYpDDMQCrftE8yf28qjtd397lZxILIBXZQUprjA== X-Received: by 2002:a05:6a00:32cb:b0:72a:83ec:b16e with SMTP id d2e1a72fcca58-72abdee30famr2531022b3a.21.1734675687245; Thu, 19 Dec 2024 22:21:27 -0800 (PST) Received: from snail23.. (p7659208-ipoefx.ipoe.ocn.ne.jp. [221.188.16.207]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-842b1ce01d3sm2158548a12.23.2024.12.19.22.21.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2024 22:21:26 -0800 (PST) From: FUJITA Tomonori To: linux-kernel@vger.kernel.org Cc: rust-for-linux@vger.kernel.org, netdev@vger.kernel.org, andrew@lunn.ch, hkallweit1@gmail.com, tmgross@umich.edu, ojeda@kernel.org, alex.gaynor@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@samsung.com, aliceryhl@google.com, anna-maria@linutronix.de, frederic@kernel.org, tglx@linutronix.de, arnd@arndb.de, jstultz@google.com, sboyd@kernel.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, vschneid@redhat.com Subject: [PATCH v7 5/7] MAINTAINERS: rust: Add TIMEKEEPING and TIMER abstractions Date: Fri, 20 Dec 2024 15:18:51 +0900 Message-ID: <20241220061853.2782878-6-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241220061853.2782878-1-fujita.tomonori@gmail.com> References: <20241220061853.2782878-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add Rust TIMEKEEPING and TIMER abstractions to the maintainers entry respectively. Signed-off-by: FUJITA Tomonori --- MAINTAINERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index baf0eeb9a355..77bf1d2e6173 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -10251,6 +10251,7 @@ F: kernel/time/sleep_timeout.c F: kernel/time/timer.c F: kernel/time/timer_list.c F: kernel/time/timer_migration.* +F: rust/kernel/time/delay.rs F: tools/testing/selftests/timers/ HIGH-SPEED SCC DRIVER FOR AX.25 @@ -23643,6 +23644,7 @@ F: kernel/time/timeconv.c F: kernel/time/timecounter.c F: kernel/time/timekeeping* F: kernel/time/time_test.c +F: rust/kernel/time.rs F: tools/testing/selftests/timers/ TIPC NETWORK LAYER From patchwork Fri Dec 20 06:18:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13916292 Received: from mail-pg1-f169.google.com (mail-pg1-f169.google.com [209.85.215.169]) (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 4FBD51A725C; Fri, 20 Dec 2024 06:21:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675696; cv=none; b=BJV9vGbyBXthXaIs/gZGGI9ejlHKzSb41zmwnhc5QRS86oMoJyMaqW0KX2OQpCdLrDcsk/t8lKnSyEbMHPt875EPpZ1+9B6kxa1gf/dh9vjDtt+6reteg49mI2+LnvQrk8T5aVlvkSXZtX43ZXU9zBuzdlsU7JB68Ju1j7aELN4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675696; c=relaxed/simple; bh=QO5DFXeHoLyVGb/IMqVs6AT/hZAGuwg/W0w/y6jLTVA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eHWY+ZPFU9+NDWnpS5YW2wosFBXh4a3C+btfrFbcXk6UDqjTSAlrZC97UA4zQQYVMrn+c4xF+hOxQxep1uISooL+FFdN0UETlX1VXHEB6Za24NOdi5WDxuX8eawsEnObpcBJ+Q36AZ4mWfYgDOddk2QZVdyoAOdyKXrDJOt70Bw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QRnGaCiL; arc=none smtp.client-ip=209.85.215.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QRnGaCiL" Received: by mail-pg1-f169.google.com with SMTP id 41be03b00d2f7-7f4325168c8so716741a12.1; Thu, 19 Dec 2024 22:21:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734675693; x=1735280493; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7xwzzWid3u7MZrtpWluzHF97H3+68wqUob3pBTAGo1U=; b=QRnGaCiLvAIDkG5go/U6w7Fky+0BkN0zjWqoKvJCJEKPqS8X8cDOBCaYCwmsGcXtQR kwI5cXS2LocoPZblQ+S8vZKHqFn0d4KSFswsbN+/zbEhNp8VSfC3TmTVGmaWB1SZGgf8 yWDX8YVgl+6uBJ7pEJeEVbZatYW8RHL6UwxBg+h1uH8Y7qWLIsohOHmBaO1Ld9aBWdpg C5NwB98QcprRUr1jd9j1Zp5geDlxxF/TzH58bMQuDYP+yjktNddcvBVRF5SmMGFetQKU j4CMTGeYxxYTr0X/ZnmPVEuqeFKKTf9hUGYOvX5qxMzinro3WP7piegP5lk+e1+qrPmZ r5PA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734675693; x=1735280493; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7xwzzWid3u7MZrtpWluzHF97H3+68wqUob3pBTAGo1U=; b=HfwkJAMZiMaDKqNj1Judr+x2zjjDUg55asUnlFZoOmxFAst2Loz+LnhuOSSd2F8s2h C3Z3l2wE2bYvNBVJBT3D0lL2TkMYzGDNUamiKBL+WBKEgusddsmCS6v00GifZqnQ85Rf nk/x5E4KvvNsKDXLC2Qr3kVU/+IUi7/I9/hGZ3R1Bjfk6ZdleC3sbyekNFSJSygUKeeM BnCE9D3r+OT/OHH6f+Fck8b7r/jGn7+We8fI9eYK/ezKVL/ljxZD3PMN1JNp1ANl2ORx wLUx5FNvd33GmniPi/tVkmE9DS14/V/+n2atUGZZgsGtfVyRc42SZXALvPiHz0ckoeK/ LRVw== X-Forwarded-Encrypted: i=1; AJvYcCVJQZH+3YLXHOWaleEeY+mQGNwbq0juOmua4DJtgTj0vt+2cjcZ8N6nNOFSb6JAXgeeWlJnMrY=@vger.kernel.org, AJvYcCXsjCXVGQAPt8AsTc6NuWnnJijr72E0MhaaNllSDir1DpAFvJlR+pDp688o6cIRYqkfI1dEGFQKpYeFxjnDVPA=@vger.kernel.org X-Gm-Message-State: AOJu0YwdLxa79+eudG9QKBCSBSHeLZ1Vjs99Z7oABDabPwvTVyldscOp IlcNF92MhnkCSlxIMPKVdjya3/QQc1r5/w3le3AUtwcCaRpgtPmIsYHY+ME4 X-Gm-Gg: ASbGncsM9HVWx9Yw6FEjZCsX0v2k3bM/FTtJrZhLAv2V/eK/Z9xe4pQ2evKcRb41Y96 TCltRHYdtcjrKxUHvd6B+Ew40T7D8Q4byqN7bkIEWFRen7xuFLSHYI8EBVoiFvoKKfqHIh/XSfC yBMlUsUdLNXQBJ466y/NwvVmTKNnUaFgI3fMvIq4/yppItMXXzKh7pjwr/7Ro+E3w4GzK2N9ZY9 5Q+AsPPsWWgIAPZeInC8Ul4g9V+8valjGMLDauLTW4CZk3IZkUCgmLfI/uCROI56qwYZoEz3Ejp cAODApx34Nq5sebnBQ== X-Google-Smtp-Source: AGHT+IF3xoqtwhAMgoGRMwnfx93l70e5GgMpVRyhFNC1M4KOLneogVXvtz4WQ0tcFQ8au8o3U69ikQ== X-Received: by 2002:a05:6a20:a103:b0:1e1:ae68:d900 with SMTP id adf61e73a8af0-1e5e04a2e64mr3786366637.22.1734675693202; Thu, 19 Dec 2024 22:21:33 -0800 (PST) Received: from snail23.. (p7659208-ipoefx.ipoe.ocn.ne.jp. [221.188.16.207]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-842b1ce01d3sm2158548a12.23.2024.12.19.22.21.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2024 22:21:32 -0800 (PST) From: FUJITA Tomonori To: linux-kernel@vger.kernel.org Cc: Boqun Feng , rust-for-linux@vger.kernel.org, netdev@vger.kernel.org, andrew@lunn.ch, hkallweit1@gmail.com, tmgross@umich.edu, ojeda@kernel.org, alex.gaynor@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@samsung.com, aliceryhl@google.com, anna-maria@linutronix.de, frederic@kernel.org, tglx@linutronix.de, arnd@arndb.de, jstultz@google.com, sboyd@kernel.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, vschneid@redhat.com Subject: [PATCH v7 6/7] rust: Add read_poll_timeout functions Date: Fri, 20 Dec 2024 15:18:52 +0900 Message-ID: <20241220061853.2782878-7-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241220061853.2782878-1-fujita.tomonori@gmail.com> References: <20241220061853.2782878-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add read_poll_timeout functions which poll periodically until a condition is met or a timeout is reached. C's read_poll_timeout (include/linux/iopoll.h) is a complicated macro and a simple wrapper for Rust doesn't work. So this implements the same functionality in Rust. The C version uses usleep_range() while the Rust version uses fsleep(), which uses the best sleep method so it works with spans that usleep_range() doesn't work nicely with. Unlike the C version, __might_sleep() is used instead of might_sleep() to show proper debug info; the file name and line number. might_resched() could be added to match what the C version does but this function works without it. The sleep_before_read argument isn't supported since there is no user for now. It's rarely used in the C version. core::panic::Location::file() doesn't provide a null-terminated string so add __might_sleep_precision() helper function, which takes a pointer to a string with its length. read_poll_timeout() can only be used in a nonatomic context. This requirement is not checked by these abstractions, but it is intended that klint [1] or a similar tool will be used to check it in the future. Link: https://rust-for-linux.com/klint [1] Co-developed-by: Boqun Feng Signed-off-by: Boqun Feng Signed-off-by: FUJITA Tomonori --- include/linux/kernel.h | 2 + kernel/sched/core.c | 27 +++++++++++--- rust/helpers/helpers.c | 1 + rust/helpers/kernel.c | 13 +++++++ rust/kernel/cpu.rs | 13 +++++++ rust/kernel/error.rs | 1 + rust/kernel/io.rs | 5 +++ rust/kernel/io/poll.rs | 84 ++++++++++++++++++++++++++++++++++++++++++ rust/kernel/lib.rs | 2 + 9 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 rust/helpers/kernel.c create mode 100644 rust/kernel/cpu.rs create mode 100644 rust/kernel/io.rs create mode 100644 rust/kernel/io/poll.rs diff --git a/include/linux/kernel.h b/include/linux/kernel.h index be2e8c0a187e..086ee1dc447e 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -87,6 +87,7 @@ extern int dynamic_might_resched(void); #ifdef CONFIG_DEBUG_ATOMIC_SLEEP extern void __might_resched(const char *file, int line, unsigned int offsets); extern void __might_sleep(const char *file, int line); +extern void __might_sleep_precision(const char *file, int len, int line); extern void __cant_sleep(const char *file, int line, int preempt_offset); extern void __cant_migrate(const char *file, int line); @@ -145,6 +146,7 @@ extern void __cant_migrate(const char *file, int line); static inline void __might_resched(const char *file, int line, unsigned int offsets) { } static inline void __might_sleep(const char *file, int line) { } +static inline void __might_sleep_precision(const char *file, int len, int line) { } # define might_sleep() do { might_resched(); } while (0) # define cant_sleep() do { } while (0) # define cant_migrate() do { } while (0) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 3e5a6bf587f9..6ed70c801172 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -8670,7 +8670,10 @@ void __init sched_init(void) #ifdef CONFIG_DEBUG_ATOMIC_SLEEP -void __might_sleep(const char *file, int line) +extern inline void __might_resched_precision(const char *file, int len, + int line, unsigned int offsets); + +void __might_sleep_precision(const char *file, int len, int line) { unsigned int state = get_current_state(); /* @@ -8684,7 +8687,14 @@ void __might_sleep(const char *file, int line) (void *)current->task_state_change, (void *)current->task_state_change); - __might_resched(file, line, 0); + __might_resched_precision(file, len, line, 0); +} + +void __might_sleep(const char *file, int line) +{ + long len = strlen(file); + + __might_sleep_precision(file, len, line); } EXPORT_SYMBOL(__might_sleep); @@ -8709,7 +8719,7 @@ static inline bool resched_offsets_ok(unsigned int offsets) return nested == offsets; } -void __might_resched(const char *file, int line, unsigned int offsets) +void __might_resched_precision(const char *file, int len, int line, unsigned int offsets) { /* Ratelimiting timestamp: */ static unsigned long prev_jiffy; @@ -8732,8 +8742,8 @@ void __might_resched(const char *file, int line, unsigned int offsets) /* Save this before calling printk(), since that will clobber it: */ preempt_disable_ip = get_preempt_disable_ip(current); - pr_err("BUG: sleeping function called from invalid context at %s:%d\n", - file, line); + pr_err("BUG: sleeping function called from invalid context at %.*s:%d\n", + len, file, line); pr_err("in_atomic(): %d, irqs_disabled(): %d, non_block: %d, pid: %d, name: %s\n", in_atomic(), irqs_disabled(), current->non_block_count, current->pid, current->comm); @@ -8758,6 +8768,13 @@ void __might_resched(const char *file, int line, unsigned int offsets) dump_stack(); add_taint(TAINT_WARN, LOCKDEP_STILL_OK); } + +void __might_resched(const char *file, int line, unsigned int offsets) +{ + long len = strlen(file); + + __might_resched_precision(file, len, line, offsets); +} EXPORT_SYMBOL(__might_resched); void __cant_sleep(const char *file, int line, int preempt_offset) diff --git a/rust/helpers/helpers.c b/rust/helpers/helpers.c index d16aeda7a558..7ab71a6d4603 100644 --- a/rust/helpers/helpers.c +++ b/rust/helpers/helpers.c @@ -13,6 +13,7 @@ #include "build_bug.c" #include "cred.c" #include "err.c" +#include "kernel.c" #include "fs.c" #include "jump_label.c" #include "kunit.c" diff --git a/rust/helpers/kernel.c b/rust/helpers/kernel.c new file mode 100644 index 000000000000..9dff28f4618e --- /dev/null +++ b/rust/helpers/kernel.c @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include + +void rust_helper_cpu_relax(void) +{ + cpu_relax(); +} + +void rust_helper___might_sleep_precision(const char *file, int len, int line) +{ + __might_sleep_precision(file, len, line); +} diff --git a/rust/kernel/cpu.rs b/rust/kernel/cpu.rs new file mode 100644 index 000000000000..eeeff4be84fa --- /dev/null +++ b/rust/kernel/cpu.rs @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Processor related primitives. +//! +//! C header: [`include/linux/processor.h`](srctree/include/linux/processor.h). + +/// Lower CPU power consumption or yield to a hyperthreaded twin processor. +/// +/// It also happens to serve as a compiler barrier. +pub fn cpu_relax() { + // SAFETY: FFI call. + unsafe { bindings::cpu_relax() } +} diff --git a/rust/kernel/error.rs b/rust/kernel/error.rs index 914e8dec1abd..b5016083a115 100644 --- a/rust/kernel/error.rs +++ b/rust/kernel/error.rs @@ -63,6 +63,7 @@ macro_rules! declare_err { declare_err!(EPIPE, "Broken pipe."); declare_err!(EDOM, "Math argument out of domain of func."); declare_err!(ERANGE, "Math result not representable."); + declare_err!(ETIMEDOUT, "Connection timed out."); declare_err!(ERESTARTSYS, "Restart the system call."); declare_err!(ERESTARTNOINTR, "System call was interrupted by a signal and will be restarted."); declare_err!(ERESTARTNOHAND, "Restart if no handler."); diff --git a/rust/kernel/io.rs b/rust/kernel/io.rs new file mode 100644 index 000000000000..033f3c4e4adf --- /dev/null +++ b/rust/kernel/io.rs @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Input and Output. + +pub mod poll; diff --git a/rust/kernel/io/poll.rs b/rust/kernel/io/poll.rs new file mode 100644 index 000000000000..da8e975d8e50 --- /dev/null +++ b/rust/kernel/io/poll.rs @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! IO polling. +//! +//! C header: [`include/linux/iopoll.h`](srctree/include/linux/iopoll.h). + +use crate::{ + cpu::cpu_relax, + error::{code::*, Result}, + time::{delay::fsleep, Delta, Instant}, +}; + +use core::panic::Location; + +/// Polls periodically until a condition is met or a timeout is reached. +/// +/// Public but hidden since it should only be used from public macros. +/// +/// ```rust +/// use kernel::io::poll::read_poll_timeout; +/// use kernel::time::Delta; +/// use kernel::sync::{SpinLock, new_spinlock}; +/// +/// let lock = KBox::pin_init(new_spinlock!(()), kernel::alloc::flags::GFP_KERNEL)?; +/// let g = lock.lock(); +/// read_poll_timeout(|| Ok(()), |()| true, Delta::from_micros(42), Delta::from_micros(42)); +/// drop(g); +/// +/// # Ok::<(), Error>(()) +/// ``` +#[track_caller] +pub fn read_poll_timeout( + mut op: Op, + cond: Cond, + sleep_delta: Delta, + timeout_delta: Delta, +) -> Result +where + Op: FnMut() -> Result, + Cond: Fn(T) -> bool, +{ + let start = Instant::now(); + let sleep = !sleep_delta.is_zero(); + let timeout = !timeout_delta.is_zero(); + + might_sleep(Location::caller()); + + let val = loop { + let val = op()?; + if cond(val) { + // Unlike the C version, we immediately return. + // We know a condition is met so we don't need to check again. + return Ok(val); + } + if timeout && start.elapsed() > timeout_delta { + // Should we return Err(ETIMEDOUT) here instead of call op() again + // without a sleep between? But we follow the C version. op() could + // take some time so might be worth checking again. + break op()?; + } + if sleep { + fsleep(sleep_delta); + } + // fsleep() could be busy-wait loop so we always call cpu_relax(). + cpu_relax(); + }; + + if cond(val) { + Ok(val) + } else { + Err(ETIMEDOUT) + } +} + +fn might_sleep(loc: &Location<'_>) { + // SAFETY: FFI call. + unsafe { + crate::bindings::__might_sleep_precision( + loc.file().as_ptr().cast(), + loc.file().len() as i32, + loc.line() as i32, + ) + } +} diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index e1065a7551a3..2e9722f980bd 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -33,6 +33,7 @@ #[cfg(CONFIG_BLOCK)] pub mod block; mod build_assert; +pub mod cpu; pub mod cred; pub mod device; pub mod error; @@ -40,6 +41,7 @@ pub mod firmware; pub mod fs; pub mod init; +pub mod io; pub mod ioctl; pub mod jump_label; #[cfg(CONFIG_KUNIT)] From patchwork Fri Dec 20 06:18:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13916293 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) (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 EB2AB1C5CA1; Fri, 20 Dec 2024 06:21:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675701; cv=none; b=k5RvVE+r1p1XJOUuJyY2Zj2glbMbmupWESrZvfFL/OB6ld3M5D5US+yplcHUeAEaCHLkM3WwWaRogjQ3A5FqezuxQkjXZ9rgD5qiliW2prvDzr5v8JuTlS4o1MCJIbwF6DyXN2A3oyizhM4DTqQ+XnZ6TbnyFEZc+7puFad3/rU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734675701; c=relaxed/simple; bh=re0jrUWb22m9wVcyDHNMZvdytL9xnLR8R6MQwhWR7x0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=g3KkrpKXhzaAug9NAj3SN1kN6ra3brPIYG2HRUKwDMUSDQLtCTO3D6VASd36YkOWDsptVedXnCKee1gjn3XK9rHvmwG9qE9VEcnmUR6Rbfda7+tQUOvYSzJ2uaUumWXUrXB82DzgAw8Ko2c7tx1cQYj0O7q6igPHEhnwFmJJYyA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=DqkGFX5c; arc=none smtp.client-ip=209.85.210.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DqkGFX5c" Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-725f4025e25so1302670b3a.1; Thu, 19 Dec 2024 22:21:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734675699; x=1735280499; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2SHfADerOSbD2n5XWOFlbp5M9r6bMFwlpcEuA4NEOP8=; b=DqkGFX5ch64oLsxtLl1V6a8dqf8m3pY/+xB8ZzGc8PZkSWxImj1qLnBj7e43m6F5hV YyOSdF4TPYn1GXGWfyeYAbqy+QKIb3EfMDICwQRvD2gtvpGtF8T/IImMBbstPxb0VhuT mgHWgXwgm/QWgiEjRp/lE/I6ymKgpygInqjC/Fr2Ai5wCkXqS48AE1HoWXzaYcFmD1S7 3gsFji7syOilKqYR/mo2RVW2ahthN2vDY1MaxluNsQpQzKG076GJDpFEDWBrz6tKvEtC 08hXPVROMaRUT88+u4Lu8AwdsQcBR0TfNGNuRoQUg068jAJLMwuj4Shk5OVy6RcdUNnL eLew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734675699; x=1735280499; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2SHfADerOSbD2n5XWOFlbp5M9r6bMFwlpcEuA4NEOP8=; b=j9tYrjH2VFno8b4adCeJo9l0FDZJIHMQPeQyrNxl83Tml/4fz5soY+xO6mechBgF3h NUquoTjf5kyy/MTd3sNjzttnA/cKjIYI/uo5K7r8Yd5hxKQbyK7SAcLt0HbyPK9ErTVT LQbJ7w32KRgErUK9re7zQgIKmzS9rzfOGeHBLkK6BF7NHuc4jqAKZJv10W2yhFZhv96J GwkT3pQ1Kfp6y6stoDxlU5VVdvRAm86XcUDt3zZTkuhxCnrNsOkoLBK5FVWL2DlGs5aZ uvvL9owXnf6ZZV96toZ5VfhAHPuvw9hZ75dfjvv7lFTLs7kL/BecZ+peb0d905Wnu49x TxBA== X-Forwarded-Encrypted: i=1; AJvYcCW9EdbDZx6flM2VOg6zKWSZf1U0jAzqrmEqGrvk9Mv2SO77NL3heTabTmUZR/UaIaszUV/S72i5s/mgQMTYrQ4=@vger.kernel.org, AJvYcCXJ5OBgDVIrr+baBscIefhtvgda57adEmoJPi9uruiRpHk8rTtwu818MWXQHVp1kE7OvveJj+0=@vger.kernel.org X-Gm-Message-State: AOJu0YwjTg9iqgvj3M1V90wf00efIZZkMW5bl9rHTzggw9V013PTsFPg OVIispK98C6y/bOPhrwAZZcKhcoa7Dkt3hTXy1SMKzn6nUWuedWzaW8Pg5jn X-Gm-Gg: ASbGncvSPVqSMxf9GFgNCP5d8KsVGqhtKCUSIUvEthEE4OAst6Jvt4WMWJFRsPwKJdx rtg0q4oSCCGmLfVI+mINpIkMa0wSVQJm4OdrtFWKbSCUkyhcfPtChGQlQMQIjSqQK8WxtzHL9jo uEKWetWWuAOXSzOVN+2VY3qhcj8kQkU1C6u0+1vqos0X+LvNywz7YHmNuMBMjjBuDOJdrY4QazA 5WdU5NTT/Pf/0iZ3nPEGnoWEjLK4FQ6bz3LuddWR1vuJ4VkgGuReinNsJdxXyBuFdy7MIJSB2mb nbQAgO/UTqN4rjI9Lg== X-Google-Smtp-Source: AGHT+IHCrBFAgZKCOGPCuaEFQVdtzq3kyFL+Q+NAjhWIFcZD8J2LEWmL+MO1sGwmDwBk+NqwxMNvGw== X-Received: by 2002:a05:6a00:1947:b0:725:456e:76e with SMTP id d2e1a72fcca58-72abdd8caf2mr2370104b3a.6.1734675698970; Thu, 19 Dec 2024 22:21:38 -0800 (PST) Received: from snail23.. (p7659208-ipoefx.ipoe.ocn.ne.jp. [221.188.16.207]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-842b1ce01d3sm2158548a12.23.2024.12.19.22.21.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2024 22:21:38 -0800 (PST) From: FUJITA Tomonori To: linux-kernel@vger.kernel.org Cc: Andrew Lunn , rust-for-linux@vger.kernel.org, netdev@vger.kernel.org, hkallweit1@gmail.com, tmgross@umich.edu, ojeda@kernel.org, alex.gaynor@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@samsung.com, aliceryhl@google.com, anna-maria@linutronix.de, frederic@kernel.org, tglx@linutronix.de, arnd@arndb.de, jstultz@google.com, sboyd@kernel.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, vschneid@redhat.com Subject: [PATCH v7 7/7] net: phy: qt2025: Wait until PHY becomes ready Date: Fri, 20 Dec 2024 15:18:53 +0900 Message-ID: <20241220061853.2782878-8-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241220061853.2782878-1-fujita.tomonori@gmail.com> References: <20241220061853.2782878-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Wait until a PHY becomes ready in the probe callback by using read_poll_timeout function. Reviewed-by: Andrew Lunn Signed-off-by: FUJITA Tomonori --- drivers/net/phy/qt2025.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/qt2025.rs b/drivers/net/phy/qt2025.rs index 1ab065798175..f642831519ca 100644 --- a/drivers/net/phy/qt2025.rs +++ b/drivers/net/phy/qt2025.rs @@ -12,6 +12,7 @@ use kernel::c_str; use kernel::error::code; use kernel::firmware::Firmware; +use kernel::io::poll::read_poll_timeout; use kernel::net::phy::{ self, reg::{Mmd, C45}, @@ -19,6 +20,7 @@ }; use kernel::prelude::*; use kernel::sizes::{SZ_16K, SZ_8K}; +use kernel::time::Delta; kernel::module_phy_driver! { drivers: [PhyQT2025], @@ -93,7 +95,13 @@ fn probe(dev: &mut phy::Device) -> Result<()> { // The micro-controller will start running from SRAM. dev.write(C45::new(Mmd::PCS, 0xe854), 0x0040)?; - // TODO: sleep here until the hw becomes ready. + read_poll_timeout( + || dev.read(C45::new(Mmd::PCS, 0xd7fd)), + |val| val != 0x00 && val != 0x10, + Delta::from_millis(50), + Delta::from_secs(3), + )?; + Ok(()) }