diff mbox series

usb: typec: tcpm: Move to high priority workqueue for processing events

Message ID 20200713204300.345975-1-badhri@google.com (mailing list archive)
State New, archived
Headers show
Series usb: typec: tcpm: Move to high priority workqueue for processing events | expand

Commit Message

Badhri Jagan Sridharan July 13, 2020, 8:43 p.m. UTC
"tReceiverResponse 15 ms Section 6.6.2
The receiver of a Message requiring a response Shall respond
within tReceiverResponse in order to ensure that the
sender’s SenderResponseTimer does not expire."

When the cpu complex is busy running other lower priority
work items, TCPM's work queue sometimes does not get scheduled
on time to meet the above requirement from the spec.
Elevating the TCPM's work queue to higher priority allows
TCPM to meet tReceiverResponse in a busy system.

Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
---
 drivers/usb/typec/tcpm/tcpm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Greg KH July 14, 2020, 6:05 a.m. UTC | #1
On Mon, Jul 13, 2020 at 01:43:00PM -0700, Badhri Jagan Sridharan wrote:
> "tReceiverResponse 15 ms Section 6.6.2
> The receiver of a Message requiring a response Shall respond
> within tReceiverResponse in order to ensure that the
> sender’s SenderResponseTimer does not expire."
> 
> When the cpu complex is busy running other lower priority
> work items, TCPM's work queue sometimes does not get scheduled
> on time to meet the above requirement from the spec.
> Elevating the TCPM's work queue to higher priority allows
> TCPM to meet tReceiverResponse in a busy system.
> 
> Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
> ---
>  drivers/usb/typec/tcpm/tcpm.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
> index 82b19ebd7838e0..088b6f1fa1ff89 100644
> --- a/drivers/usb/typec/tcpm/tcpm.c
> +++ b/drivers/usb/typec/tcpm/tcpm.c
> @@ -4747,7 +4747,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
>  	mutex_init(&port->lock);
>  	mutex_init(&port->swap_lock);
>  
> -	port->wq = create_singlethread_workqueue(dev_name(dev));
> +	port->wq = alloc_ordered_workqueue("%s", WQ_HIGHPRI, dev_name(dev));

How are you "guaranteeing" that this is really going to change anything
on a highly loaded machine?

Yes, it might make things better, but if you have a hard deadline like
this, you need to do things a bit differently to always ensure that you
meet it.  I do not think this change is that fix, do you?

thanks,

greg k-h
Guenter Roeck July 14, 2020, 6:57 a.m. UTC | #2
On 7/13/20 11:05 PM, reg Kroah-Hartman wrote:
> On Mon, Jul 13, 2020 at 01:43:00PM -0700, Badhri Jagan Sridharan wrote:
>> "tReceiverResponse 15 ms Section 6.6.2
>> The receiver of a Message requiring a response Shall respond
>> within tReceiverResponse in order to ensure that the
>> sender’s SenderResponseTimer does not expire."
>>
>> When the cpu complex is busy running other lower priority
>> work items, TCPM's work queue sometimes does not get scheduled
>> on time to meet the above requirement from the spec.
>> Elevating the TCPM's work queue to higher priority allows
>> TCPM to meet tReceiverResponse in a busy system.
>>
>> Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
>> ---
>>  drivers/usb/typec/tcpm/tcpm.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
>> index 82b19ebd7838e0..088b6f1fa1ff89 100644
>> --- a/drivers/usb/typec/tcpm/tcpm.c
>> +++ b/drivers/usb/typec/tcpm/tcpm.c
>> @@ -4747,7 +4747,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
>>  	mutex_init(&port->lock);
>>  	mutex_init(&port->swap_lock);
>>  
>> -	port->wq = create_singlethread_workqueue(dev_name(dev));
>> +	port->wq = alloc_ordered_workqueue("%s", WQ_HIGHPRI, dev_name(dev));
> 
> How are you "guaranteeing" that this is really going to change anything
> on a highly loaded machine?
> 
> Yes, it might make things better, but if you have a hard deadline like
> this, you need to do things a bit differently to always ensure that you
> meet it.  I do not think this change is that fix, do you?
> 

Good point. The worker in drivers/watchdog/watchdog_dev.c might be
useful as a starting point. There may be better examples - this is
just one I know of which had a similar problem. See commits
38a1222ae4f3 and 1ff688209e2e.

