On Mon, Oct 20, 2014 at 11:56:38PM +0200, Peter Zijlstra wrote:
>  static bool pte_map_lock(struct fault_env *fe)
>  {
> +     bool ret = false;
> +
> +     if (!(fe->flags & FAULT_FLAG_SPECULATIVE)) {
> +             fe->pte = pte_offset_map_lock(fe->mm, fe->pmd, fe->address, 
> &fe->ptl);
> +             return true;
> +     }
> +
> +     /*
> +      * The first vma_is_dead() guarantees the page-tables are still valid,
> +      * having IRQs disabled ensures they stay around, hence the second
> +      * vma_is_dead() to make sure they are still valid once we've got the
> +      * lock. After that a concurrent zap_pte_range() will block on the PTL
> +      * and thus we're safe.
> +      */
> +     local_irq_disable();
> +     if (vma_is_dead(fe->vma, fe->sequence))
> +             goto out;
> +
>       fe->pte = pte_offset_map_lock(fe->mm, fe->pmd, fe->address, &fe->ptl);

Yeah, so this deadlocks just fine, I found we still do TLB flushes while
holding the PTL. Bugger that, the alternative is either force everybody
to do RCU freed page-tables or put back the ugly code :/

A well..

> +
> +     if (vma_is_dead(fe->vma, fe->sequence)) {
> +             pte_unmap_unlock(fe->pte, fe->ptl);
> +             goto out;
> +     }
> +
> +     ret = true;
> +out:
> +     local_irq_enable();
> +     return ret;
>  }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to