All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Walls <awalls@md.metrocast.net>
To: Tejun Heo <tj@kernel.org>
Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org
Subject: Re: [PATCH 11/32] v4l/cx18: update workqueue usage
Date: Mon, 03 Jan 2011 19:54:56 -0500	[thread overview]
Message-ID: <1294102496.10094.152.camel@morgan.silverblock.net> (raw)
In-Reply-To: <1294062595-30097-12-git-send-email-tj@kernel.org>

On Mon, 2011-01-03 at 14:49 +0100, Tejun Heo wrote:
> With cmwq, there's no reason to use separate out_work_queue.  Drop it
> and use system_wq instead.  The in_work_queue needs to be ordered so
> can't use one of the system wqs; however, as it isn't used to reclaim
> memory, allocate the workqueue with alloc_ordered_workqueue() without
> WQ_MEM_RECLAIM.
> 
> Signed-off-by: Tejun Heo <tj@kernel.org>
> Cc: Andy Walls <awalls@md.metrocast.net>
> Cc: linux-media@vger.kernel.org

Tejun,

I have a question about cmwq, but to ask it, I need to give the context.

The non-system out_work_queue in cx18 had two purposes:

1. To prevent a userspace video rendering application from sleeping in
read(), when it had emptied a cx18 driver DMA buffer and the cx18 driver
had to sleep to notify the CX2318 engine that the buffer was available
again.

Your change has no adverse effect on this.


2. To prevent work items being handled by keventd/n from being delayed
too long, as the deferred work in question can involve a bit of sleeping
due to contention, the workload of the CX23418's MPEG encoding engine,
and the number of CX23418 devices in the system.

Will all the sleeping that can happen, is the move to a system wq, under
cmwq, going to have adverse affects on processing other work items in
the system?

I get the feeling it won't be a problem with cmwq, but I haven't paid
enough attention to be sure. 

Here are some gory details, if it helps:

A single CX23418 has *one* cx18 driver to CX23418 Capture Processing
Unit (epu2cpu_mb) mailbox though which the cx18 driver sends all normal
commands along with a notification interrupt to the CX23418.

The CX23418 will acknowledge all commands with ack back in the mailbox
and an interrupt for the cx18 driver.  Sometimes the ack happens right
away.  Sometimes the cx18 driver has to wait(), if the CX23418 is
busy.  

The cx18 driver uses a mutex (epu2cpu_mb_lock) to protect cx18 driver
access to the one epu2cpu_mb mailbox.  The mutex is grabbed and released
on a per epu2cpu_mb mailbox command basis

To tell the CX23418 about a usable empty buffer for DMA, one epu2cpu
mailbox command (CX18_CPU_DE_SET_MDL) must be performed for each usable
empty buffer.

A CX23418 can support multiple, simultaneous logical capture streams at
once.  The streams for a DVB TS, analog video converted to MPEG, VBI
data, and the MPEG Index data are common to have active simultaneously.

The CX23418 can keep track of 63 empty buffers for each active stream
and the cx18 driver tries to ensure the CX23418 always has as close to
63 as possible available at any time.

The out_work_handler, when triggered for a capture stream type, will try
to perform, as needed, from 1 to 63 CX18_CPU_DE_SET_MDL mailbox commands
for that stream.  At steady state, the number of CX18_CPU_DE_SET_MDL
mailbox commands executed one after the other in a batch will likely be
from 1 to 3.

It is not unusual for a non-commercial end user to have 2 or 3 CX23418
based capture cards in one machine.  I am aware of at least one
commercial user that had 5 CX23418 based cards in a modest machine.

It is not unusual for scheduled TV recording software to start nearly
simultaneous DTV TS, MPEG, and VBI or MPEG Index streams on multiple
cards.  So 3 CX23418 cards with 3 streams each.   Let's nominally
estimate the timing of the CX18_CPU_DE_SET_MDL commands per stream at
the PAL frame rate of 25 Hz; or 1 CX18_CPU_DE_SET_MDL mailbox command
per stream per 40 milliseconds.

Regards,
Andy

