On 16 May 2025, at 8:39, David Hildenbrand wrote: > Let's consistently return 0 if the operation was successful, and just > detect ourselves whether splitting is required -- folio_test_large() is > a cheap operation. > > Update the documentation. > > Should we simply always return -EAGAIN instead of 0, so we don't have > to handle it in the caller? Not sure, staring at the documentation, this > way looks a bit cleaner. > > Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> > --- > arch/s390/kernel/uv.c | 22 ++++++++++++---------- > 1 file changed, 12 insertions(+), 10 deletions(-) > > diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c > index 2cc3b599c7fe3..f6ddb2b54032e 100644 > --- a/arch/s390/kernel/uv.c > +++ b/arch/s390/kernel/uv.c > @@ -324,34 +324,36 @@ static int make_folio_secure(struct mm_struct *mm, struct folio *folio, struct u > } > > /** > - * s390_wiggle_split_folio() - try to drain extra references to a folio and optionally split. > + * s390_wiggle_split_folio() - try to drain extra references to a folio and > + * split the folio if it is large. > * @mm: the mm containing the folio to work on > * @folio: the folio > - * @split: whether to split a large folio > * > * Context: Must be called while holding an extra reference to the folio; > * the mm lock should not be held. > - * Return: 0 if the folio was split successfully; > - * -EAGAIN if the folio was not split successfully but another attempt > - * can be made, or if @split was set to false; > - * -EINVAL in case of other errors. See split_folio(). > + * Return: 0 if the operation was successful; > + * -EAGAIN if splitting the large folio was not successful, > + * but another attempt can be made; > + * -EINVAL in case of other folio splitting errors. See split_folio(). > */ > -static int s390_wiggle_split_folio(struct mm_struct *mm, struct folio *folio, bool split) > +static int s390_wiggle_split_folio(struct mm_struct *mm, struct folio *folio) > { > int rc; > > lockdep_assert_not_held(&mm->mmap_lock); > folio_wait_writeback(folio); > lru_add_drain_all(); > - if (split) { > + > + if (folio_test_large(folio)) { > folio_lock(folio); > rc = split_folio(folio); > folio_unlock(folio); > > if (rc != -EBUSY) > return rc; > + return -EAGAIN; > } > - return -EAGAIN; > + return 0; > } I can see how this function is written to service as two purposes, trying to get rid of pcp ref of a folio and split a folio (to avoid the extra pcp ref from failing split, lru_add_drain_all() is called before split). Hope it will be refactored later. > > int make_hva_secure(struct mm_struct *mm, unsigned long hva, struct uv_cb_header *uvcb) > @@ -394,7 +396,7 @@ int make_hva_secure(struct mm_struct *mm, unsigned long hva, struct uv_cb_header > mmap_read_unlock(mm); > > if (rc == -E2BIG || rc == -EBUSY) { > - rc = s390_wiggle_split_folio(mm, folio, rc == -E2BIG); > + rc = s390_wiggle_split_folio(mm, folio); > if (!rc) > rc = -EAGAIN; > } > -- > 2.49.0 The changes look good to me. Acked-by: Zi Yan <ziy@xxxxxxxxxx> -- Best Regards, Yan, Zi