All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: doronc@siano-ms.com
Cc: linux-media@vger.kernel.org
Subject: Re: [PATCH  15/17]DVB:Siano drivers - Bug fix - avoid (rare) dead locks causing the driver to hang when module removed.
Date: Fri, 23 Sep 2011 19:50:06 -0300	[thread overview]
Message-ID: <4E7D0D1E.9020900@redhat.com> (raw)
In-Reply-To: <1316514720.5199.93.camel@Doron-Ubuntu>

Em 20-09-2011 07:32, Doron Cohen escreveu:
> Hi,
> This patch step is a  Bug fix - avoid (rare) dead locks causing the
> driver to hang when module removed.
> Thanks,
> Doron Cohen
> 
> -----------------------
> 
>>From ad75d9ce48d440c6db6c5147530f1e23de2fcb28 Mon Sep 17 00:00:00 2001
> From: Doron Cohen <doronc@siano-ms.com>
> Date: Tue, 20 Sep 2011 08:46:52 +0300
> Subject: [PATCH 19/21] Bug fix - waiting for free buffers might have
> caused dead locks. Mechanism changed so locks are released around each
> wait.
> 
> ---
>  drivers/media/dvb/siano/smscoreapi.c |   53
> +++++++++++++++++++++++++++------
>  1 files changed, 43 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/media/dvb/siano/smscoreapi.c
> b/drivers/media/dvb/siano/smscoreapi.c
> index bb92351..0555a38 100644
> --- a/drivers/media/dvb/siano/smscoreapi.c
> +++ b/drivers/media/dvb/siano/smscoreapi.c
> @@ -1543,26 +1543,59 @@ EXPORT_SYMBOL_GPL(smscore_onresponse);
>   *
>   * @return pointer to descriptor on success, NULL on error.
>   */
> -
> -struct smscore_buffer_t *get_entry(struct smscore_device_t *coredev)
> +struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t
> *coredev)
>  {
>  	struct smscore_buffer_t *cb = NULL;
>  	unsigned long flags;
>  
> +	DEFINE_WAIT(wait);
> +
> +	spin_lock_irqsave(&coredev->bufferslock, flags);
> +
> +	/* set the current process state to interruptible sleep
> +	 * in case schedule() will be called, this process will go to sleep 
> +	 * and woken up only when a new buffer is available (see
> smscore_putbuffer)
> +	 */
> +	prepare_to_wait(&coredev->buffer_mng_waitq, &wait,
> TASK_INTERRUPTIBLE);
> +
> +	if (list_empty(&coredev->buffers)) {
> +		sms_debug("no avaliable common buffer, need to schedule");
> +
> +		/* 
> +         * before going to sleep, release the lock 
> +         */
> +		spin_unlock_irqrestore(&coredev->bufferslock, flags);
> +
> +		schedule();
> +
> +		sms_debug("wake up after schedule()");
> +
> +		/* 
> +         * acquire the lock again 
> +         */
>  	spin_lock_irqsave(&coredev->bufferslock, flags);
> -	if (!list_empty(&coredev->buffers)) {
> -		cb = (struct smscore_buffer_t *) coredev->buffers.next;
> -		list_del(&cb->entry);
>  	}

The proper fix is not to call schedule(). It is to use a waitqueue. The
current driver has it already. I think you're likely reverting the fix here.
Please take a look at the git history to see how it was solved.

> +
> +	/* 
> +         * in case that schedule() was skipped, set the process state
> to running
> +	 */
> +	finish_wait(&coredev->buffer_mng_waitq, &wait);
> +
> +	/* 
> +         * verify that the list is not empty, since it might have been 
> +	 * emptied during the sleep
> +	 * comment : this sitation can be avoided using
> spin_unlock_irqrestore_exclusive	
> +	 */	
> +	if (list_empty(&coredev->buffers)) {
> +		sms_err("failed to allocate buffer, returning NULL");
>  	spin_unlock_irqrestore(&coredev->bufferslock, flags);
> -	return cb;
> +		return NULL;
>  }
>  
> -struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t
> *coredev)
> -{
> -	struct smscore_buffer_t *cb = NULL;
> +	cb = (struct smscore_buffer_t *) coredev->buffers.next;
> +	list_del(&cb->entry);
>  
> -	wait_event(coredev->buffer_mng_waitq, (cb = get_entry(coredev)));
> +	spin_unlock_irqrestore(&coredev->bufferslock, flags);
>  
>  	return cb;
>  }


      reply	other threads:[~2011-09-23 22:50 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-20 10:32 [PATCH 15/17]DVB:Siano drivers - Bug fix - avoid (rare) dead locks causing the driver to hang when module removed Doron Cohen
2011-09-23 22:50 ` Mauro Carvalho Chehab [this message]

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=4E7D0D1E.9020900@redhat.com \
    --to=mchehab@redhat.com \
    --cc=doronc@siano-ms.com \
    --cc=linux-media@vger.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.