From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-wm0-f67.google.com ([74.125.82.67]:34878 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756459AbcH2HYu (ORCPT ); Mon, 29 Aug 2016 03:24:50 -0400 Received: by mail-wm0-f67.google.com with SMTP id i5so8258049wmg.2 for ; Mon, 29 Aug 2016 00:24:49 -0700 (PDT) From: Chris Wilson To: dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org, Chris Wilson , Daniel Vetter , Maarten Lankhorst , =?UTF-8?q?Christian=20K=C3=B6nig?= , Alex Deucher , Sumit Semwal , linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org Subject: [PATCH 09/11] dma-buf: Restart reservation_object_test_signaled_rcu() after writes Date: Mon, 29 Aug 2016 08:08:32 +0100 Message-Id: <20160829070834.22296-9-chris@chris-wilson.co.uk> In-Reply-To: <20160829070834.22296-1-chris@chris-wilson.co.uk> References: <20160829070834.22296-1-chris@chris-wilson.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-media-owner@vger.kernel.org List-ID: In order to be completely generic, we have to double check the read seqlock after acquiring a reference to the fence. If the driver is allocating fences from a SLAB_DESTROY_BY_RCU, or similar freelist, then within an RCU grace period a fence may be freed and reallocated. The RCU read side critical section does not prevent this reallocation, instead we have to inspect the reservation's seqlock to double check if the fences have been reassigned as we were acquiring our reference. Signed-off-by: Chris Wilson Cc: Daniel Vetter Cc: Maarten Lankhorst Cc: Christian König Cc: Alex Deucher Cc: Sumit Semwal Cc: linux-media@vger.kernel.org Cc: dri-devel@lists.freedesktop.org Cc: linaro-mm-sig@lists.linaro.org --- drivers/dma-buf/reservation.c | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c index 3369e4668e96..e74493e7332b 100644 --- a/drivers/dma-buf/reservation.c +++ b/drivers/dma-buf/reservation.c @@ -474,12 +474,13 @@ bool reservation_object_test_signaled_rcu(struct reservation_object *obj, bool test_all) { unsigned seq, shared_count; - int ret = true; + int ret; + rcu_read_lock(); retry: + ret = true; shared_count = 0; seq = read_seqcount_begin(&obj->seq); - rcu_read_lock(); if (test_all) { unsigned i; @@ -490,46 +491,35 @@ retry: if (fobj) shared_count = fobj->shared_count; - if (read_seqcount_retry(&obj->seq, seq)) - goto unlock_retry; - for (i = 0; i < shared_count; ++i) { struct fence *fence = rcu_dereference(fobj->shared[i]); ret = reservation_object_test_signaled_single(fence); if (ret < 0) - goto unlock_retry; + goto retry; else if (!ret) break; } - /* - * There could be a read_seqcount_retry here, but nothing cares - * about whether it's the old or newer fence pointers that are - * signaled. That race could still have happened after checking - * read_seqcount_retry. If you care, use ww_mutex_lock. - */ + if (read_seqcount_retry(&obj->seq, seq)) + goto retry; } if (!shared_count) { struct fence *fence_excl = rcu_dereference(obj->fence_excl); - if (read_seqcount_retry(&obj->seq, seq)) - goto unlock_retry; - if (fence_excl) { ret = reservation_object_test_signaled_single( fence_excl); if (ret < 0) - goto unlock_retry; + goto retry; + + if (read_seqcount_retry(&obj->seq, seq)) + goto retry; } } rcu_read_unlock(); return ret; - -unlock_retry: - rcu_read_unlock(); - goto retry; } EXPORT_SYMBOL_GPL(reservation_object_test_signaled_rcu); -- 2.9.3 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH 09/11] dma-buf: Restart reservation_object_test_signaled_rcu() after writes Date: Mon, 29 Aug 2016 08:08:32 +0100 Message-ID: <20160829070834.22296-9-chris@chris-wilson.co.uk> References: <20160829070834.22296-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20160829070834.22296-1-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Daniel Vetter , intel-gfx@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org SW4gb3JkZXIgdG8gYmUgY29tcGxldGVseSBnZW5lcmljLCB3ZSBoYXZlIHRvIGRvdWJsZSBjaGVj ayB0aGUgcmVhZApzZXFsb2NrIGFmdGVyIGFjcXVpcmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZmVu Y2UuIElmIHRoZSBkcml2ZXIgaXMKYWxsb2NhdGluZyBmZW5jZXMgZnJvbSBhIFNMQUJfREVTVFJP WV9CWV9SQ1UsIG9yIHNpbWlsYXIgZnJlZWxpc3QsIHRoZW4Kd2l0aGluIGFuIFJDVSBncmFjZSBw ZXJpb2QgYSBmZW5jZSBtYXkgYmUgZnJlZWQgYW5kIHJlYWxsb2NhdGVkLiBUaGUgUkNVCnJlYWQg c2lkZSBjcml0aWNhbCBzZWN0aW9uIGRvZXMgbm90IHByZXZlbnQgdGhpcyByZWFsbG9jYXRpb24s IGluc3RlYWQKd2UgaGF2ZSB0byBpbnNwZWN0IHRoZSByZXNlcnZhdGlvbidzIHNlcWxvY2sgdG8g ZG91YmxlIGNoZWNrIGlmIHRoZQpmZW5jZXMgaGF2ZSBiZWVuIHJlYXNzaWduZWQgYXMgd2Ugd2Vy ZSBhY3F1aXJpbmcgb3VyIHJlZmVyZW5jZS4KClNpZ25lZC1vZmYtYnk6IENocmlzIFdpbHNvbiA8 Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgpDYzogRGFuaWVsIFZldHRlciA8ZGFuaWVsLnZldHRl ckBmZndsbC5jaD4KQ2M6IE1hYXJ0ZW4gTGFua2hvcnN0IDxtYWFydGVuLmxhbmtob3JzdEBsaW51 eC5pbnRlbC5jb20+CkNjOiBDaHJpc3RpYW4gS8O2bmlnIDxjaHJpc3RpYW4ua29lbmlnQGFtZC5j b20+CkNjOiBBbGV4IERldWNoZXIgPGFsZXhhbmRlci5kZXVjaGVyQGFtZC5jb20+CkNjOiBTdW1p dCBTZW13YWwgPHN1bWl0LnNlbXdhbEBsaW5hcm8ub3JnPgpDYzogbGludXgtbWVkaWFAdmdlci5r ZXJuZWwub3JnCkNjOiBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCkNjOiBsaW5hcm8t bW0tc2lnQGxpc3RzLmxpbmFyby5vcmcKLS0tCiBkcml2ZXJzL2RtYS1idWYvcmVzZXJ2YXRpb24u YyB8IDMwICsrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDEw IGluc2VydGlvbnMoKyksIDIwIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1h LWJ1Zi9yZXNlcnZhdGlvbi5jIGIvZHJpdmVycy9kbWEtYnVmL3Jlc2VydmF0aW9uLmMKaW5kZXgg MzM2OWU0NjY4ZTk2Li5lNzQ0OTNlNzMzMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hLWJ1Zi9y ZXNlcnZhdGlvbi5jCisrKyBiL2RyaXZlcnMvZG1hLWJ1Zi9yZXNlcnZhdGlvbi5jCkBAIC00NzQs MTIgKzQ3NCwxMyBAQCBib29sIHJlc2VydmF0aW9uX29iamVjdF90ZXN0X3NpZ25hbGVkX3JjdShz dHJ1Y3QgcmVzZXJ2YXRpb25fb2JqZWN0ICpvYmosCiAJCQkJCSAgYm9vbCB0ZXN0X2FsbCkKIHsK IAl1bnNpZ25lZCBzZXEsIHNoYXJlZF9jb3VudDsKLQlpbnQgcmV0ID0gdHJ1ZTsKKwlpbnQgcmV0 OwogCisJcmN1X3JlYWRfbG9jaygpOwogcmV0cnk6CisJcmV0ID0gdHJ1ZTsKIAlzaGFyZWRfY291 bnQgPSAwOwogCXNlcSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJm9iai0+c2VxKTsKLQlyY3VfcmVh ZF9sb2NrKCk7CiAKIAlpZiAodGVzdF9hbGwpIHsKIAkJdW5zaWduZWQgaTsKQEAgLTQ5MCw0NiAr NDkxLDM1IEBAIHJldHJ5OgogCQlpZiAoZm9iaikKIAkJCXNoYXJlZF9jb3VudCA9IGZvYmotPnNo YXJlZF9jb3VudDsKIAotCQlpZiAocmVhZF9zZXFjb3VudF9yZXRyeSgmb2JqLT5zZXEsIHNlcSkp Ci0JCQlnb3RvIHVubG9ja19yZXRyeTsKLQogCQlmb3IgKGkgPSAwOyBpIDwgc2hhcmVkX2NvdW50 OyArK2kpIHsKIAkJCXN0cnVjdCBmZW5jZSAqZmVuY2UgPSByY3VfZGVyZWZlcmVuY2UoZm9iai0+ c2hhcmVkW2ldKTsKIAogCQkJcmV0ID0gcmVzZXJ2YXRpb25fb2JqZWN0X3Rlc3Rfc2lnbmFsZWRf c2luZ2xlKGZlbmNlKTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gdW5sb2NrX3JldHJ5Owor CQkJCWdvdG8gcmV0cnk7CiAJCQllbHNlIGlmICghcmV0KQogCQkJCWJyZWFrOwogCQl9CiAKLQkJ LyoKLQkJICogVGhlcmUgY291bGQgYmUgYSByZWFkX3NlcWNvdW50X3JldHJ5IGhlcmUsIGJ1dCBu b3RoaW5nIGNhcmVzCi0JCSAqIGFib3V0IHdoZXRoZXIgaXQncyB0aGUgb2xkIG9yIG5ld2VyIGZl bmNlIHBvaW50ZXJzIHRoYXQgYXJlCi0JCSAqIHNpZ25hbGVkLiBUaGF0IHJhY2UgY291bGQgc3Rp bGwgaGF2ZSBoYXBwZW5lZCBhZnRlciBjaGVja2luZwotCQkgKiByZWFkX3NlcWNvdW50X3JldHJ5 LiBJZiB5b3UgY2FyZSwgdXNlIHd3X211dGV4X2xvY2suCi0JCSAqLworCQlpZiAocmVhZF9zZXFj b3VudF9yZXRyeSgmb2JqLT5zZXEsIHNlcSkpCisJCQlnb3RvIHJldHJ5OwogCX0KIAogCWlmICgh c2hhcmVkX2NvdW50KSB7CiAJCXN0cnVjdCBmZW5jZSAqZmVuY2VfZXhjbCA9IHJjdV9kZXJlZmVy ZW5jZShvYmotPmZlbmNlX2V4Y2wpOwogCi0JCWlmIChyZWFkX3NlcWNvdW50X3JldHJ5KCZvYmot PnNlcSwgc2VxKSkKLQkJCWdvdG8gdW5sb2NrX3JldHJ5OwotCiAJCWlmIChmZW5jZV9leGNsKSB7 CiAJCQlyZXQgPSByZXNlcnZhdGlvbl9vYmplY3RfdGVzdF9zaWduYWxlZF9zaW5nbGUoCiAJCQkJ CQkJCWZlbmNlX2V4Y2wpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byB1bmxvY2tfcmV0cnk7 CisJCQkJZ290byByZXRyeTsKKworCQkJaWYgKHJlYWRfc2VxY291bnRfcmV0cnkoJm9iai0+c2Vx LCBzZXEpKQorCQkJCWdvdG8gcmV0cnk7CiAJCX0KIAl9CiAKIAlyY3VfcmVhZF91bmxvY2soKTsK IAlyZXR1cm4gcmV0OwotCi11bmxvY2tfcmV0cnk6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JZ290 byByZXRyeTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlc2VydmF0aW9uX29iamVjdF90ZXN0X3Np Z25hbGVkX3JjdSk7Ci0tIAoyLjkuMwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vZHJpLWRldmVsCg==