[LTP] [PATCH 1/2] Enhanced thread safety in ebizzy benchmark tool

Vishal Chourasia vishalc@linux.ibm.com
Mon Aug 14 21:42:45 CEST 2023


On 8/14/23 20:45, Cyril Hrubis wrote:
> Hi!
>> Modified ebizzy.c to improve thread safety by introducing a mutex for
>> 'records_read' shared variable.
>>
>> Reviewed-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
>> Reviewed-by: Shrikanth Hegde <sshegde@linux.vnet.ibm.com>
>> Signed-off-by: Vishal Chourasia <vishalc@linux.ibm.com>
>> ---
>>  utils/benchmark/ebizzy-0.3/ebizzy.c | 12 ++++++++++++
>>  1 file changed, 12 insertions(+)
>>
>> diff --git a/utils/benchmark/ebizzy-0.3/ebizzy.c b/utils/benchmark/ebizzy-0.3/ebizzy.c
>> index 54b047130..1af004d9d 100644
>> --- a/utils/benchmark/ebizzy-0.3/ebizzy.c
>> +++ b/utils/benchmark/ebizzy-0.3/ebizzy.c
>> @@ -85,6 +85,8 @@ static time_t start_time;
>>  static volatile int threads_go;
>>  static unsigned int records_read;
>>  
>> +pthread_mutex_t records_read_lock;
> 
> Can't we just initialze the mutex statically?
> 
> i.e.:
> 
> static pthread_mutex_t record_read_lock =  PTHREAD_MUTEX_INITIALIZER;
> 
> 
> Then we don't have to intialize/destroy it.>
> Or even better we can rework the code so that the value is passed up to
> the pthread_join() function which would serialize the code naturally,
> something as:
> 
> diff --git a/utils/benchmark/ebizzy-0.3/ebizzy.c b/utils/benchmark/ebizzy-0.3/ebizzy.c
> index 54b047130..841bf0a1c 100644
> --- a/utils/benchmark/ebizzy-0.3/ebizzy.c
> +++ b/utils/benchmark/ebizzy-0.3/ebizzy.c
> @@ -50,6 +50,7 @@
>  #include <time.h>
>  #include <sys/time.h>
>  #include <sys/resource.h>
> +#include <stdint.h>
> 
>  #include "ebizzy.h"
> 
> @@ -83,7 +84,6 @@ static char **hole_mem;
>  static unsigned int page_size;
>  static time_t start_time;
>  static volatile int threads_go;
> -static unsigned int records_read;
> 
>  static void usage(void)
>  {
> @@ -423,6 +423,8 @@ static unsigned int search_mem(void)
> 
>  static void *thread_run(void *arg __attribute__((unused)))
>  {
> +       uintptr_t records_thread;
> +
>         if (verbose > 1)
>                 printf("Thread started\n");
> 
> @@ -430,13 +432,13 @@ static void *thread_run(void *arg __attribute__((unused)))
> 
>         while (threads_go == 0) ;
> 
> -       records_read += search_mem();
> +       records_thread = search_mem();
> 
>         if (verbose > 1)
>                 printf("Thread finished, %f seconds\n",
>                        difftime(time(NULL), start_time));
> 
> -       return NULL;
> +       return (void *)records_thread;
>  }
> 
>  static struct timeval difftimeval(struct timeval *end, struct timeval *start)
> @@ -454,6 +456,7 @@ static void start_threads(void)
>         unsigned int i;
>         struct rusage start_ru, end_ru;
>         struct timeval usr_time, sys_time;
> +       unsigned int records_read = 0;
>         int err;
> 
>         if (verbose)
> @@ -484,11 +487,13 @@ static void start_threads(void)
>          */
> 
>         for (i = 0; i < threads; i++) {
> -               err = pthread_join(thread_array[i], NULL);
> +               uintptr_t record_thread;
> +               err = pthread_join(thread_array[i], (void *)&record_thread);
>                 if (err) {
>                         fprintf(stderr, "Error joining thread %d\n", i);
>                         exit(1);
>                 }
> +               records_read += record_thread;
>         }
> 
>         if (verbose)
> 
> 
Thank you for your review and insightful suggestions. Approach of
leveraging pthread_join() to naturally serialize the code and retrieve
the records_thread value is certainly elegant. By doing so, we can avoid
the overhead of mutex initialization and destruction, making the code
cleaner and readable.

I appreciate your expertise and input on this matter. I'll incorporate
your suggestions and send out the next version of the patch soon.

vishalc
>>  static void usage(void)
>>  {
>>  	fprintf(stderr, "Usage: %s [options]\n"
>> @@ -430,7 +432,9 @@ static void *thread_run(void *arg __attribute__((unused)))
>>  
>>  	while (threads_go == 0) ;
>>  
>> +	pthread_mutex_lock(&records_read_lock);
>>  	records_read += search_mem();
>> +	pthread_mutex_unlock(&records_read_lock);
>>  
>>  	if (verbose > 1)
>>  		printf("Thread finished, %f seconds\n",
>> @@ -456,6 +460,12 @@ static void start_threads(void)
>>  	struct timeval usr_time, sys_time;
>>  	int err;
>>  
>> +	/* Initialize the mutex before starting the threads */
>> +	if (pthread_mutex_init(&records_read_lock, NULL) != 0) {
>> +		fprintf(stderr, "Failed to initialize mutex\n");
>> +		exit(1);
>> +	}
>> +
>>  	if (verbose)
>>  		printf("Threads starting\n");
>>  
>> @@ -491,6 +501,8 @@ static void start_threads(void)
>>  		}
>>  	}
>>  
>> +	pthread_mutex_destroy(&records_read_lock);
>> +
>>  	if (verbose)
>>  		printf("Threads finished\n");
>>  
>> -- 
>> 2.39.3
>>
> 



More information about the ltp mailing list