RE: [PATCH v4 8/8] pciehp: Introduce hotplug_lock to serialize HP events

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

 



Hello,

I found that while fixing the conflicts during rebasing, an "unused variable 'ret' " warning has crept up in this particular patch.

Apologies for the same. I will take care of that, however, am waiting for any additional comments before resending.

Thanks & Best Regards,

Rajat


> -----Original Message-----
> From: Rajat Jain [mailto:rajatxjain@xxxxxxxxx]
> Sent: Tuesday, February 04, 2014 6:31 PM
> To: Bjorn Helgaas; Rafael J. Wysocki; Kenji Kaneshige; Alex Williamson;
> Yijing Wang; linux-pci@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx;
> Yinghai Lu
> Cc: Guenter Roeck; Rajat Jain; Rajat Jain
> Subject: [PATCH v4 8/8] pciehp: Introduce hotplug_lock to serialize HP
> events
> 
> Today it is there is no protection around pciehp_enable_slot() and
> pciehp_disable_slot() to ensure that they complete before another hot-
> plug operation can be done on that particular slot.
> 
> This patch introduces the slot->hotplug_lock to ensure that any hotplug
> operations (add / remove) complete before another HP event can begin
> processing on that particular slot.
> 
> Signed-off-by: Rajat Jain <rajatxjain@xxxxxxxxx>
> Signed-off-by: Rajat Jain <rajatjain@xxxxxxxxxxx>
> Signed-off-by: Guenter Roeck <groeck@xxxxxxxxxxx>
> ---
>  drivers/pci/hotplug/pciehp.h      |    1 +
>  drivers/pci/hotplug/pciehp_core.c |    7 ++++++-
>  drivers/pci/hotplug/pciehp_ctrl.c |   14 +++++++++++++-
>  drivers/pci/hotplug/pciehp_hpc.c  |    1 +
>  4 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h
> index d8d0336..8a66866 100644
> --- a/drivers/pci/hotplug/pciehp.h
> +++ b/drivers/pci/hotplug/pciehp.h
> @@ -76,6 +76,7 @@ struct slot {
>  	struct hotplug_slot *hotplug_slot;
>  	struct delayed_work work;	/* work for button event */
>  	struct mutex lock;
> +	struct mutex hotplug_lock;
>  	struct workqueue_struct *wq;
>  };
> 
> diff --git a/drivers/pci/hotplug/pciehp_core.c
> b/drivers/pci/hotplug/pciehp_core.c
> index 53b58de..23b4bde 100644
> --- a/drivers/pci/hotplug/pciehp_core.c
> +++ b/drivers/pci/hotplug/pciehp_core.c
> @@ -283,8 +283,11 @@ static int pciehp_probe(struct pcie_device *dev)
>  	slot = ctrl->slot;
>  	pciehp_get_adapter_status(slot, &occupied);
>  	pciehp_get_power_status(slot, &poweron);
> -	if (occupied && pciehp_force)
> +	if (occupied && pciehp_force) {
> +		mutex_lock(&slot->hotplug_lock);
>  		pciehp_enable_slot(slot);
> +		mutex_unlock(&slot->hotplug_lock);
> +	}
>  	/* If empty slot's power status is on, turn power off */
>  	if (!occupied && poweron && POWER_CTRL(ctrl))
>  		pciehp_power_off_slot(slot);
> @@ -328,10 +331,12 @@ static int pciehp_resume (struct pcie_device *dev)
> 
>  	/* Check if slot is occupied */
>  	pciehp_get_adapter_status(slot, &status);
> +	mutex_lock(&slot->hotplug_lock);
>  	if (status)
>  		pciehp_enable_slot(slot);
>  	else
>  		pciehp_disable_slot(slot);
> +	mutex_unlock(&slot->hotplug_lock);
>  	return 0;
>  }
>  #endif /* PM */
> diff --git a/drivers/pci/hotplug/pciehp_ctrl.c
> b/drivers/pci/hotplug/pciehp_ctrl.c
> index 3e40ec0..1f2716c 100644
> --- a/drivers/pci/hotplug/pciehp_ctrl.c
> +++ b/drivers/pci/hotplug/pciehp_ctrl.c
> @@ -293,6 +293,7 @@ static void pciehp_power_thread(struct work_struct
> *work)
>  	struct power_work_info *info =
>  		container_of(work, struct power_work_info, work);
>  	struct slot *p_slot = info->p_slot;
> +	int ret;
> 
>  	switch (info->req) {
>  	case DISABLE_REQ:
> @@ -300,7 +301,9 @@ static void pciehp_power_thread(struct work_struct
> *work)
>  			 "Disabling domain:bus:device=%04x:%02x:00\n",
>  			 pci_domain_nr(p_slot->ctrl->pcie->port->subordinate),
>  			 p_slot->ctrl->pcie->port->subordinate->number);
> +		mutex_lock(&p_slot->hotplug_lock);
>  		pciehp_disable_slot(p_slot);
> +		mutex_unlock(&p_slot->hotplug_lock);
>  		mutex_lock(&p_slot->lock);
>  		p_slot->state = STATIC_STATE;
>  		mutex_unlock(&p_slot->lock);
> @@ -310,8 +313,10 @@ static void pciehp_power_thread(struct work_struct
> *work)
>  			 "Enabling domain:bus:device=%04x:%02x:00\n",
>  			 pci_domain_nr(p_slot->ctrl->pcie->port->subordinate),
>  			 p_slot->ctrl->pcie->port->subordinate->number);
> +		mutex_lock(&p_slot->hotplug_lock);
>  		if (pciehp_enable_slot(p_slot))
>  			pciehp_green_led_off(p_slot);
> +		mutex_unlock(&p_slot->hotplug_lock);
>  		mutex_lock(&p_slot->lock);
>  		p_slot->state = STATIC_STATE;
>  		mutex_unlock(&p_slot->lock);
> @@ -546,6 +551,9 @@ static void interrupt_event_handler(struct
> work_struct *work)
>  	kfree(info);
>  }
> 
> +/*
> + * Note: This function must be called with slot->hotplug_lock held  */
>  int pciehp_enable_slot(struct slot *p_slot)  {
>  	u8 getstatus = 0;
> @@ -584,7 +592,9 @@ int pciehp_enable_slot(struct slot *p_slot)
>  	return rc;
>  }
> 
> -
> +/*
> + * Note: This function must be called with slot->hotplug_lock held  */
>  int pciehp_disable_slot(struct slot *p_slot)  {
>  	u8 getstatus = 0;
> @@ -617,7 +627,9 @@ int pciehp_sysfs_enable_slot(struct slot *p_slot)
>  	case STATIC_STATE:
>  		p_slot->state = POWERON_STATE;
>  		mutex_unlock(&p_slot->lock);
> +		mutex_lock(&p_slot->hotplug_lock);
>  		retval = pciehp_enable_slot(p_slot);
> +		mutex_unlock(&p_slot->hotplug_lock);
>  		mutex_lock(&p_slot->lock);
>  		p_slot->state = STATIC_STATE;
>  		break;
> diff --git a/drivers/pci/hotplug/pciehp_hpc.c
> b/drivers/pci/hotplug/pciehp_hpc.c
> index 6433e73..da4b020 100644
> --- a/drivers/pci/hotplug/pciehp_hpc.c
> +++ b/drivers/pci/hotplug/pciehp_hpc.c
> @@ -686,6 +686,7 @@ static int pcie_init_slot(struct controller *ctrl)
> 
>  	slot->ctrl = ctrl;
>  	mutex_init(&slot->lock);
> +	mutex_init(&slot->hotplug_lock);
>  	INIT_DELAYED_WORK(&slot->work, pciehp_queue_pushbutton_work);
>  	ctrl->slot = slot;
>  	return 0;
> --
> 1.7.9.5
> 
> 

��.n��������+%������w��{.n�����{���"�)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥





[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