From patchwork Tue Sep 13 23:43:05 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rafael Antognolli X-Patchwork-Id: 9330125 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 9DDE06048F for ; Tue, 13 Sep 2016 23:43:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 892ED297FA for ; Tue, 13 Sep 2016 23:43:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7B56C29801; Tue, 13 Sep 2016 23:43:21 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 46D23297FA for ; Tue, 13 Sep 2016 23:43:20 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 08FE56E43B; Tue, 13 Sep 2016 23:43:14 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 66B7F6E43B; Tue, 13 Sep 2016 23:43:12 +0000 (UTC) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP; 13 Sep 2016 16:43:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.30,331,1470726000"; d="scan'208"; a="1049884599" Received: from nadine3.jf.intel.com ([10.7.197.56]) by orsmga002.jf.intel.com with ESMTP; 13 Sep 2016 16:43:10 -0700 From: Rafael Antognolli To: intel-gfx@lists.freedesktop.org Date: Tue, 13 Sep 2016 16:43:05 -0700 Message-Id: <1473810185-6300-1-git-send-email-rafael.antognolli@intel.com> X-Mailer: git-send-email 2.7.4 Cc: gustavo.padovan@collabora.co.uk, dri-devel@lists.freedesktop.org Subject: [Intel-gfx] [PATCH i-g-t] tests/sw_sync: Add subtest test_sync_expired_merge X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP This test creates an already expired fence, then creates a merged fence out of that expired one (passed twice to the merge operation), and finally closes the merged fence. It shows that if the refcounts are wrong on the original expired fence, it might get freed while still in use. Usually a kernel panick will follow. Signed-off-by: Rafael Antognolli --- tests/sw_sync.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/sw_sync.c b/tests/sw_sync.c index 4336659..31cde50 100644 --- a/tests/sw_sync.c +++ b/tests/sw_sync.c @@ -582,6 +582,31 @@ static void test_sync_multi_producer_single_consumer(void) pthread_join(threads[i], NULL); } +static void test_sync_expired_merge(void) +{ + int iterations = 1 << 20; + int timeline; + int i; + int fence_expired, fence_merged; + + timeline = sw_sync_timeline_create(); + + sw_sync_timeline_inc(timeline, 100); + fence_expired = sw_sync_fence_create(timeline, 1); + fence_merged = sw_sync_merge(fence_expired, fence_expired); + sw_sync_fence_destroy(fence_merged); + + for (i = 0; i < iterations; i++) { + int fence = sw_sync_merge(fence_expired, fence_expired); + + igt_assert_f(sw_sync_wait(fence, -1) > 0, + "Failure waiting on fence\n"); + sw_sync_fence_destroy(fence); + } + + sw_sync_fence_destroy(fence_expired); +} + static void test_sync_random_merge(void) { int i, size, ret; @@ -687,6 +712,9 @@ igt_main igt_subtest("sync_multi_producer_single_consumer") test_sync_multi_producer_single_consumer(); + igt_subtest("sync_expired_merge") + test_sync_expired_merge(); + igt_subtest("sync_random_merge") test_sync_random_merge(); }