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: 9330127 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 AF33D6048F for ; Tue, 13 Sep 2016 23:43:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9DA5F297FA for ; Tue, 13 Sep 2016 23:43:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 90F1A29801; Tue, 13 Sep 2016 23:43:26 +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=unavailable 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 606CA297FA for ; Tue, 13 Sep 2016 23:43:26 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7CE6E6E5AF; Tue, 13 Sep 2016 23:43:14 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@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 Subject: [PATCH i-g-t] tests/sw_sync: Add subtest test_sync_expired_merge 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 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" 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(); }