Commit 76e8f93e authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

nfp: don't ignore return value of wait_event_interruptible

When signal interrupts waiting for an area to become available
we assume success.  Pay attention to the return code.  Unpack
the code a little bit to make it more readable.
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 69a4aa89
...@@ -411,9 +411,43 @@ nfp_cpp_area_alloc(struct nfp_cpp *cpp, u32 dest, ...@@ -411,9 +411,43 @@ nfp_cpp_area_alloc(struct nfp_cpp *cpp, u32 dest,
*/ */
void nfp_cpp_area_free(struct nfp_cpp_area *area) void nfp_cpp_area_free(struct nfp_cpp_area *area)
{ {
if (atomic_read(&area->refcount))
nfp_warn(area->cpp, "Warning: freeing busy area\n");
nfp_cpp_area_put(area); nfp_cpp_area_put(area);
} }
static bool nfp_cpp_area_acquire_try(struct nfp_cpp_area *area, int *status)
{
*status = area->cpp->op->area_acquire(area);
return *status != -EAGAIN;
}
static int __nfp_cpp_area_acquire(struct nfp_cpp_area *area)
{
int err, status;
if (atomic_inc_return(&area->refcount) > 1)
return 0;
if (!area->cpp->op->area_acquire)
return 0;
err = wait_event_interruptible(area->cpp->waitq,
nfp_cpp_area_acquire_try(area, &status));
if (!err)
err = status;
if (err) {
nfp_warn(area->cpp, "Warning: area wait failed: %d\n", err);
atomic_dec(&area->refcount);
return err;
}
nfp_cpp_area_get(area);
return 0;
}
/** /**
* nfp_cpp_area_acquire() - lock down a CPP area for access * nfp_cpp_area_acquire() - lock down a CPP area for access
* @area: CPP area handle * @area: CPP area handle
...@@ -425,27 +459,13 @@ void nfp_cpp_area_free(struct nfp_cpp_area *area) ...@@ -425,27 +459,13 @@ void nfp_cpp_area_free(struct nfp_cpp_area *area)
*/ */
int nfp_cpp_area_acquire(struct nfp_cpp_area *area) int nfp_cpp_area_acquire(struct nfp_cpp_area *area)
{ {
mutex_lock(&area->mutex); int ret;
if (atomic_inc_return(&area->refcount) == 1) {
int (*a_a)(struct nfp_cpp_area *);
a_a = area->cpp->op->area_acquire; mutex_lock(&area->mutex);
if (a_a) { ret = __nfp_cpp_area_acquire(area);
int err;
wait_event_interruptible(area->cpp->waitq,
(err = a_a(area)) != -EAGAIN);
if (err < 0) {
atomic_dec(&area->refcount);
mutex_unlock(&area->mutex);
return err;
}
}
}
mutex_unlock(&area->mutex); mutex_unlock(&area->mutex);
nfp_cpp_area_get(area); return ret;
return 0;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment