On Thu, 2 May 2024 14:38:32 +0100
Vincent Donnefort <vdonnef...@google.com> wrote:

> > > + while (s < nr_subbufs && p < nr_pages) {
> > > +         struct page *page = virt_to_page(cpu_buffer->subbuf_ids[s]);
> > > +         int off = 0;
> > > +
> > > +         for (; off < (1 << (subbuf_order)); off++, page++) {
> > > +                 if (p >= nr_pages)
> > > +                         break;
> > > +
> > > +                 pages[p++] = page;
> > > +         }
> > > +         s++;
> > > + }
> > > +
> > > + err = vm_insert_pages(vma, vma->vm_start, pages, &nr_pages);  
> > 
> > Nit: I did not immediately understand if we could end here with p < nr_pages
> > (IOW, pages[] not completely filled).
> > 
> > One source of confusion is the "s < nr_subbufs" check in the while loop: why
> > is "p < nr_pages" insufficient?  
> 
> Hum, indeed, the "s < nr_subbufs" check is superfluous, nr_pages, is already
> capped by the number of subbufs, there's no way we can overflow subbuf_ids[].

We can keep it as is, or perhaps change it to:

        while (p < nr_pages) {
                struct page *page;
                int off = 0;

                if (WARN_ON_ONCE(s >= nr_subbufs))
                        break;

                page = virt_to_page(cpu_buffer->subbuf_ids[s]);
                for (; off < (1 << (subbuf_order)); off++, page++) {
                        if (p >= nr_pages)
                                break;

                        pages[p++] = page;
                }
                s++;
        }

I don't like having an unchecked dependency between s and p.

-- Steve

Reply via email to