Matthew Wilcox <willy@xxxxxxxxxxxxx> writes: (snip) >> > Something I forgot to mention was that I found it more useful to express >> > "map this chunk of a folio" in bytes rather than pages. You might find >> > the same, in which case it's just folio.map(offset: usize) instead of >> > folio.map_page(page_index: usize) >> >> Oh, thanks for the feedback. I'll switch to bytes then for v2. >> (Already did in the example above.) > > Great! Something else I think would be a good idea is open-coding some > of the trivial accessors. eg instead of doing: > > +size_t rust_helper_folio_size(struct folio *folio) > +{ > + return folio_size(folio); > +} > +EXPORT_SYMBOL_GPL(rust_helper_folio_size); > [...] > + pub fn size(&self) -> usize { > + // SAFETY: The folio is valid because the shared reference implies a non-zero refcount. > + unsafe { bindings::folio_size(self.0.get()) } > + } > > add: > > impl Folio { > ... > pub fn order(&self) -> u8 { > if (self.flags & (1 << PG_head)) > self._flags_1 & 0xff > else > 0 > } > > pub fn size(&self) -> usize { > bindings::PAGE_SIZE << self.order() > } > } > > ... or have I misunderstood what is possible here? My hope is that the > compiler gets to "see through" the abstraction, which surely can't be > done when there's a function call. The build system and Rust compiler can inline and optimize across function calls and languages when LTO is enabled. Some patches are needed to make it work though. BR Andreas