Hi Janusz,

On 2026-07-15 at 19:04:42 +0200, Janusz Krzysztofik wrote:
> Hi Krzysztof,
> 
> On Mon, 2026-07-13 at 09:58 +0000, Krzysztof Karas wrote:
> > Change the main "for" loop into "while" to get rid of obscure
> > iterator "i" and use more descriptive name to indicate how many
> > pages were already covered. Detect first loop with st->nents and
> > put instructions for that case in their own block for easier
> > reading.
> > 
> > Signed-off-by: Krzysztof Karas <[email protected]>
> > ---
> > v3:
> >  * Split refactoring and put it after the fix in shmem folio
> >   counting suggested by Andi.
> > 
> >  drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 29 +++++++++++------------
> >  1 file changed, 14 insertions(+), 15 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c 
> > b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
> > index 7c8de8fe0a22..66d0f8f6ffcc 100644
> > --- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
> > +++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
> > @@ -135,11 +135,11 @@ int shmem_sg_alloc_table(struct drm_i915_private 
> > *i915, struct sg_table *st,
> >     unsigned int page_count; /* restricted by sg_alloc_table */
> >     unsigned long next_pfn = 0; /* suppress gcc warning */
> >     unsigned long folio_start = 0;
> > +   unsigned long pages_done = 0;
> >     unsigned long folio_end = 0;
> >     struct folio *folio = NULL;
> >     struct scatterlist *sg;
> >     gfp_t noreclaim;
> > -   unsigned long i;
> >     int ret;
> >  
> >     page_count = size / PAGE_SIZE;
> > @@ -163,15 +163,15 @@ int shmem_sg_alloc_table(struct drm_i915_private 
> > *i915, struct sg_table *st,
> >  
> >     sg = st->sgl;
> >     st->nents = 0;
> > -   for (i = 0; i < page_count; i++) {
> > +   while (pages_done < page_count) {
> >             unsigned long folio_page_index = 0;
> >             unsigned long nr_pages;
> >             gfp_t gfp = noreclaim;
> >  
> >             /* Grab the next folio if we exhausted the current one. */
> > -           if (!i || i > folio_end) {
> > -                   folio = shmem_shrink_get_folio(mapping, i, gfp,
> > -                                                  page_count, i915);
> > +           if (!pages_done || pages_done > folio_end) {
> > +                   folio = shmem_shrink_get_folio(mapping, pages_done, gfp,
> > +                                                  page_count - pages_done, 
> > i915);
> >                     if (IS_ERR(folio)) {
> >                             ret = PTR_ERR(folio);
> >                             goto err_sg;
> > @@ -181,7 +181,7 @@ int shmem_sg_alloc_table(struct drm_i915_private *i915, 
> > struct sg_table *st,
> >                     folio_end = folio_start + folio_nr_pages(folio) - 1;
> >             }
> >  
> > -           folio_page_index = i - folio_start;
> > +           folio_page_index = pages_done - folio_start;
> >             if (WARN_ON_ONCE(folio_page_index >= folio_nr_pages(folio))) {
> >                     ret = -EINVAL;
> >                     folio_put(folio);
> > @@ -190,16 +190,15 @@ int shmem_sg_alloc_table(struct drm_i915_private 
> > *i915, struct sg_table *st,
> >  
> >             nr_pages = min_array(((unsigned long[]) {
> >                                     folio_nr_pages(folio) - 
> > folio_page_index,
> > -                                   page_count - i,
> > +                                   page_count - pages_done,
> >                                     max_t(unsigned int, 1, max_segment / 
> > PAGE_SIZE),
> >                                   }), 3);
> > -
> > -           if (!i ||
> > -               sg->length >= max_segment ||
> > -               folio_pfn(folio) + folio_page_index != next_pfn) {
> > -                   if (i)
> > -                           sg = sg_next(sg);
> > -
> > +           if (!st->nents) {
> > +                   st->nents++;
> > +                   sg_set_page(sg, folio_page(folio, 0), nr_pages * 
> > PAGE_SIZE, 0);
> > +           } else if (sg->length >= max_segment ||
> > +                      folio_pfn(folio) + folio_page_index != next_pfn) {
> > +                   sg = sg_next(sg);
> 
> Repeating two or three lines of code to avoid calling another oneĀ 
> conditionally doesn't look optimal to me.  Maybe you could invent a simpleĀ 
> replacement of that 'if (i)' conditional expression.
Perhaps it is not optimal. I do not feel comfortable having two
conditions that contradict each other in the same block, which
is why I wanted to take out the first iteration setup.

It is more about aesthetics here, so I do not have a strong
argument here besides readability. If that is not enough, then
I'll revert to the previous code.

-- 
Best Regards,
Krzysztof

Reply via email to