dma_fence_get_rcu() is used to acquire a reference to under a dma-fence under racey conditions -- a perfect recipe for a disaster. As we know the caller may be handling stale memory, use kasan to confirm the dma-fence, or rather its memory block, is valid before attempting to acquire a reference. This should help us to more quickly and clearly identify lost races.
Signed-off-by: Chris Wilson chris@chris-wilson.co.uk Cc: Daniel Vetter daniel.vetter@ffwll.ch --- include/linux/dma-fence.h | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h index 3347c54f3a87..2805edd74738 100644 --- a/include/linux/dma-fence.h +++ b/include/linux/dma-fence.h @@ -301,6 +301,9 @@ static inline struct dma_fence *dma_fence_get(struct dma_fence *fence) */ static inline struct dma_fence *dma_fence_get_rcu(struct dma_fence *fence) { + if (unlikely(!kasan_check_read(fence, sizeof(*fence)))) + return NULL; + if (kref_get_unless_zero(&fence->refcount)) return fence; else
On Fri, Feb 21, 2020 at 3:38 PM Chris Wilson chris@chris-wilson.co.uk wrote:
Hm ... I'm a bit lost on the purpose, and what this does. Fences need to be rcu-freed, and I have honestly no idea how kasan treats those. Are we throwing false positives, because kasan thinks the stuff is freed, but we're still accessing it (while the grace period hasn't passed, so anything freed is still guaranteed to be at least in the slab cache somewhere).
I'm not seeing how this catches lost races quicker, since the refcount should get to 0 way before we get to the kfree. So the refcount check on the next line should catch strictly more races than the kasan check. -Daniel
On Fri, Feb 21, 2020 at 4:26 PM Chris Wilson chris@chris-wilson.co.uk wrote:
Hm ok, that makes a lot more sense. Can you pls amend the commit message (paste the above if you feel uninspired, this discussion explains pretty good what's the point). And maybe a link to bug report or include an example splat and how it's improved.
With that stuff added Acked-by: Daniel Vetter daniel.vetter@ffwll.ch
But maybe get another co-conspirator/bug-hunter to ack this too. -Daniel
dri-devel@lists.freedesktop.org