Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp36589639rwd; Tue, 11 Jul 2023 03:05:56 -0700 (PDT) X-Google-Smtp-Source: APBJJlGZb1sutFDe5Kcd3p2pvaC+qhOPZshHjAsR/YraTm3lIn4yggAorMuZ4WSPpEo6bK77Xb8m X-Received: by 2002:a05:6512:3484:b0:4f5:a181:97b8 with SMTP id v4-20020a056512348400b004f5a18197b8mr11834234lfr.25.1689069955756; Tue, 11 Jul 2023 03:05:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689069955; cv=none; d=google.com; s=arc-20160816; b=htxdqmvqGTqIHHmXbiw0gV9uDmGNNDmW73copZKjCR/vramWMi1tuSxR9ECTOjqWGW tyCmGB9g0lLJAe4wEASjjHkAb55+7uLJAr2Pjt8Zep5ghcXcBeE+mSsTCr+pmaFm3TUq IR4GSSyoSsKcvv07IY5NtCK0/9GX72DW9A3QtO+LXrmcoGNlj0gxWjJoD15CfWCahWeh 2i2ADHSkKCzUajWmnbTgqmdTGLus4gVdA/qyjUQ/35jVqR+v6+8TYb5MDI4L4xn4Itql SAceZqnydFzNM3Hgne8VprgtdNWffQ42Yl4mQzq5n0WO7JiX6M+xEqcAaMRV07Xdl3dh o7dg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:dkim-signature; bh=WVqEtgaoR84mlWb1xo2bD1CrEq4VPJW4ZXsIrXT2SxY=; fh=EaQNN7e7jDQTL4fpVTP1jQtHjs+FHUI5BbJS9LqOq2c=; b=zLUlq07QNoMm3tFAoXDhCrnnIRSoxHt4/GuG7RoX+IdFC1DdleyeQUxNNe00mQM0Un BhY12v9qUZ4VL9nF44pVXahbSUwWx2ZM98JTS3l/gtfjktNMDXFv4P7xcifhu5Z1BGio 6g7IbqlDXitXAMqgysqdZxkGH2AcLUoNZEXvU3avbd+G69njZmwlz+ipVntja9b9D7zn Kto8G4JEccyXuJiDkoJB/nU2lms4e3vC2E5VPyamGQ3X2Qg4Kcpv80lkW2yiIgURoKJi SPQ98ryh87SsYDujl2wkoyC4ui1b1SXXHUdavFyFR7q0L2pFwCW44i9eUYDJdgK+W+tK mZoA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20221208 header.b=JiS7r4oS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id m11-20020aa7c2cb000000b0051e0351c57asi1718158edp.535.2023.07.11.03.05.30; Tue, 11 Jul 2023 03:05:55 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20221208 header.b=JiS7r4oS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232083AbjGKJ4w (ORCPT + 99 others); Tue, 11 Jul 2023 05:56:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42536 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229890AbjGKJ4t (ORCPT ); Tue, 11 Jul 2023 05:56:49 -0400 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C4667A1 for ; Tue, 11 Jul 2023 02:56:48 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-5707177ff8aso61162887b3.2 for ; Tue, 11 Jul 2023 02:56:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689069408; x=1691661408; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=WVqEtgaoR84mlWb1xo2bD1CrEq4VPJW4ZXsIrXT2SxY=; b=JiS7r4oSjpoYeZAQokPiDZbRIRNXbzoWPZL7NF+5rzbH6mH2Rcy5+beBc9ND3C54Cz Aus5Cg913qXuDxwKJCGdRWmHr05KJU0rJAHeg88AZD7kauK/bKXdTeDKY4hHqsiAXQQL giwWgikoRtreQUO/DBn4FxwrAoqmcTXpHQalZUi4p2Udagcl0C2V8fzJ4YAZqbRHjs39 J4t57iEQpS8/MHp0zwe9jwefzUlWJejQ8XzKTLzsg3oq45gSz8Ajf7nQvIF4XLItT28/ qIgL6zZDPEwioH0kLhbOCQCI7+NjZMZFYtDBdbaMW78mZpZzOwkCwthKHdajV8J2epzt 5zxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689069408; x=1691661408; 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=WVqEtgaoR84mlWb1xo2bD1CrEq4VPJW4ZXsIrXT2SxY=; b=dE808fUW3KNq1mRx1MIHhP0KnUoc6AIUEb/XO4mSOJw0XM0EZFYgEMNKbJscV20UpW m2aw6/mgdYGH43ZwpT5byV2OK2EH7PmbtvrfNMi8s30kT9wv7KRehkL+Jzn3mSAztsPG UOHFdcyD1hMVBWC86GyPi+7V43Hw7BznCx+Ii/XIHTA1V1AufvNjruw37TVAdJyD5Qws Pu/VwQuqv7pRbt9O+wtKf3E6IlNkV/uN46lvSa5wvJGsn2QtYR0/sAIzHvv6JfUc5BQq GGW3eatd2Id6xWVSi5AaccUUkynJQRO8O8eKwfbHb7q9dKWw3Ax4tM2dDnC0CE8xorvX iRCw== X-Gm-Message-State: ABy/qLY4wnmtodj8AxEGqVAf6WwjTNCLImAgw6cQr5f1ots6j35fyiur sYrHJ9B2SEK1UWBzUnHSLsENsFhjSjAOVQQ= X-Received: from aliceryhl.c.googlers.com ([fda3:e722:ac3:cc00:31:98fb:c0a8:6c8]) (user=aliceryhl job=sendgmr) by 2002:a81:764f:0:b0:57a:141f:b4f5 with SMTP id j15-20020a81764f000000b0057a141fb4f5mr139132ywk.7.1689069408101; Tue, 11 Jul 2023 02:56:48 -0700 (PDT) Date: Tue, 11 Jul 2023 09:33:03 +0000 In-Reply-To: <20230711093303.1433770-1-aliceryhl@google.com> Mime-Version: 1.0 References: <20230711093303.1433770-1-aliceryhl@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230711093303.1433770-10-aliceryhl@google.com> Subject: [PATCH v3 9/9] rust: workqueue: add examples From: Alice Ryhl To: rust-for-linux@vger.kernel.org, Tejun Heo , Miguel Ojeda Cc: Lai Jiangshan , Wedson Almeida Filho , Alex Gaynor , Boqun Feng , Gary Guo , "=?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?=" , Benno Lossin , Alice Ryhl , linux-kernel@vger.kernel.org, patches@lists.linux.dev, Martin Rodriguez Reboredo , Andreas Hindborg Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS,T_PDS_OTHER_BAD_TLD, T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This adds two examples of how to use the workqueue. The first example shows how to use it when you only have one `work_struct` field, and the second example shows how to use it when you have multiple `work_struct` fields. Signed-off-by: Alice Ryhl Reviewed-by: Martin Rodriguez Reboredo Reviewed-by: Gary Guo Reviewed-by: Andreas Hindborg (Samsung) Reviewed-by: Benno Lossin --- v2 -> v3: * Use LockClassKey in constructors in examples. * Add Reviewed-by from Martin, Gary, Andreas, Benno. rust/kernel/workqueue.rs | 104 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/rust/kernel/workqueue.rs b/rust/kernel/workqueue.rs index 3a3a8b52bfd9..482d3eeae7d8 100644 --- a/rust/kernel/workqueue.rs +++ b/rust/kernel/workqueue.rs @@ -26,6 +26,110 @@ //! * The `WorkItemPointer` trait is implemented for the pointer type that points at a something //! that implements `WorkItem`. //! +//! ## Example +//! +//! This example defines a struct that holds an integer and can be scheduled on the workqueue. When +//! the struct is executed, it will print the integer. Since there is only one `work_struct` field, +//! we do not need to specify ids for the fields. +//! +//! ``` +//! use kernel::prelude::*; +//! use kernel::sync::Arc; +//! use kernel::workqueue::{self, Work, WorkItem}; +//! +//! #[pin_data] +//! struct MyStruct { +//! value: i32, +//! #[pin] +//! work: Work, +//! } +//! +//! impl_has_work! { +//! impl HasWork for MyStruct { self.work } +//! } +//! +//! impl MyStruct { +//! fn new(value: i32) -> Result> { +//! Arc::pin_init(pin_init!(MyStruct { +//! value, +//! work <- Work::new(kernel::static_lock_class!()), +//! })) +//! } +//! } +//! +//! impl WorkItem for MyStruct { +//! type Pointer = Arc; +//! +//! fn run(this: Arc) { +//! pr_info!("The value is: {}", this.value); +//! } +//! } +//! +//! /// This method will enqueue the struct for execution on the system workqueue, where its value +//! /// will be printed. +//! fn print_later(val: Arc) { +//! let _ = workqueue::system().enqueue(val); +//! } +//! ``` +//! +//! The following example shows how multiple `work_struct` fields can be used: +//! +//! ``` +//! use kernel::prelude::*; +//! use kernel::sync::Arc; +//! use kernel::workqueue::{self, Work, WorkItem}; +//! +//! #[pin_data] +//! struct MyStruct { +//! value_1: i32, +//! value_2: i32, +//! #[pin] +//! work_1: Work, +//! #[pin] +//! work_2: Work, +//! } +//! +//! impl_has_work! { +//! impl HasWork for MyStruct { self.work_1 } +//! impl HasWork for MyStruct { self.work_2 } +//! } +//! +//! impl MyStruct { +//! fn new(value_1: i32, value_2: i32) -> Result> { +//! Arc::pin_init(pin_init!(MyStruct { +//! value_1, +//! value_2, +//! work_1 <- Work::new(kernel::static_lock_class!()), +//! work_2 <- Work::new(kernel::static_lock_class!()), +//! })) +//! } +//! } +//! +//! impl WorkItem<1> for MyStruct { +//! type Pointer = Arc; +//! +//! fn run(this: Arc) { +//! pr_info!("The value is: {}", this.value_1); +//! } +//! } +//! +//! impl WorkItem<2> for MyStruct { +//! type Pointer = Arc; +//! +//! fn run(this: Arc) { +//! pr_info!("The second value is: {}", this.value_2); +//! } +//! } +//! +//! fn print_1_later(val: Arc) { +//! let _ = workqueue::system().enqueue::, 1>(val); +//! } +//! +//! fn print_2_later(val: Arc) { +//! let _ = workqueue::system().enqueue::, 2>(val); +//! } +//! ``` +//! //! C header: [`include/linux/workqueue.h`](../../../../include/linux/workqueue.h) use crate::{bindings, prelude::*, sync::Arc, sync::LockClassKey, types::Opaque}; -- 2.41.0.255.g8b1d071c50-goog