[PATCH v2] Improve the performance of --num-threads -d 31

Minoru Usui min-usui at ti.jp.nec.com
Tue Mar 1 19:16:58 PST 2016


Hi, Zhou

I wrote a typo, sorry.

> -----Original Message-----
> From: kexec [mailto:kexec-bounces at lists.infradead.org] On Behalf Of Minoru Usui
> Sent: Wednesday, March 02, 2016 12:06 PM
> To: "Zhou, Wenjian/周文?" <zhouwj-fnst at cn.fujitsu.com>; kexec at lists.infradead.org
> Subject: Re: [PATCH v2] Improve the performance of --num-threads -d 31
> 
> Hi, Zhou
> 
> > >>>>> ===
> > >>>>>      producer                   Consumer
> > >>>>> ---------------------------------------------------------
> > >>>>>      pthread_mutex_lock()
> > >>>>>      pfn = info->current_pfn
> > >>>>>                                 info->current_pfn = end_pfn
> > >>>>>      info->current_pfn++
> > >>>>>        -> end_pfn + 1
> > >>>>>      pthread_mutex_unlock()
> > >>>>> ===
> >
> > How about just changing "info->current_pfn = end_pfn" to "info->current_pfn--" ?
> > Just like the first version of the patch.
> 
> If you don't get mutex lock in consumer side, this change is meaningless.
> Of course, info->current_pfn may equal to end_pfn at the end of the cycle,
> but there is a timing that info->current_pfn is bigger than end_pfn in processing producer thread.
> 
> The root cause is producer increments info->current_pfn everytime, even if info->current_pfn == end_pfn
> in following code.
> 
> ===
> >>>> +			/* get next pfn */
> >>>> +			pthread_mutex_lock(&info->current_pfn_mutex);
> >>>> +			pfn = info->current_pfn;
> >>>> +			info->current_pfn++;                        # increment everytime
> >>>> +			page_flag_buf->ready = FLAG_FILLING;
> >>>> +			pthread_mutex_unlock(&info->current_pfn_mutex);
> >>>>
> >>>> -			buf_ready = TRUE;
> >>>> +			page_flag_buf->pfn = pfn;
> >>>>
> >>>> -			page_data_buf[index].pfn = pfn;
> >>>> -			page_data_buf[index].ready = 1;
> >>>> +			if (pfn >= kdump_thread_args->end_pfn) {
> >>>> +				page_data_buf[index].used = FALSE;
> >>>> +				page_flag_buf->ready = FLAG_READY;
> >>>> +				break;                             # not decrement
> >>>> +			}
> ===
> 
> If you don't allow info->current_pfn is bigger than end_pfn,
> you don't need to increment info->current_pfn when pfn >= kdump_thread_args->end_pfn like following.
> 
> ===
>                         /* get next pfn */
>                         pthread_mutex_lock(&info->current_pfn_mutex);
>                         pfn = info->current_pfn;
>                         page_flag_buf->pfn = pfn;
>                         if (pfn >= kdump_thread_args->end_pfn) {
>                                 page_data_buf[index].used = FALSE;
>                                 page_flag_buf->ready = FLAG_READY;
>                                 pthread_mutex_unlock(&info->current_pfn_mutex);
>                                 break;
>                         }
>                         page_flag_buf->ready = FLAG_FILLING;
>                         info->current_pfn++;
>                         pthread_mutex_unlock(&info->current_pfn_mutex);
> ===
> 
> If you allow info->current_pfn is bigger than end_pfn, producer doesn't need to change info->current_pfn.
                                                         ^^^^^^^^ consumer

Consumer doesn't need to change info->current_pfn.
---
Thanks
Minoru Usui




More information about the kexec mailing list