On 3/17/22 19:13, Rob Clark wrote: ... >>>> + /* prevent racing with job submission code paths */ >>>> + if (!dma_resv_trylock(obj->resv)) >>>> + goto shrinker_lock; >>> >>> jfwiw, the trylock here is in the msm code isn't so much for madvise >>> (it is an error to submit jobs that reference DONTNEED objects), but >>> instead for the case of evicting WILLNEED but inactive objects to >>> swap. Ie. in the case that we need to move bo's back in to memory, we >>> don't want to unpin/evict a buffer that is later on the list for the >>> same job.. msm shrinker re-uses the same scan loop for both >>> inactive_dontneed (purge) and inactive_willneed (evict) >> >> I don't see connection between the objects on the shrinker's list and >> the job's BOs. Jobs indeed must not have any objects marked as DONTNEED, >> this case should never happen in practice, but we still need to protect >> from it. > > Hmm, let me try to explain with a simple example.. hopefully this makes sense. > > Say you have a job with two bo's, A and B.. bo A is not backed with > memory (either hasn't been used before or was evicted. Allocating > pages for A triggers shrinker. But B is still on the > inactive_willneed list, however it is already locked (because we don't > want to evict B to obtain backing pages for A). I see now what you're talking about, thanks. My intention of locking the reservations is different since eviction isn't supported by this v2. But we probably will be able to re-use this try_lock for protecting from swapping out job's BOs as well. >>> I suppose using trylock is not technically wrong, and it would be a >>> good idea if the shmem helpers supported eviction as well. But I >>> think in the madvise/purge case if you lose the trylock then there is >>> something else bad going on. >> >> This trylock is intended for protecting job's submission path from >> racing with madvise ioctl invocation followed by immediate purging of >> BOs while job is in a process of submission, i.e. it protects from a >> use-after-free. > > ahh, ok > >> If you'll lose this trylock, then shrinker can't use >> dma_resv_test_signaled() reliably anymore and shrinker may purge BO >> before job had a chance to add fence to the BO's reservation. >> >>> Anyways, from the PoV of minimizing lock contention when under memory >>> pressure, this all looks good to me. >> >> Thank you. I may try to add generic eviction support to the v3. > > eviction is a trickier thing to get right, I wouldn't blame you for > splitting that out into it's own patchset ;-) > > You probably also would want to make it a thing that is opt-in for > drivers using the shmem helpers I had the same thoughts, will see.