[dpdk-dev] mempool: fix search of maximum contiguous pages

Message ID 1476351445-18102-1-git-send-email-wei.dai@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers

Commit Message

Wei Dai Oct. 13, 2016, 9:37 a.m. UTC
  paddr[i] + pg_sz always points to the start physical address of the
2nd page after pddr[i], so only up to 2 pages can be combinded to
be used. With this revision, more than 2 pages can be used.

Fixes: 84121f197187 ("mempool: store memory chunks in a list")

Signed-off-by: Wei Dai <wei.dai@intel.com>
---
 lib/librte_mempool/rte_mempool.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
  

Comments

Sergio Gonzalez Monroy Oct. 13, 2016, 9:46 a.m. UTC | #1
+Olivier

On 13/10/2016 10:37, Wei Dai wrote:
> paddr[i] + pg_sz always points to the start physical address of the
> 2nd page after pddr[i], so only up to 2 pages can be combinded to
> be used. With this revision, more than 2 pages can be used.
>
> Fixes: 84121f197187 ("mempool: store memory chunks in a list")
>
> Signed-off-by: Wei Dai <wei.dai@intel.com>
> ---
>   lib/librte_mempool/rte_mempool.c | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c
> index 71017e1..e3e254a 100644
> --- a/lib/librte_mempool/rte_mempool.c
> +++ b/lib/librte_mempool/rte_mempool.c
> @@ -426,9 +426,12 @@ rte_mempool_populate_phys_tab(struct rte_mempool *mp, char *vaddr,
>   
>   	for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
>   
> +		phys_addr_t paddr_next;
> +		paddr_next = paddr[i] + pg_sz;
> +
>   		/* populate with the largest group of contiguous pages */
>   		for (n = 1; (i + n) < pg_num &&
> -			     paddr[i] + pg_sz == paddr[i+n]; n++)
> +			     paddr_next == paddr[i+n]; n++, paddr_next += pg_sz)
>   			;
>   
>   		ret = rte_mempool_populate_phys(mp, vaddr + i * pg_sz,
  
Ananyev, Konstantin Oct. 13, 2016, 9:53 a.m. UTC | #2
Hi 

> 
> Signed-off-by: Wei Dai <wei.dai@intel.com>
> ---
>  lib/librte_mempool/rte_mempool.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c
> index 71017e1..e3e254a 100644
> --- a/lib/librte_mempool/rte_mempool.c
> +++ b/lib/librte_mempool/rte_mempool.c
> @@ -426,9 +426,12 @@ rte_mempool_populate_phys_tab(struct rte_mempool *mp, char *vaddr,
> 
>  	for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
> 
> +		phys_addr_t paddr_next;
> +		paddr_next = paddr[i] + pg_sz;
> +
>  		/* populate with the largest group of contiguous pages */
>  		for (n = 1; (i + n) < pg_num &&
> -			     paddr[i] + pg_sz == paddr[i+n]; n++)
> +			     paddr_next == paddr[i+n]; n++, paddr_next += pg_sz)
>  			;

Good catch.
Why not just paddr[i + n - 1] != paddr[i + n]?
Then you don't need extra variable (paddr_next) here.
Konstantin

> 
>  		ret = rte_mempool_populate_phys(mp, vaddr + i * pg_sz,
> --
> 2.7.4
  
Ananyev, Konstantin Oct. 13, 2016, 9:59 a.m. UTC | #3
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Ananyev, Konstantin
> Sent: Thursday, October 13, 2016 10:54 AM
> To: Dai, Wei <wei.dai@intel.com>; dev@dpdk.org; Gonzalez Monroy, Sergio <sergio.gonzalez.monroy@intel.com>; Tan, Jianfeng
> <jianfeng.tan@intel.com>; Dai, Wei <wei.dai@intel.com>
> Subject: Re: [dpdk-dev] [PATCH] mempool: fix search of maximum contiguous pages
> 
> Hi
> 
> >
> > Signed-off-by: Wei Dai <wei.dai@intel.com>
> > ---
> >  lib/librte_mempool/rte_mempool.c | 5 ++++-
> >  1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c
> > index 71017e1..e3e254a 100644
> > --- a/lib/librte_mempool/rte_mempool.c
> > +++ b/lib/librte_mempool/rte_mempool.c
> > @@ -426,9 +426,12 @@ rte_mempool_populate_phys_tab(struct rte_mempool *mp, char *vaddr,
> >
> >  	for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
> >
> > +		phys_addr_t paddr_next;
> > +		paddr_next = paddr[i] + pg_sz;
> > +
> >  		/* populate with the largest group of contiguous pages */
> >  		for (n = 1; (i + n) < pg_num &&
> > -			     paddr[i] + pg_sz == paddr[i+n]; n++)
> > +			     paddr_next == paddr[i+n]; n++, paddr_next += pg_sz)
> >  			;
> 
> Good catch.
> Why not just paddr[i + n - 1] != paddr[i + n]?

Sorry, I meant 'paddr[i + n - 1] + pg_sz == paddr[i+n]' off course.

> Then you don't need extra variable (paddr_next) here.
> Konstantin
> 
> >
> >  		ret = rte_mempool_populate_phys(mp, vaddr + i * pg_sz,
> > --
> > 2.7.4
  
Wei Dai Oct. 13, 2016, 11:52 a.m. UTC | #4
> > > diff --git a/lib/librte_mempool/rte_mempool.c
> > > b/lib/librte_mempool/rte_mempool.c
> > > index 71017e1..e3e254a 100644
> > > --- a/lib/librte_mempool/rte_mempool.c
> > > +++ b/lib/librte_mempool/rte_mempool.c
> > > @@ -426,9 +426,12 @@ rte_mempool_populate_phys_tab(struct
> > > rte_mempool *mp, char *vaddr,
> > >
> > >  	for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
> > >
> > > +		phys_addr_t paddr_next;
> > > +		paddr_next = paddr[i] + pg_sz;
> > > +
> > >  		/* populate with the largest group of contiguous pages */
> > >  		for (n = 1; (i + n) < pg_num &&
> > > -			     paddr[i] + pg_sz == paddr[i+n]; n++)
> > > +			     paddr_next == paddr[i+n]; n++, paddr_next += pg_sz)
> > >  			;
> >
> > Good catch.
> > Why not just paddr[i + n - 1] != paddr[i + n]?
> 
> Sorry, I meant 'paddr[i + n - 1] + pg_sz == paddr[i+n]' off course.
> 
> > Then you don't need extra variable (paddr_next) here.
> > Konstantin

Thank you, Konstantin
'paddr[i + n - 1] + pg_sz = paddr[i + n]' also can fix it and have straight meaning. 
But I assume that my revision with paddr_next += pg_sz may have a bit better performance.
By the way, paddr[i] + n * pg_sz = paddr[i + n] can also resolve it.

/Wei

> >
> > >
> > >  		ret = rte_mempool_populate_phys(mp, vaddr + i * pg_sz,
> > > --
> > > 2.7.4
  
Ananyev, Konstantin Oct. 13, 2016, 12:31 p.m. UTC | #5
> 
> > > > diff --git a/lib/librte_mempool/rte_mempool.c
> > > > b/lib/librte_mempool/rte_mempool.c
> > > > index 71017e1..e3e254a 100644
> > > > --- a/lib/librte_mempool/rte_mempool.c
> > > > +++ b/lib/librte_mempool/rte_mempool.c
> > > > @@ -426,9 +426,12 @@ rte_mempool_populate_phys_tab(struct
> > > > rte_mempool *mp, char *vaddr,
> > > >
> > > >  	for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
> > > >
> > > > +		phys_addr_t paddr_next;
> > > > +		paddr_next = paddr[i] + pg_sz;
> > > > +
> > > >  		/* populate with the largest group of contiguous pages */
> > > >  		for (n = 1; (i + n) < pg_num &&
> > > > -			     paddr[i] + pg_sz == paddr[i+n]; n++)
> > > > +			     paddr_next == paddr[i+n]; n++, paddr_next += pg_sz)
> > > >  			;
> > >
> > > Good catch.
> > > Why not just paddr[i + n - 1] != paddr[i + n]?
> >
> > Sorry, I meant 'paddr[i + n - 1] + pg_sz == paddr[i+n]' off course.
> >
> > > Then you don't need extra variable (paddr_next) here.
> > > Konstantin
> 
> Thank you, Konstantin
> 'paddr[i + n - 1] + pg_sz = paddr[i + n]' also can fix it and have straight meaning.
> But I assume that my revision with paddr_next += pg_sz may have a bit better performance.

I don't think there would be any real difference, again it is not performance critical code-path.

> By the way, paddr[i] + n * pg_sz = paddr[i + n] can also resolve it.

Yes, that's one seems even better for me - make things more clear.
Konstantin

> 
> /Wei
> 
> > >
> > > >
> > > >  		ret = rte_mempool_populate_phys(mp, vaddr + i * pg_sz,
> > > > --
> > > > 2.7.4
  
Olivier Matz Oct. 13, 2016, 3:05 p.m. UTC | #6
Hi Wei,

On 10/13/2016 02:31 PM, Ananyev, Konstantin wrote:
>
>>
>>>>> diff --git a/lib/librte_mempool/rte_mempool.c
>>>>> b/lib/librte_mempool/rte_mempool.c
>>>>> index 71017e1..e3e254a 100644
>>>>> --- a/lib/librte_mempool/rte_mempool.c
>>>>> +++ b/lib/librte_mempool/rte_mempool.c
>>>>> @@ -426,9 +426,12 @@ rte_mempool_populate_phys_tab(struct
>>>>> rte_mempool *mp, char *vaddr,
>>>>>
>>>>>   	for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
>>>>>
>>>>> +		phys_addr_t paddr_next;
>>>>> +		paddr_next = paddr[i] + pg_sz;
>>>>> +
>>>>>   		/* populate with the largest group of contiguous pages */
>>>>>   		for (n = 1; (i + n) < pg_num &&
>>>>> -			     paddr[i] + pg_sz == paddr[i+n]; n++)
>>>>> +			     paddr_next == paddr[i+n]; n++, paddr_next += pg_sz)
>>>>>   			;
>>>>
>>>> Good catch.
>>>> Why not just paddr[i + n - 1] != paddr[i + n]?
>>>
>>> Sorry, I meant 'paddr[i + n - 1] + pg_sz == paddr[i+n]' off course.
>>>
>>>> Then you don't need extra variable (paddr_next) here.
>>>> Konstantin
>>
>> Thank you, Konstantin
>> 'paddr[i + n - 1] + pg_sz = paddr[i + n]' also can fix it and have straight meaning.
>> But I assume that my revision with paddr_next += pg_sz may have a bit better performance.
>
> I don't think there would be any real difference, again it is not performance critical code-path.
>
>> By the way, paddr[i] + n * pg_sz = paddr[i + n] can also resolve it.
>
> Yes, that's one seems even better for me - make things more clear.

Thank you for fixing this.

My vote would go for "addr[i + n - 1] + pg_sz == paddr[i + n]"

If you feel "paddr[i] + n * pg_sz = paddr[i + n]" is clearer, I have no 
problem with it either.

Regards,
Olivier
  
Thomas Monjalon Oct. 25, 2016, 2:37 p.m. UTC | #7
2016-10-13 17:05, Olivier MATZ:
> Hi Wei,
> 
> On 10/13/2016 02:31 PM, Ananyev, Konstantin wrote:
> >
> >>
> >>>>> diff --git a/lib/librte_mempool/rte_mempool.c
> >>>>> b/lib/librte_mempool/rte_mempool.c
> >>>>> index 71017e1..e3e254a 100644
> >>>>> --- a/lib/librte_mempool/rte_mempool.c
> >>>>> +++ b/lib/librte_mempool/rte_mempool.c
> >>>>> @@ -426,9 +426,12 @@ rte_mempool_populate_phys_tab(struct
> >>>>> rte_mempool *mp, char *vaddr,
> >>>>>
> >>>>>   	for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
> >>>>>
> >>>>> +		phys_addr_t paddr_next;
> >>>>> +		paddr_next = paddr[i] + pg_sz;
> >>>>> +
> >>>>>   		/* populate with the largest group of contiguous pages */
> >>>>>   		for (n = 1; (i + n) < pg_num &&
> >>>>> -			     paddr[i] + pg_sz == paddr[i+n]; n++)
> >>>>> +			     paddr_next == paddr[i+n]; n++, paddr_next += pg_sz)
> >>>>>   			;
> >>>>
> >>>> Good catch.
> >>>> Why not just paddr[i + n - 1] != paddr[i + n]?
> >>>
> >>> Sorry, I meant 'paddr[i + n - 1] + pg_sz == paddr[i+n]' off course.
> >>>
> >>>> Then you don't need extra variable (paddr_next) here.
> >>>> Konstantin
> >>
> >> Thank you, Konstantin
> >> 'paddr[i + n - 1] + pg_sz = paddr[i + n]' also can fix it and have straight meaning.
> >> But I assume that my revision with paddr_next += pg_sz may have a bit better performance.
> >
> > I don't think there would be any real difference, again it is not performance critical code-path.
> >
> >> By the way, paddr[i] + n * pg_sz = paddr[i + n] can also resolve it.
> >
> > Yes, that's one seems even better for me - make things more clear.
> 
> Thank you for fixing this.
> 
> My vote would go for "addr[i + n - 1] + pg_sz == paddr[i + n]"
> 
> If you feel "paddr[i] + n * pg_sz = paddr[i + n]" is clearer, I have no 
> problem with it either.

No answer from Wei Dai.
Please Olivier advise what to do with this patch.
Thanks
  
Olivier Matz Oct. 25, 2016, 2:56 p.m. UTC | #8
Hi Thomas,

On 10/25/2016 04:37 PM, Thomas Monjalon wrote:
> 2016-10-13 17:05, Olivier MATZ:
>> Hi Wei,
>>
>> On 10/13/2016 02:31 PM, Ananyev, Konstantin wrote:
>>>
>>>>
>>>>>>> diff --git a/lib/librte_mempool/rte_mempool.c
>>>>>>> b/lib/librte_mempool/rte_mempool.c
>>>>>>> index 71017e1..e3e254a 100644
>>>>>>> --- a/lib/librte_mempool/rte_mempool.c
>>>>>>> +++ b/lib/librte_mempool/rte_mempool.c
>>>>>>> @@ -426,9 +426,12 @@ rte_mempool_populate_phys_tab(struct
>>>>>>> rte_mempool *mp, char *vaddr,
>>>>>>>
>>>>>>>   	for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
>>>>>>>
>>>>>>> +		phys_addr_t paddr_next;
>>>>>>> +		paddr_next = paddr[i] + pg_sz;
>>>>>>> +
>>>>>>>   		/* populate with the largest group of contiguous pages */
>>>>>>>   		for (n = 1; (i + n) < pg_num &&
>>>>>>> -			     paddr[i] + pg_sz == paddr[i+n]; n++)
>>>>>>> +			     paddr_next == paddr[i+n]; n++, paddr_next += pg_sz)
>>>>>>>   			;
>>>>>>
>>>>>> Good catch.
>>>>>> Why not just paddr[i + n - 1] != paddr[i + n]?
>>>>>
>>>>> Sorry, I meant 'paddr[i + n - 1] + pg_sz == paddr[i+n]' off course.
>>>>>
>>>>>> Then you don't need extra variable (paddr_next) here.
>>>>>> Konstantin
>>>>
>>>> Thank you, Konstantin
>>>> 'paddr[i + n - 1] + pg_sz = paddr[i + n]' also can fix it and have straight meaning.
>>>> But I assume that my revision with paddr_next += pg_sz may have a bit better performance.
>>>
>>> I don't think there would be any real difference, again it is not performance critical code-path.
>>>
>>>> By the way, paddr[i] + n * pg_sz = paddr[i + n] can also resolve it.
>>>
>>> Yes, that's one seems even better for me - make things more clear.
>>
>> Thank you for fixing this.
>>
>> My vote would go for "addr[i + n - 1] + pg_sz == paddr[i + n]"
>>
>> If you feel "paddr[i] + n * pg_sz = paddr[i + n]" is clearer, I have no 
>> problem with it either.
> 
> No answer from Wei Dai.
> Please Olivier advise what to do with this patch.
> Thanks
> 

I think it's good to have this fix in 16.11.
I'm sending a v2 based on Wei's patch.

Olivier
  

Patch

diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c
index 71017e1..e3e254a 100644
--- a/lib/librte_mempool/rte_mempool.c
+++ b/lib/librte_mempool/rte_mempool.c
@@ -426,9 +426,12 @@  rte_mempool_populate_phys_tab(struct rte_mempool *mp, char *vaddr,
 
 	for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
 
+		phys_addr_t paddr_next;
+		paddr_next = paddr[i] + pg_sz;
+
 		/* populate with the largest group of contiguous pages */
 		for (n = 1; (i + n) < pg_num &&
-			     paddr[i] + pg_sz == paddr[i+n]; n++)
+			     paddr_next == paddr[i+n]; n++, paddr_next += pg_sz)
 			;
 
 		ret = rte_mempool_populate_phys(mp, vaddr + i * pg_sz,