From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id AEA2E423F2; Mon, 16 Jan 2023 18:38:31 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6F37F42D3B; Mon, 16 Jan 2023 18:38:05 +0100 (CET) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mails.dpdk.org (Postfix) with ESMTP id 9378642D21 for ; Mon, 16 Jan 2023 18:38:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1673890682; x=1705426682; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=1LqDA38j0pDRXE4FLbv7jwinXiFM33626cWChtIHxVE=; b=X+g/m9MPTE6IqBBx2lQ9lmv4bjS8bst7RCsrrnc/IoPgyelAga6UjXfM SEsFHUA09EQ2uP0Ul2PpyG0+droV8HyZRmlmFOI6L1tQ5fjP1xGXGgS0O DFLoEWoufQq2XZoX/Pe9ebuVx406dOg32ht1HFKjy836XXntW1u+kNzxb BpO73pytM54st6Ob4NZosrdmivcjGBt5MIePiiCUdNKN0j/amLvd+i4JA pDkABH/+e/fIsWJntPXmMAQxcAdzWmQVhdW7l5midrsqxIWTnVijPP8vr WpODaF0Eq/26y9nsKTYq+ovj33RLhS0a5lox02j3ZCTFJrDXKIhG9bIlm Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10592"; a="326570417" X-IronPort-AV: E=Sophos;i="5.97,221,1669104000"; d="scan'208";a="326570417" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jan 2023 09:38:02 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10592"; a="987869197" X-IronPort-AV: E=Sophos;i="5.97,221,1669104000"; d="scan'208";a="987869197" Received: from silpixa00401385.ir.intel.com ([10.237.214.55]) by fmsmga005.fm.intel.com with ESMTP; 16 Jan 2023 09:38:00 -0800 From: Bruce Richardson To: dev@dpdk.org Cc: Bruce Richardson , Chengwen Feng , Kevin Laatz Subject: [PATCH v2 6/6] test/dmadev: add tests for stopping and restarting dev Date: Mon, 16 Jan 2023 17:37:37 +0000 Message-Id: <20230116173738.562322-7-bruce.richardson@intel.com> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20230116173738.562322-1-bruce.richardson@intel.com> References: <20230116153714.554470-1-bruce.richardson@intel.com> <20230116173738.562322-1-bruce.richardson@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Validate device operation when a device is stopped or restarted. The only complication - and gap in the dmadev ABI specification - is what happens to the job ids on restart. Some drivers reset them to 0, while others continue where things left off. Take account of both possibilities in the test case. Signed-off-by: Bruce Richardson --- app/test/test_dmadev.c | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/app/test/test_dmadev.c b/app/test/test_dmadev.c index de787c14e2..8fb73a41e2 100644 --- a/app/test/test_dmadev.c +++ b/app/test/test_dmadev.c @@ -304,6 +304,48 @@ test_enqueue_copies(int16_t dev_id, uint16_t vchan) || do_multi_copies(dev_id, vchan, 0, 0, 1); } +static int +test_stop_start(int16_t dev_id, uint16_t vchan) +{ + /* device is already started on input, should be (re)started on output */ + + uint16_t id = 0; + enum rte_dma_status_code status = RTE_DMA_STATUS_SUCCESSFUL; + + /* - test stopping a device works ok, + * - then do a start-stop without doing a copy + * - finally restart the device + * checking for errors at each stage, and validating we can still copy at the end. + */ + if (rte_dma_stop(dev_id) < 0) + ERR_RETURN("Error stopping device\n"); + + if (rte_dma_start(dev_id) < 0) + ERR_RETURN("Error restarting device\n"); + if (rte_dma_stop(dev_id) < 0) + ERR_RETURN("Error stopping device after restart (no jobs executed)\n"); + + if (rte_dma_start(dev_id) < 0) + ERR_RETURN("Error restarting device after multiple stop-starts\n"); + + /* before doing a copy, we need to know what the next id will be it should + * either be: + * - the last completed job before start if driver does not reset id on stop + * - or -1 i.e. next job is 0, if driver does reset the job ids on stop + */ + if (rte_dma_completed_status(dev_id, vchan, 1, &id, &status) != 0) + ERR_RETURN("Error with rte_dma_completed_status when no job done\n"); + id += 1; /* id_count is next job id */ + if (id != id_count && id != 0) + ERR_RETURN("Unexpected next id from device after stop-start. Got %u, expected %u or 0\n", + id, id_count); + + id_count = id; + if (test_single_copy(dev_id, vchan) < 0) + ERR_RETURN("Error performing copy after device restart\n"); + return 0; +} + /* Failure handling test cases - global macros and variables for those tests*/ #define COMP_BURST_SZ 16 #define OPT_FENCE(idx) ((fence && idx == 8) ? RTE_DMA_OP_FLAG_FENCE : 0) @@ -819,6 +861,10 @@ test_dmadev_instance(int16_t dev_id) if (runtest("copy", test_enqueue_copies, 640, dev_id, vchan, CHECK_ERRS) < 0) goto err; + /* run tests stopping/starting devices and check jobs still work after restart */ + if (runtest("stop-start", test_stop_start, 1, dev_id, vchan, CHECK_ERRS) < 0) + goto err; + /* run some burst capacity tests */ if (rte_dma_burst_capacity(dev_id, vchan) < 64) printf("DMA Dev %u: insufficient burst capacity (64 required), skipping tests\n", -- 2.37.2