Re: [PATCH] pci: ibmphp_hpc: turn semaphores into completions or mutexes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Dec 10, 2018 at 10:49:10PM +0100, Arnd Bergmann wrote:
> The sem_exit variable is conceptually a completion, so it should
> be called that.
> 
> Similarly, the semOperations semaphore is a simple mutex, and
> can be changed into that, respectively.
> 
> With both converted, the ibmphp_hpc_initvars() function is no longer
> used and can be removed.
> 
> Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>

Applied to pci/hotplug for v5.1, thanks!

> ---
>  drivers/pci/hotplug/ibmphp.h      |  1 -
>  drivers/pci/hotplug/ibmphp_core.c |  2 --
>  drivers/pci/hotplug/ibmphp_hpc.c  | 47 +++++++++----------------------
>  3 files changed, 14 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/pci/hotplug/ibmphp.h b/drivers/pci/hotplug/ibmphp.h
> index b89f850c3a4e..e90a4ebf6550 100644
> --- a/drivers/pci/hotplug/ibmphp.h
> +++ b/drivers/pci/hotplug/ibmphp.h
> @@ -378,7 +378,6 @@ int ibmphp_add_pfmem_from_mem(struct resource_node *);
>  struct bus_node *ibmphp_find_res_bus(u8);
>  void ibmphp_print_test(void);	/* for debugging purposes */
>  
> -void ibmphp_hpc_initvars(void);
>  int ibmphp_hpc_readslot(struct slot *, u8, u8 *);
>  int ibmphp_hpc_writeslot(struct slot *, u8);
>  void ibmphp_lock_operations(void);
> diff --git a/drivers/pci/hotplug/ibmphp_core.c b/drivers/pci/hotplug/ibmphp_core.c
> index 5752b57198e3..e04b17d81e38 100644
> --- a/drivers/pci/hotplug/ibmphp_core.c
> +++ b/drivers/pci/hotplug/ibmphp_core.c
> @@ -1312,8 +1312,6 @@ static int __init ibmphp_init(void)
>  
>  	ibmphp_debug = debug;
>  
> -	ibmphp_hpc_initvars();
> -
>  	for (i = 0; i < 16; i++)
>  		irqs[i] = 0;
>  
> diff --git a/drivers/pci/hotplug/ibmphp_hpc.c b/drivers/pci/hotplug/ibmphp_hpc.c
> index 752c384cbd4c..508a62a6b5f9 100644
> --- a/drivers/pci/hotplug/ibmphp_hpc.c
> +++ b/drivers/pci/hotplug/ibmphp_hpc.c
> @@ -15,13 +15,13 @@
>  
>  #include <linux/wait.h>
>  #include <linux/time.h>
> +#include <linux/completion.h>
>  #include <linux/delay.h>
>  #include <linux/module.h>
>  #include <linux/pci.h>
>  #include <linux/init.h>
>  #include <linux/mutex.h>
>  #include <linux/sched.h>
> -#include <linux/semaphore.h>
>  #include <linux/kthread.h>
>  #include "ibmphp.h"
>  
> @@ -88,10 +88,10 @@ static int to_debug = 0;
>  //----------------------------------------------------------------------------
>  // global variables
>  //----------------------------------------------------------------------------
> -static struct mutex sem_hpcaccess;	// lock access to HPC
> -static struct semaphore semOperations;	// lock all operations and
> +static DEFINE_MUTEX(sem_hpcaccess);	// lock access to HPC
> +static DEFINE_MUTEX(operations_mutex);	// lock all operations and
>  					// access to data structures
> -static struct semaphore sem_exit;	// make sure polling thread goes away
> +static DECLARE_COMPLETION(exit_complete); // make sure polling thread goes away
>  static struct task_struct *ibmphp_poll_thread;
>  //----------------------------------------------------------------------------
>  // local function prototypes
> @@ -109,23 +109,6 @@ static int hpc_wait_ctlr_notworking(int, struct controller *, void __iomem *, u8
>  //----------------------------------------------------------------------------
>  
>  
> -/*----------------------------------------------------------------------
> -* Name:    ibmphp_hpc_initvars
> -*
> -* Action:  initialize semaphores and variables
> -*---------------------------------------------------------------------*/
> -void __init ibmphp_hpc_initvars(void)
> -{
> -	debug("%s - Entry\n", __func__);
> -
> -	mutex_init(&sem_hpcaccess);
> -	sema_init(&semOperations, 1);
> -	sema_init(&sem_exit, 0);
> -	to_debug = 0;
> -
> -	debug("%s - Exit\n", __func__);
> -}
> -
>  /*----------------------------------------------------------------------
>  * Name:    i2c_ctrl_read
>  *
> @@ -780,7 +763,7 @@ void free_hpc_access(void)
>  *---------------------------------------------------------------------*/
>  void ibmphp_lock_operations(void)
>  {
> -	down(&semOperations);
> +	mutex_lock(&operations_mutex);
>  	to_debug = 1;
>  }
>  
> @@ -790,7 +773,7 @@ void ibmphp_lock_operations(void)
>  void ibmphp_unlock_operations(void)
>  {
>  	debug("%s - Entry\n", __func__);
> -	up(&semOperations);
> +	mutex_unlock(&operations_mutex);
>  	to_debug = 0;
>  	debug("%s - Exit\n", __func__);
>  }
> @@ -816,7 +799,7 @@ static int poll_hpc(void *data)
>  
>  	while (!kthread_should_stop()) {
>  		/* try to get the lock to do some kind of hardware access */
> -		down(&semOperations);
> +		mutex_lock(&operations_mutex);
>  
>  		switch (poll_state) {
>  		case POLL_LATCH_REGISTER:
> @@ -871,13 +854,13 @@ static int poll_hpc(void *data)
>  			break;
>  		case POLL_SLEEP:
>  			/* don't sleep with a lock on the hardware */
> -			up(&semOperations);
> +			mutex_unlock(&operations_mutex);
>  			msleep(POLL_INTERVAL_SEC * 1000);
>  
>  			if (kthread_should_stop())
>  				goto out_sleep;
>  
> -			down(&semOperations);
> +			mutex_lock(&operations_mutex);
>  
>  			if (poll_count >= POLL_LATCH_CNT) {
>  				poll_count = 0;
> @@ -887,12 +870,12 @@ static int poll_hpc(void *data)
>  			break;
>  		}
>  		/* give up the hardware semaphore */
> -		up(&semOperations);
> +		mutex_unlock(&operations_mutex);
>  		/* sleep for a short time just for good measure */
>  out_sleep:
>  		msleep(100);
>  	}
> -	up(&sem_exit);
> +	complete(&exit_complete);
>  	debug("%s - Exit\n", __func__);
>  	return 0;
>  }
> @@ -1060,9 +1043,9 @@ void __exit ibmphp_hpc_stop_poll_thread(void)
>  	debug("after locking operations\n");
>  
>  	// wait for poll thread to exit
> -	debug("before sem_exit down\n");
> -	down(&sem_exit);
> -	debug("after sem_exit down\n");
> +	debug("before exit_complete down\n");
> +	wait_for_completion(&exit_complete);
> +	debug("after exit_completion down\n");
>  
>  	// cleanup
>  	debug("before free_hpc_access\n");
> @@ -1070,8 +1053,6 @@ void __exit ibmphp_hpc_stop_poll_thread(void)
>  	debug("after free_hpc_access\n");
>  	ibmphp_unlock_operations();
>  	debug("after unlock operations\n");
> -	up(&sem_exit);
> -	debug("after sem exit up\n");
>  
>  	debug("%s - Exit\n", __func__);
>  }
> -- 
> 2.20.0
> 



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux