From dbc7ec17022e7cf3533c635b48c418d984dc137f Mon Sep 17 00:00:00 2001 From: Dustin Brown Date: Fri, 12 Jan 2018 16:56:06 -0800 Subject: [PATCH] qcacmn: Untrack nbuf map on map failure Currently, nbuf map tracking happens before the nbuf is actually mapped. In cases where the actual map operation fails, remove the nbuf map tracking information to avoid false positive mapped-never-unmapped panics. Change-Id: I8e649841a661d460bf89dd5edf09bb5e460ea98c CRs-Fixed: 2171837 --- qdf/linux/src/qdf_nbuf.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c index 0b1d5b413f84..248f83d8edcb 100644 --- a/qdf/linux/src/qdf_nbuf.c +++ b/qdf/linux/src/qdf_nbuf.c @@ -658,7 +658,11 @@ QDF_STATUS qdf_nbuf_map_debug(qdf_device_t osdev, if (QDF_IS_STATUS_ERROR(status)) return status; - return __qdf_nbuf_map(osdev, buf, dir); + status = __qdf_nbuf_map(osdev, buf, dir); + if (QDF_IS_STATUS_ERROR(status)) + qdf_nbuf_untrack_map(buf, file, line); + + return status; } void qdf_nbuf_unmap_debug(qdf_device_t osdev, @@ -683,7 +687,11 @@ QDF_STATUS qdf_nbuf_map_single_debug(qdf_device_t osdev, if (QDF_IS_STATUS_ERROR(status)) return status; - return __qdf_nbuf_map_single(osdev, buf, dir); + status = __qdf_nbuf_map_single(osdev, buf, dir); + if (QDF_IS_STATUS_ERROR(status)) + qdf_nbuf_untrack_map(buf, file, line); + + return status; } void qdf_nbuf_unmap_single_debug(qdf_device_t osdev, @@ -709,7 +717,11 @@ QDF_STATUS qdf_nbuf_map_nbytes_debug(qdf_device_t osdev, if (QDF_IS_STATUS_ERROR(status)) return status; - return __qdf_nbuf_map_nbytes(osdev, buf, dir, nbytes); + status = __qdf_nbuf_map_nbytes(osdev, buf, dir, nbytes); + if (QDF_IS_STATUS_ERROR(status)) + qdf_nbuf_untrack_map(buf, file, line); + + return status; } void qdf_nbuf_unmap_nbytes_debug(qdf_device_t osdev, @@ -736,7 +748,11 @@ QDF_STATUS qdf_nbuf_map_nbytes_single_debug(qdf_device_t osdev, if (QDF_IS_STATUS_ERROR(status)) return status; - return __qdf_nbuf_map_nbytes_single(osdev, buf, dir, nbytes); + status = __qdf_nbuf_map_nbytes_single(osdev, buf, dir, nbytes); + if (QDF_IS_STATUS_ERROR(status)) + qdf_nbuf_untrack_map(buf, file, line); + + return status; } void qdf_nbuf_unmap_nbytes_single_debug(qdf_device_t osdev,