On Wed, Apr 22, 2009 at 11:48 AM, Shaohua Li <shaohua...@intel.com> wrote:
> drm_lock() does:
>        for (;;) {
>                __set_current_state(TASK_INTERRUPTIBLE);
>                ...
>                if (drm_lock_take(&master->lock, lock->context)) {
>                        <==== schedule() here
>                        master->lock.file_priv = file_priv;
>                        master->lock.lock_time = jiffies;
>                        atomic_inc(&dev->counts[_DRM_STAT_LOCKS]);
>                        break;  /* Got lock */
>                }
>                ...
>        }
> If a preempt occurs in marked line, the task already holds the lock but
> set to interruptible, then nobody can wakeup the task (except signal) and
> other tasks can't get the lock again. Am I missing anything?

Thomas you seem to have the best understanding of this code, can you
take a look and ack this?

Dave.

>
> Signed-off-by: Shaohua Li<shaohua...@intel.com>
> diff --git a/drivers/gpu/drm/drm_lock.c b/drivers/gpu/drm/drm_lock.c
> index e2f70a5..32fbca0 100644
> --- a/drivers/gpu/drm/drm_lock.c
> +++ b/drivers/gpu/drm/drm_lock.c
> @@ -76,6 +76,7 @@ int drm_lock(struct drm_device *dev, void *data, struct 
> drm_file *file_priv)
>        master->lock.user_waiters++;
>        spin_unlock_bh(&master->lock.spinlock);
>
> +       preempt_disable();
>        for (;;) {
>                __set_current_state(TASK_INTERRUPTIBLE);
>                if (!master->lock.hw_lock) {
> @@ -90,18 +91,21 @@ int drm_lock(struct drm_device *dev, void *data, struct 
> drm_file *file_priv)
>                        atomic_inc(&dev->counts[_DRM_STAT_LOCKS]);
>                        break;  /* Got lock */
>                }
> +               preempt_enable_no_resched();
>
>                /* Contention */
>                schedule();
> +               preempt_disable();
>                if (signal_pending(current)) {
>                        ret = -EINTR;
>                        break;
>                }
>        }
> +       __set_current_state(TASK_RUNNING);
> +       preempt_enable();
>        spin_lock_bh(&master->lock.spinlock);
>        master->lock.user_waiters--;
>        spin_unlock_bh(&master->lock.spinlock);
> -       __set_current_state(TASK_RUNNING);
>        remove_wait_queue(&master->lock.lock_queue, &entry);
>
>        DRM_DEBUG("%d %s\n", lock->context,
>
>
>
> ------------------------------------------------------------------------------
> Stay on top of everything new and different, both inside and
> around Java (TM) technology - register by April 22, and save
> $200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco.
> 300 plus technical and hands-on sessions. Register today.
> Use priority code J9JMT32. http://p.sf.net/sfu/p
> --
> _______________________________________________
> Dri-devel mailing list
> Dri-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/dri-devel
>

------------------------------------------------------------------------------
Crystal Reports &#45; New Free Runtime and 30 Day Trial
Check out the new simplified licensign option that enables unlimited
royalty&#45;free distribution of the report engine for externally facing 
server and web deployment.
http://p.sf.net/sfu/businessobjects
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to