lkml.org 
[lkml]   [2018]   [Jul]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 08/10] psi: pressure stall information for CPU, memory, and IO
    On Thu, Jul 12, 2018 at 01:29:40PM -0400, Johannes Weiner wrote:

    > +static inline void psi_enqueue(struct task_struct *p, u64 now, bool wakeup)
    > +{
    > + int clear = 0, set = TSK_RUNNING;
    > +
    > + if (psi_disabled)
    > + return;
    > +
    > + if (!wakeup || p->sched_psi_wake_requeue) {
    > + if (p->flags & PF_MEMSTALL)
    > + set |= TSK_MEMSTALL;
    > + if (p->sched_psi_wake_requeue)
    > + p->sched_psi_wake_requeue = 0;
    > + } else {
    > + if (p->in_iowait)
    > + clear |= TSK_IOWAIT;
    > + }
    > +
    > + psi_task_change(p, now, clear, set);
    > +}
    > +
    > +static inline void psi_dequeue(struct task_struct *p, u64 now, bool sleep)
    > +{
    > + int clear = TSK_RUNNING, set = 0;
    > +
    > + if (psi_disabled)
    > + return;
    > +
    > + if (!sleep) {
    > + if (p->flags & PF_MEMSTALL)
    > + clear |= TSK_MEMSTALL;
    > + } else {
    > + if (p->in_iowait)
    > + set |= TSK_IOWAIT;
    > + }
    > +
    > + psi_task_change(p, now, clear, set);
    > +}

    > +/**
    > + * psi_memstall_enter - mark the beginning of a memory stall section
    > + * @flags: flags to handle nested sections
    > + *
    > + * Marks the calling task as being stalled due to a lack of memory,
    > + * such as waiting for a refault or performing reclaim.
    > + */
    > +void psi_memstall_enter(unsigned long *flags)
    > +{
    > + struct rq_flags rf;
    > + struct rq *rq;
    > +
    > + if (psi_disabled)
    > + return;
    > +
    > + *flags = current->flags & PF_MEMSTALL;
    > + if (*flags)
    > + return;
    > + /*
    > + * PF_MEMSTALL setting & accounting needs to be atomic wrt
    > + * changes to the task's scheduling state, otherwise we can
    > + * race with CPU migration.
    > + */
    > + rq = this_rq_lock_irq(&rf);
    > +
    > + update_rq_clock(rq);
    > +
    > + current->flags |= PF_MEMSTALL;
    > + psi_task_change(current, rq_clock(rq), 0, TSK_MEMSTALL);
    > +
    > + rq_unlock_irq(rq, &rf);
    > +}

    I'm confused by this whole MEMSTALL thing... I thought the idea was to
    account the time we were _blocked_ because of memstall, but you seem to
    count the time we're _running_ with PF_MEMSTALL.


    And esp. the wait_on_page_bit_common caller seems performance sensitive,
    and the above function is quite expensive.


    \
     
     \ /
      Last update: 2018-07-18 14:47    [W:3.928 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site