Guenter
Badhri Jagan Sridharan July 14, 2020, 5:16 p.m. UTC | #3
On Mon, Jul 13, 2020 at 11:58 PM Guenter Roeck <linux@roeck-us.net> wrote:
>
> On 7/13/20 11:05 PM, reg Kroah-Hartman wrote:
> > On Mon, Jul 13, 2020 at 01:43:00PM -0700, Badhri Jagan Sridharan wrote:
> >> "tReceiverResponse 15 ms Section 6.6.2
> >> The receiver of a Message requiring a response Shall respond
> >> within tReceiverResponse in order to ensure that the
> >> sender’s SenderResponseTimer does not expire."
> >>
> >> When the cpu complex is busy running other lower priority
> >> work items, TCPM's work queue sometimes does not get scheduled
> >> on time to meet the above requirement from the spec.
> >> Elevating the TCPM's work queue to higher priority allows
> >> TCPM to meet tReceiverResponse in a busy system.
> >>
> >> Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
> >> ---
> >>  drivers/usb/typec/tcpm/tcpm.c | 2 +-
> >>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
> >> index 82b19ebd7838e0..088b6f1fa1ff89 100644
> >> --- a/drivers/usb/typec/tcpm/tcpm.c
> >> +++ b/drivers/usb/typec/tcpm/tcpm.c
> >> @@ -4747,7 +4747,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
> >>      mutex_init(&port->lock);
> >>      mutex_init(&port->swap_lock);
> >>
> >> -    port->wq = create_singlethread_workqueue(dev_name(dev));
> >> +    port->wq = alloc_ordered_workqueue("%s", WQ_HIGHPRI, dev_name(dev));
> >
> > How are you "guaranteeing" that this is really going to change anything
> > on a highly loaded machine?
> >
> > Yes, it might make things better, but if you have a hard deadline like
> > this, you need to do things a bit differently to always ensure that you
> > meet it.  I do not think this change is that fix, do you?
> >
Yes Greg I agree with you, moving to HIGHPRI was making it better but
is not going to
solve the problem always. I was wondering whether are there better
ways of doing this.

>
> Good point. The worker in drivers/watchdog/ !watchdog_dev.c might be
> useful as a starting point. There may be better examples - this is
> just one I know of which had a similar problem. See commits
> 38a1222ae4f3 and 1ff688209e2e.
>
> Guenter

Thanks a lot Guenter !! Very useful pointers, will review the
approaches in both the
commits !
Badhri Jagan Sridharan July 23, 2020, 6:20 a.m. UTC | #4
Hi Guenter,

Just sent out the patch "usb: typec: tcpm: Migrate workqueue to RT
priority for processing events" which uses kthread_create_worker and
hrtimer.nAppreciate your guidance !! The commits 38a1222ae4f3 and
1ff688209e2e were spot on as they were trying solve the same problem
in a different subsystem.

Thanks,
Badhri

On Tue, Jul 14, 2020 at 10:16 AM Badhri Jagan Sridharan
<badhri@google.com> wrote:
>
> On Mon, Jul 13, 2020 at 11:58 PM Guenter Roeck <linux@roeck-us.net> wrote:
> >
> > On 7/13/20 11:05 PM, reg Kroah-Hartman wrote:
> > > On Mon, Jul 13, 2020 at 01:43:00PM -0700, Badhri Jagan Sridharan wrote:
> > >> "tReceiverResponse 15 ms Section 6.6.2
> > >> The receiver of a Message requiring a response Shall respond
> > >> within tReceiverResponse in order to ensure that the
> > >> sender’s SenderResponseTimer does not expire."
> > >>
> > >> When the cpu complex is busy running other lower priority
> > >> work items, TCPM's work queue sometimes does not get scheduled
> > >> on time to meet the above requirement from the spec.
> > >> Elevating the TCPM's work queue to higher priority allows
> > >> TCPM to meet tReceiverResponse in a busy system.
> > >>
> > >> Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
> > >> ---
> > >>  drivers/usb/typec/tcpm/tcpm.c | 2 +-
> > >>  1 file changed, 1 insertion(+), 1 deletion(-)
> > >>
> > >> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
> > >> index 82b19ebd7838e0..088b6f1fa1ff89 100644
> > >> --- a/drivers/usb/typec/tcpm/tcpm.c
> > >> +++ b/drivers/usb/typec/tcpm/tcpm.c
> > >> @@ -4747,7 +4747,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
> > >>      mutex_init(&port->lock);
> > >>      mutex_init(&port->swap_lock);
> > >>
> > >> -    port->wq = create_singlethread_workqueue(dev_name(dev));
> > >> +    port->wq = alloc_ordered_workqueue("%s", WQ_HIGHPRI, dev_name(dev));
> > >
> > > How are you "guaranteeing" that this is really going to change anything
> > > on a highly loaded machine?
> > >
> > > Yes, it might make things better, but if you have a hard deadline like
> > > this, you need to do things a bit differently to always ensure that you
> > > meet it.  I do not think this change is that fix, do you?
> > >
> Yes Greg I agree with you, moving to HIGHPRI was making it better but
> is not going to
> solve the problem always. I was wondering whether are there better
> ways of doing this.
>
> >
> > Good point. The worker in drivers/watchdog/ !watchdog_dev.c might be
> > useful as a starting point. There may be better examples - this is
> > just one I know of which had a similar problem. See commits
> > 38a1222ae4f3 and 1ff688209e2e.
> >
> > Guenter
>
> Thanks a lot Guenter !! Very useful pointers, will review the
> approaches in both the
> commits !
diff mbox series

Patch

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 82b19ebd7838e0..088b6f1fa1ff89 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -4747,7 +4747,7 @@  struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 	mutex_init(&port->lock);
 	mutex_init(&port->swap_lock);
 
-	port->wq = create_singlethread_workqueue(dev_name(dev));
+	port->wq = alloc_ordered_workqueue("%s", WQ_HIGHPRI, dev_name(dev));
 	if (!port->wq)
 		return ERR_PTR(-ENOMEM);
 	INIT_DELAYED_WORK(&port->state_machine, tcpm_state_machine_work);