On Wed, Mar 13, 2024 at 12:05:08PM +0100, Andreas Hindborg wrote: > From: Andreas Hindborg <a.hindborg@xxxxxxxxxxx> > > Add initial abstractions for working with blk-mq. > > This patch is a maintained, refactored subset of code originally published by > Wedson Almeida Filho <wedsonaf@xxxxxxxxx> [1]. > > [1] https://github.com/wedsonaf/linux/tree/f2cfd2fe0e2ca4e90994f96afe268bbd4382a891/rust/kernel/blk/mq.rs > > Cc: Wedson Almeida Filho <wedsonaf@xxxxxxxxx> > Signed-off-by: Andreas Hindborg <a.hindborg@xxxxxxxxxxx> > --- > block/blk-mq.c | 3 +- > include/linux/blk-mq.h | 1 + > rust/bindings/bindings_helper.h | 2 + > rust/helpers.c | 45 ++++ > rust/kernel/block.rs | 5 + > rust/kernel/block/mq.rs | 131 +++++++++++ > rust/kernel/block/mq/gen_disk.rs | 174 +++++++++++++++ > rust/kernel/block/mq/operations.rs | 346 +++++++++++++++++++++++++++++ > rust/kernel/block/mq/raw_writer.rs | 60 +++++ > rust/kernel/block/mq/request.rs | 182 +++++++++++++++ > rust/kernel/block/mq/tag_set.rs | 117 ++++++++++ > rust/kernel/error.rs | 5 + > rust/kernel/lib.rs | 1 + > 13 files changed, 1071 insertions(+), 1 deletion(-) > create mode 100644 rust/kernel/block.rs > create mode 100644 rust/kernel/block/mq.rs > create mode 100644 rust/kernel/block/mq/gen_disk.rs > create mode 100644 rust/kernel/block/mq/operations.rs > create mode 100644 rust/kernel/block/mq/raw_writer.rs > create mode 100644 rust/kernel/block/mq/request.rs > create mode 100644 rust/kernel/block/mq/tag_set.rs > > diff --git a/block/blk-mq.c b/block/blk-mq.c > index 2dc01551e27c..a531f664bee7 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -702,7 +702,7 @@ static void blk_mq_finish_request(struct request *rq) > } > } > > -static void __blk_mq_free_request(struct request *rq) > +void __blk_mq_free_request(struct request *rq) > { > struct request_queue *q = rq->q; > struct blk_mq_ctx *ctx = rq->mq_ctx; > @@ -722,6 +722,7 @@ static void __blk_mq_free_request(struct request *rq) > blk_mq_sched_restart(hctx); > blk_queue_exit(q); > } > +EXPORT_SYMBOL_GPL(__blk_mq_free_request); > Note that for an EXPORT_SYMBOL_GPL() symbol, you can just add the corresponding header file in rust/bindings/bindings_helper.h: +#include <linux/blk-mq.h> and you will be able to call it from Rust via: bindings::__blk_mq_free_request() in other words, rust_helper_blk_mq_free_request_internal() is probably not necessary. Regards, Boqun > void blk_mq_free_request(struct request *rq) > { > diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h > index 7a8150a5f051..842bb88e6e78 100644 > --- a/include/linux/blk-mq.h > +++ b/include/linux/blk-mq.h > @@ -703,6 +703,7 @@ int blk_mq_alloc_sq_tag_set(struct blk_mq_tag_set *set, > unsigned int set_flags); > void blk_mq_free_tag_set(struct blk_mq_tag_set *set); > > +void __blk_mq_free_request(struct request *rq); > void blk_mq_free_request(struct request *rq); > int blk_rq_poll(struct request *rq, struct io_comp_batch *iob, > unsigned int poll_flags); > diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h > index f8e54d398c19..df18acb229d9 100644 > --- a/rust/bindings/bindings_helper.h > +++ b/rust/bindings/bindings_helper.h > @@ -7,6 +7,8 @@ > */ > > #include <kunit/test.h> > +#include <linux/blk_types.h> > +#include <linux/blk-mq.h> > #include <linux/errname.h> > #include <linux/ethtool.h> > #include <linux/mdio.h> > diff --git a/rust/helpers.c b/rust/helpers.c > index 66411845536e..017fa90366e6 100644 > --- a/rust/helpers.c > +++ b/rust/helpers.c > @@ -21,6 +21,9 @@ > */ > [...] > + > +void rust_helper_blk_mq_free_request_internal(struct request *req) > +{ > + __blk_mq_free_request(req); > +} > +EXPORT_SYMBOL_GPL(rust_helper_blk_mq_free_request_internal); > + [...]