From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 39947A00C5 for ; Thu, 14 May 2020 13:00:14 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1CB5A1D8DC; Thu, 14 May 2020 13:00:14 +0200 (CEST) Received: from huawei.com (szxga04-in.huawei.com [45.249.212.190]) by dpdk.org (Postfix) with ESMTP id 5319B1D8CC; Thu, 14 May 2020 13:00:11 +0200 (CEST) Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 84D479513C477BA64A50; Thu, 14 May 2020 19:00:06 +0800 (CST) Received: from localhost (10.173.251.152) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.487.0; Thu, 14 May 2020 18:59:57 +0800 From: wangyunjian To: CC: , , , , Yunjian Wang , Date: Thu, 14 May 2020 18:59:55 +0800 Message-ID: <1589453995-4508-1-git-send-email-wangyunjian@huawei.com> X-Mailer: git-send-email 1.9.5.msysgit.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.173.251.152] X-CFilter-Loop: Reflected Subject: [dpdk-stable] [dpdk-dev] [PATCH v3 1/2] crypto/caam_jr: fix wrong check of fd X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" From: Yunjian Wang Zero is a valid fd. It will fail to check the fd if the fd is zero. The "job_ring->uio_fd" is an fd, so define it as "int". Fixes: e7a45f3cc245 ("crypto/caam_jr: add UIO specific operations") Fixes: a5e1018d5e67 ("crypto/caam_jr: add routines to configure HW") Cc: stable@dpdk.org Signed-off-by: Yunjian Wang --- v2: * Change "job_ring->uio_fd" type suggested by Gagandeep Singh v3: * Add function to initialize g_uio_job_ring and g_job_rings --- drivers/crypto/caam_jr/caam_jr.c | 23 ++++++++++++--- drivers/crypto/caam_jr/caam_jr_hw_specific.h | 2 +- drivers/crypto/caam_jr/caam_jr_pvt.h | 9 +++--- drivers/crypto/caam_jr/caam_jr_uio.c | 30 +++++++++++++------- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/drivers/crypto/caam_jr/caam_jr.c b/drivers/crypto/caam_jr/caam_jr.c index 5a29dd169..0f040df5c 100644 --- a/drivers/crypto/caam_jr/caam_jr.c +++ b/drivers/crypto/caam_jr/caam_jr.c @@ -2074,7 +2074,7 @@ static struct rte_security_ops caam_jr_security_ops = { static void close_job_ring(struct sec_job_ring_t *job_ring) { - if (job_ring->irq_fd) { + if (job_ring->irq_fd != -1) { /* Producer index is frozen. If consumer index is not equal * with producer index, then we have descs to flush. */ @@ -2083,7 +2083,7 @@ close_job_ring(struct sec_job_ring_t *job_ring) /* free the uio job ring */ free_job_ring(job_ring->irq_fd); - job_ring->irq_fd = 0; + job_ring->irq_fd = -1; caam_jr_dma_free(job_ring->input_ring); caam_jr_dma_free(job_ring->output_ring); g_job_rings_no--; @@ -2187,7 +2187,7 @@ caam_jr_dev_uninit(struct rte_cryptodev *dev) * */ static void * -init_job_ring(void *reg_base_addr, uint32_t irq_id) +init_job_ring(void *reg_base_addr, int irq_id) { struct sec_job_ring_t *job_ring = NULL; int i, ret = 0; @@ -2197,7 +2197,7 @@ init_job_ring(void *reg_base_addr, uint32_t irq_id) int irq_coalescing_count = 0; for (i = 0; i < MAX_SEC_JOB_RINGS; i++) { - if (g_job_rings[i].irq_fd == 0) { + if (g_job_rings[i].irq_fd == -1) { job_ring = &g_job_rings[i]; g_job_rings_no++; break; @@ -2450,6 +2450,15 @@ cryptodev_caam_jr_remove(struct rte_vdev_device *vdev) return rte_cryptodev_pmd_destroy(cryptodev); } +static void +sec_job_rings_init(void) +{ + int i; + + for (i = 0; i < MAX_SEC_JOB_RINGS; i++) + g_job_rings[i].irq_fd = -1; +} + static struct rte_vdev_driver cryptodev_caam_jr_drv = { .probe = cryptodev_caam_jr_probe, .remove = cryptodev_caam_jr_remove @@ -2464,6 +2473,12 @@ RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_CAAM_JR_PMD, RTE_PMD_REGISTER_CRYPTO_DRIVER(caam_jr_crypto_drv, cryptodev_caam_jr_drv.driver, cryptodev_driver_id); +RTE_INIT(caam_jr_init) +{ + sec_uio_job_rings_init(); + sec_job_rings_init(); +} + RTE_INIT(caam_jr_init_log) { caam_jr_logtype = rte_log_register("pmd.crypto.caam"); diff --git a/drivers/crypto/caam_jr/caam_jr_hw_specific.h b/drivers/crypto/caam_jr/caam_jr_hw_specific.h index 5f58a585d..ec4539d1b 100644 --- a/drivers/crypto/caam_jr/caam_jr_hw_specific.h +++ b/drivers/crypto/caam_jr/caam_jr_hw_specific.h @@ -360,7 +360,7 @@ struct sec_job_ring_t { * bitwise operations. */ - uint32_t irq_fd; /* The file descriptor used for polling from + int irq_fd; /* The file descriptor used for polling from * user space for interrupts notifications */ uint32_t jr_mode; /* Model used by SEC Driver to receive diff --git a/drivers/crypto/caam_jr/caam_jr_pvt.h b/drivers/crypto/caam_jr/caam_jr_pvt.h index 98cd4438a..d6b3dafaa 100644 --- a/drivers/crypto/caam_jr/caam_jr_pvt.h +++ b/drivers/crypto/caam_jr/caam_jr_pvt.h @@ -216,7 +216,7 @@ calc_chksum(void *buffer, int len) } struct uio_job_ring { uint32_t jr_id; - uint32_t uio_fd; + int uio_fd; void *register_base_addr; int map_size; int uio_minor_number; @@ -224,8 +224,9 @@ struct uio_job_ring { int sec_cleanup(void); int sec_configure(void); +void sec_uio_job_rings_init(void); struct uio_job_ring *config_job_ring(void); -void free_job_ring(uint32_t uio_fd); +void free_job_ring(int uio_fd); /* For Dma memory allocation of specified length and alignment */ static inline void * @@ -279,7 +280,7 @@ static inline rte_iova_t caam_jr_dma_vtop(void *ptr) * @retval 0 for success * @retval -1 value for error */ -uint32_t caam_jr_enable_irqs(uint32_t uio_fd); +uint32_t caam_jr_enable_irqs(int uio_fd); /** @brief Request to SEC kernel driver to disable interrupts for descriptor * finished processing @@ -292,6 +293,6 @@ uint32_t caam_jr_enable_irqs(uint32_t uio_fd); * @retval -1 value for error * */ -uint32_t caam_jr_disable_irqs(uint32_t uio_fd); +uint32_t caam_jr_disable_irqs(int uio_fd); #endif diff --git a/drivers/crypto/caam_jr/caam_jr_uio.c b/drivers/crypto/caam_jr/caam_jr_uio.c index b1bb44ca4..30837c116 100644 --- a/drivers/crypto/caam_jr/caam_jr_uio.c +++ b/drivers/crypto/caam_jr/caam_jr_uio.c @@ -145,7 +145,7 @@ file_read_first_line(const char root[], const char subdir[], "%s/%s/%s", root, subdir, filename); fd = open(absolute_file_name, O_RDONLY); - SEC_ASSERT(fd > 0, fd, "Error opening file %s", + SEC_ASSERT(fd >= 0, fd, "Error opening file %s", absolute_file_name); /* read UIO device name from first line in file */ @@ -179,7 +179,7 @@ file_read_first_line(const char root[], const char subdir[], * kernel driver as well. No special return values are used. */ static int -sec_uio_send_command(uint32_t uio_fd, int32_t uio_command) +sec_uio_send_command(int uio_fd, int32_t uio_command) { int ret; @@ -202,7 +202,7 @@ sec_uio_send_command(uint32_t uio_fd, int32_t uio_command) * @retval -1 value for error */ uint32_t -caam_jr_enable_irqs(uint32_t uio_fd) +caam_jr_enable_irqs(int uio_fd) { int ret; @@ -233,7 +233,7 @@ caam_jr_enable_irqs(uint32_t uio_fd) * */ uint32_t -caam_jr_disable_irqs(uint32_t uio_fd) +caam_jr_disable_irqs(int uio_fd) { int ret; @@ -322,12 +322,12 @@ uio_map_registers(int uio_device_fd, int uio_device_id, } void -free_job_ring(uint32_t uio_fd) +free_job_ring(int uio_fd) { struct uio_job_ring *job_ring = NULL; int i; - if (!uio_fd) + if (uio_fd == -1) return; for (i = 0; i < MAX_SEC_JOB_RINGS; i++) { @@ -347,7 +347,7 @@ free_job_ring(uint32_t uio_fd) job_ring->jr_id, job_ring->uio_fd); close(job_ring->uio_fd); g_uio_jr_num--; - job_ring->uio_fd = 0; + job_ring->uio_fd = -1; if (job_ring->register_base_addr == NULL) return; @@ -370,7 +370,7 @@ uio_job_ring *config_job_ring(void) int i; for (i = 0; i < MAX_SEC_JOB_RINGS; i++) { - if (g_uio_job_ring[i].uio_fd == 0) { + if (g_uio_job_ring[i].uio_fd == -1) { job_ring = &g_uio_job_ring[i]; g_uio_jr_num++; break; @@ -389,7 +389,7 @@ uio_job_ring *config_job_ring(void) /* Open device file */ job_ring->uio_fd = open(uio_device_file_name, O_RDWR); - SEC_ASSERT(job_ring->uio_fd > 0, NULL, + SEC_ASSERT(job_ring->uio_fd >= 0, NULL, "Failed to open UIO device file for job ring %d", job_ring->jr_id); @@ -488,12 +488,22 @@ sec_cleanup(void) /* I need to close the fd after shutdown UIO commands need to be * sent using the fd */ - if (job_ring->uio_fd != 0) { + if (job_ring->uio_fd != -1) { CAAM_JR_INFO( "Closed device file for job ring %d , fd = %d", job_ring->jr_id, job_ring->uio_fd); close(job_ring->uio_fd); + job_ring->uio_fd = -1; } } return 0; } + +void +sec_uio_job_rings_init(void) +{ + int i; + + for (i = 0; i < MAX_SEC_JOB_RINGS; i++) + g_uio_job_ring[i].uio_fd = -1; +} -- 2.19.1