From 61552661e25df5b78be3079bc02b56a375dc0fdc Mon Sep 17 00:00:00 2001 From: Yunjian Wang Date: Thu, 14 May 2020 18:59:55 +0800 Subject: [PATCH] crypto/caam_jr: fix check of file descriptors 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 Acked-by: Gagandeep Singh --- 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 45003ba25a..caf2386772 100644 --- a/drivers/crypto/caam_jr/caam_jr.c +++ b/drivers/crypto/caam_jr/caam_jr.c @@ -2072,7 +2072,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. */ @@ -2081,7 +2081,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--; @@ -2185,7 +2185,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; @@ -2195,7 +2195,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; @@ -2448,6 +2448,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 @@ -2462,6 +2471,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 5f58a585d7..bbe8bc3f90 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 98cd4438aa..d6b3dafaa6 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 b1bb44ca42..30837c1164 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.20.1