> ---
> Only compile tested.  Please feel free to take it into the subsystem
> tree or simply ack - I'll route it through the wq tree.
> 
> Thanks.
> 
>  drivers/media/video/cx18/cx18-driver.c  |   24 ++----------------------
>  drivers/media/video/cx18/cx18-driver.h  |    3 ---
>  drivers/media/video/cx18/cx18-streams.h |    3 +--
>  3 files changed, 3 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/media/video/cx18/cx18-driver.c b/drivers/media/video/cx18/cx18-driver.c
> index df60f27..41c0822 100644
> --- a/drivers/media/video/cx18/cx18-driver.c
> +++ b/drivers/media/video/cx18/cx18-driver.c
> @@ -656,7 +656,7 @@ static int __devinit cx18_create_in_workq(struct cx18 *cx)
>  {
>  	snprintf(cx->in_workq_name, sizeof(cx->in_workq_name), "%s-in",
>  		 cx->v4l2_dev.name);
> -	cx->in_work_queue = create_singlethread_workqueue(cx->in_workq_name);
> +	cx->in_work_queue = alloc_ordered_workqueue(cx->in_workq_name, 0);
>  	if (cx->in_work_queue == NULL) {
>  		CX18_ERR("Unable to create incoming mailbox handler thread\n");
>  		return -ENOMEM;
> @@ -664,18 +664,6 @@ static int __devinit cx18_create_in_workq(struct cx18 *cx)
>  	return 0;
>  }
>  
> -static int __devinit cx18_create_out_workq(struct cx18 *cx)
> -{
> -	snprintf(cx->out_workq_name, sizeof(cx->out_workq_name), "%s-out",
> -		 cx->v4l2_dev.name);
> -	cx->out_work_queue = create_workqueue(cx->out_workq_name);
> -	if (cx->out_work_queue == NULL) {
> -		CX18_ERR("Unable to create outgoing mailbox handler threads\n");
> -		return -ENOMEM;
> -	}
> -	return 0;
> -}
> -
>  static void __devinit cx18_init_in_work_orders(struct cx18 *cx)
>  {
>  	int i;
> @@ -702,15 +690,9 @@ static int __devinit cx18_init_struct1(struct cx18 *cx)
>  	mutex_init(&cx->epu2apu_mb_lock);
>  	mutex_init(&cx->epu2cpu_mb_lock);
>  
> -	ret = cx18_create_out_workq(cx);
> -	if (ret)
> -		return ret;
> -
>  	ret = cx18_create_in_workq(cx);
> -	if (ret) {
> -		destroy_workqueue(cx->out_work_queue);
> +	if (ret)
>  		return ret;
> -	}
>  
>  	cx18_init_in_work_orders(cx);
>  
> @@ -1094,7 +1076,6 @@ free_mem:
>  	release_mem_region(cx->base_addr, CX18_MEM_SIZE);
>  free_workqueues:
>  	destroy_workqueue(cx->in_work_queue);
> -	destroy_workqueue(cx->out_work_queue);
>  err:
>  	if (retval == 0)
>  		retval = -ENODEV;
> @@ -1244,7 +1225,6 @@ static void cx18_remove(struct pci_dev *pci_dev)
>  	cx18_halt_firmware(cx);
>  
>  	destroy_workqueue(cx->in_work_queue);
> -	destroy_workqueue(cx->out_work_queue);
>  
>  	cx18_streams_cleanup(cx, 1);
>  
> diff --git a/drivers/media/video/cx18/cx18-driver.h b/drivers/media/video/cx18/cx18-driver.h
> index 77be58c..f7f71d1 100644
> --- a/drivers/media/video/cx18/cx18-driver.h
> +++ b/drivers/media/video/cx18/cx18-driver.h
> @@ -614,9 +614,6 @@ struct cx18 {
>  	struct cx18_in_work_order in_work_order[CX18_MAX_IN_WORK_ORDERS];
>  	char epu_debug_str[256]; /* CX18_EPU_DEBUG is rare: use shared space */
>  
> -	struct workqueue_struct *out_work_queue;
> -	char out_workq_name[12]; /* "cx18-NN-out" */
> -
>  	/* i2c */
>  	struct i2c_adapter i2c_adap[2];
>  	struct i2c_algo_bit_data i2c_algo[2];
> diff --git a/drivers/media/video/cx18/cx18-streams.h b/drivers/media/video/cx18/cx18-streams.h
> index 77412be..5837ffb 100644
> --- a/drivers/media/video/cx18/cx18-streams.h
> +++ b/drivers/media/video/cx18/cx18-streams.h
> @@ -41,8 +41,7 @@ static inline bool cx18_stream_enabled(struct cx18_stream *s)
>  /* Related to submission of mdls to firmware */
>  static inline void cx18_stream_load_fw_queue(struct cx18_stream *s)
>  {
> -	struct cx18 *cx = s->cx;
> -	queue_work(cx->out_work_queue, &s->out_work_order);
> +	schedule_work(&s->out_work_order);
>  }
>  
>  static inline void cx18_stream_put_mdl_fw(struct cx18_stream *s,



  reply	other threads:[~2011-01-04  0:54 UTC|newest]

Thread overview: 119+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-01-03 13:49 [PATCHSET] workqueue: update workqueue users - replace create_workqueue() Tejun Heo
2011-01-03 13:49 ` [PATCH 01/32] arm/omap: use system_wq in mailbox Tejun Heo
2011-01-03 21:35   ` Kanigeri, Hari
2011-01-04  5:24     ` Tejun Heo
2011-01-25 13:47       ` Tejun Heo
2011-01-25 15:34         ` Hari Kanigeri
2011-01-25 15:34           ` Hari Kanigeri
2011-01-25 15:37           ` Tejun Heo
2011-01-03 13:49 ` [PATCH 02/32] powerpc/cell: use system_wq in cpufreq_spudemand Tejun Heo
2011-01-03 13:49   ` Tejun Heo
2011-01-03 13:49 ` [PATCH 03/32] block: make kblockd_workqueue smarter Tejun Heo
2011-01-03 14:00   ` Jens Axboe
2011-01-03 13:49 ` [PATCH 04/32] bio-integrity: mark kintegrityd_wq highpri and CPU intensive Tejun Heo
2011-01-03 13:49 ` [PATCH 05/32] crypto: mark crypto workqueues CPU_INTENSIVE Tejun Heo
2011-01-03 13:49   ` Tejun Heo
2011-01-04  4:38   ` Herbert Xu
2011-01-04  4:38     ` Herbert Xu
2011-01-03 13:49 ` [PATCH 06/32] acpi: kacpi*_wq don't need WQ_MEM_RECLAIM Tejun Heo
2011-01-03 13:49 ` [PATCH 07/32] cpufreq: use system_wq instead of dedicated workqueues Tejun Heo
2011-01-03 13:49 ` [PATCH 08/32] drm/nouveau: use system_wq instead of dev_priv->wq Tejun Heo
2011-01-03 13:49   ` Tejun Heo
2011-01-05  1:07   ` Ben Skeggs
2011-01-05  1:16     ` Ben Skeggs
2011-01-06 17:29       ` Tejun Heo
2011-01-26 16:49         ` [PATCH UPDATED " Tejun Heo
2011-02-01 10:41           ` Tejun Heo
2011-02-04  1:53             ` Ben Skeggs
2011-02-04 11:03               ` Tejun Heo
2011-01-03 13:49 ` [PATCH 09/32] drm/radeon: " Tejun Heo
2011-01-03 13:49   ` Tejun Heo
2011-01-05  0:21   ` Alex Deucher
2011-01-06  4:31     ` Dave Airlie
2011-01-03 13:49 ` [PATCH 10/32] input/tps6507x-ts: use system_wq instead of dedicated workqueue Tejun Heo
2011-01-03 14:39   ` Dan Carpenter
2011-01-03 16:34     ` Todd Fischer
2011-01-25 14:19       ` Tejun Heo
2011-01-25 16:13         ` Todd Fischer
2011-01-25 16:50           ` Dmitry Torokhov
2011-01-26 10:43             ` Tejun Heo
2011-01-03 13:49 ` [PATCH 11/32] v4l/cx18: update workqueue usage Tejun Heo
2011-01-04  0:54   ` Andy Walls [this message]
2011-01-04  8:36     ` Tejun Heo
2011-01-04 13:21       ` Andy Walls
2011-01-08 17:03   ` Andy Walls
2011-01-03 13:49 ` [PATCH 12/32] i2o: use alloc_workqueue() instead of create_workqueue() Tejun Heo
2011-01-03 13:49 ` [PATCH 13/32] misc/iwmc3200top: use system_wq instead of dedicated workqueues Tejun Heo
2011-01-03 13:49 ` [PATCH 14/32] wireless/ipw2x00: " Tejun Heo
2011-01-06 20:51   ` John W. Linville
2011-01-03 13:49 ` [PATCH 15/32] wireless/libertas[_tf]: " Tejun Heo
2011-02-01 10:52   ` Tejun Heo
2011-01-03 13:49 ` [PATCH 16/32] scsi/be2iscsi,qla2xxx: convert to alloc_workqueue() Tejun Heo
2011-02-01 23:45   ` Mike Christie
2011-02-02 10:25     ` Tejun Heo
2011-02-02 20:41       ` Mike Christie
2011-02-03  9:31         ` Tejun Heo
2011-01-03 13:49 ` [PATCH 17/32] scsi/ibmvstgt: use system_wq instead of vtgtd workqueue Tejun Heo
2011-01-03 17:45   ` Bart Van Assche
2011-01-04  5:20     ` Tejun Heo
2011-01-24 16:09   ` Bart Van Assche
2011-01-24 16:24     ` Tejun Heo
2011-02-01 10:40       ` Tejun Heo
2011-02-01 14:18         ` FUJITA Tomonori
2011-02-01 14:25           ` James Bottomley
2011-02-01 14:29           ` Tejun Heo
2011-01-03 13:49 ` [PATCH 18/32] scsi/scsi_tgt_lib: scsi_tgtd isn't used in memory reclaim path Tejun Heo
2011-01-03 13:49 ` [PATCH 19/32] usb/ueagle-atm: use system_wq instead of dedicated workqueues Tejun Heo
2011-01-03 13:49 ` [PATCH 20/32] video/msm_fb: " Tejun Heo
     [not found]   ` <1294062595-30097-21-git-send-email-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2011-01-03 17:06     ` Stanislaw Gruszka
2011-01-03 17:06       ` Stanislaw Gruszka
     [not found]       ` <20110103170615.GB2285-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2011-01-03 18:10         ` Daniel Walker
2011-01-03 18:10           ` Daniel Walker
     [not found]           ` <1294078245.18295.5.camel-y5Owza0q8UhBVvN7MMdr1KRtKmQZhJ7pQQ4Iyu8u01E@public.gmane.org>
2011-01-25 13:45             ` Tejun Heo
2011-01-25 13:45               ` Tejun Heo
     [not found]               ` <20110125134558.GY27510-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2011-01-25 18:00                 ` Daniel Walker
2011-01-25 18:00                   ` Daniel Walker
2011-01-25 19:14                   ` David Brown
2011-01-25 19:16                     ` Daniel Walker
     [not found]                       ` <1295982976.25496.29.camel-y5Owza0q8UhBVvN7MMdr1KRtKmQZhJ7pQQ4Iyu8u01E@public.gmane.org>
2011-01-25 22:08                         ` Carl Vanderlip
2011-01-25 22:08                           ` Carl Vanderlip
2011-01-25 23:21   ` David Brown
2011-01-26 10:41     ` Tejun Heo
2011-01-26 18:04       ` David Brown
2011-01-03 13:49 ` [PATCH 21/32] fs/aio: aio_wq isn't used in memory reclaim path Tejun Heo
2011-01-04 15:56   ` Jeff Moyer
2011-01-05 11:28     ` Tejun Heo
2011-01-05 14:50       ` Jeff Moyer
2011-01-05 15:00         ` Benjamin LaHaise
2011-01-05 15:49           ` Jeff Moyer
2011-01-26 11:21   ` [PATCH UPDATED " Tejun Heo
2011-01-26 16:29     ` Jeff Moyer
2011-01-26 16:38       ` Tejun Heo
2011-01-03 13:49 ` [PATCH 22/32] ceph: fsc->*_wq's aren't " Tejun Heo
2011-01-03 17:58   ` Sage Weil
2011-01-03 13:49 ` [PATCH 23/32] net/ceph: make ceph_msgr_wq non-reentrant Tejun Heo
2011-01-03 17:58   ` Sage Weil
2011-01-03 13:49 ` [PATCH 24/32] dlm: dlm workqueues aren't used in memory reclaim path Tejun Heo
2011-01-03 13:58   ` Steven Whitehouse
2011-01-03 13:58     ` [Cluster-devel] " Steven Whitehouse
2011-01-03 14:01     ` Tejun Heo
2011-01-03 14:21       ` Steven Whitehouse
2011-01-03 14:21         ` [Cluster-devel] " Steven Whitehouse
2011-01-03 14:27         ` Tejun Heo
2011-01-03 14:39           ` Steven Whitehouse
2011-01-03 14:39             ` [Cluster-devel] " Steven Whitehouse
2011-01-03 14:44             ` Tejun Heo
2011-01-03 13:49 ` [PATCH 25/32] ext4: convert to alloc_workqueue() Tejun Heo
2011-01-03 13:49 ` [PATCH 26/32] ocfs2: use system_wq instead of ocfs2_quota_wq Tejun Heo
2011-01-03 13:49 ` [PATCH 27/32] reiserfs: make commit_wq use the default concurrency level Tejun Heo
2011-01-03 13:49 ` [PATCH 28/32] xfs: convert to alloc_workqueue() Tejun Heo
2011-01-03 13:49 ` [PATCH 29/32] net/9p: use system_wq instead of p9_mux_wq Tejun Heo
2011-01-03 13:49 ` [PATCH 30/32] net/9p: replace p9_poll_task with a work Tejun Heo
2011-01-03 13:49 ` [PATCH 31/32] rds/ib: use system_wq instead of rds_ib_fmr_wq Tejun Heo
2011-01-03 13:49 ` [PATCH 32/32] rxrpc: rxrpc_workqueue isn't used during memory reclaim Tejun Heo
2011-01-25 14:29 ` [PATCHSET] workqueue: update workqueue users - replace create_workqueue() Tejun Heo
2011-01-25 16:26   ` Dave Jones
2011-01-26 10:40     ` Tejun Heo
2011-01-25 17:47   ` Madhu Iyengar
2011-01-26  4:46   ` Greg KH
2011-02-01 10:44   ` Tejun Heo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1294102496.10094.152.camel@morgan.silverblock.net \
    --to=awalls@md.metrocast.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=tj@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.