lkml.org 
[lkml]   [2014]   [Oct]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC][PATCH 5/6] mm: Provide speculative fault infrastructure
    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;
    > }


    \
     
     \ /
      Last update: 2014-10-21 21:41    [W:3.180 / U:20.744 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site