On Sun, Mar 21, 2021 at 8:07 PM Jason Gunthorpe <jgg@xxxxxxxxxx> wrote: > > On Sun, Mar 21, 2021 at 04:06:07PM +0800, Zhu Yanjun wrote: > > > > > You are reporting 4k pages, if max_segment is larger than 4k there is > > > > > no such thing as "too big" > > > > > > > > > > I assume it is "too small" because of some maths overflow. > > > > > > > > 459 while (n_pages && page_to_pfn(pages[0]) == paddr) { > > > > 460 if (prv->length + PAGE_SIZE > > > > > max_segment) <--it max_segment is big, n_pages is zero. > > > > > > What does n_pages have to do with max_segment? > > > > With the following snippet > > " > > struct ib_umem *region; > > region = ib_umem_get(pd->device, start, len, access); > > > > page_size = ib_umem_find_best_pgsz(region, > > SZ_4K | SZ_2M | SZ_1G, > > virt); > > " > > Can you please stop posting random bits of code that do nothing to > answer the question? > > > IMHO, you can reproduce this problem in your local host. > > Uh, no, you need to communicate effectively or stop posting please. can you read the following link again https://patchwork.kernel.org/project/linux-rdma/patch/CAD=hENeqTTmpS5V+G646V0QvJFLVSd3Sq11ffQFcDXU-OSsQEg@xxxxxxxxxxxxxx/#24031643 In this link, I explained it in details. Since the max_segment is very big, so normally the prv->length + PAGE_SIZE is less than max_segment, it will loop over and over again, until n_pages is zero, then the function __sg_alloc_table_from_pages will exit. So the function __sg_alloc_table_from_pages has few chances to call the function sg_set_page. This behavior is not like the function ib_umem_add_sg_table. In ib_umem_add_sg_table, the "max_seg_sz - sg->length" has more chances to be greater than (len << PAGE_SHIFT). So the function sg_set_page is called more times than __sg_alloc_table_from_pages. The above causes the different sg lists from the 2 functions __sg_alloc_table_from_pages and ib_umem_add_sg_table. The most important thing is "if (prv->length + PAGE_SIZE > max_segment)" in __sg_alloc_table_from_pages and "if ((max_seg_sz - sg->length) >= (len << PAGE_SHIFT))" in the function ib_umem_add_sg_table. When max_segment is UINT_MAX, the different test in the 2 functions causes the different sg lists. Zhu Yanjun > > Jason