Commit 9b565576 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

nfp: don't wait for resources indefinitely

There is currently no timeout to the resource and lock acquiring
loops.  We printed warnings and depended on user sending a signal
to the waiting process to stop the waiting.  This doesn't work
very well when wait happens out of a work queue.  The simplest
example of that is PCI probe.  When user loads the module and card
is in a broken state modprobe will wait forever and signals sent
to it will not actually reach the probing thread.

Make sure all wait loops have a time out.  Set the upper wait time
to 60 seconds to stay on the safe side.
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent eefbde7e
...@@ -63,6 +63,11 @@ ...@@ -63,6 +63,11 @@
/* Max size of area it should be safe to request */ /* Max size of area it should be safe to request */
#define NFP_CPP_SAFE_AREA_SIZE SZ_2M #define NFP_CPP_SAFE_AREA_SIZE SZ_2M
/* NFP_MUTEX_WAIT_* are timeouts in seconds when waiting for a mutex */
#define NFP_MUTEX_WAIT_FIRST_WARN 15
#define NFP_MUTEX_WAIT_NEXT_WARN 5
#define NFP_MUTEX_WAIT_ERROR 60
struct device; struct device;
struct nfp_cpp_area; struct nfp_cpp_area;
......
...@@ -195,7 +195,8 @@ void nfp_cpp_mutex_free(struct nfp_cpp_mutex *mutex) ...@@ -195,7 +195,8 @@ void nfp_cpp_mutex_free(struct nfp_cpp_mutex *mutex)
*/ */
int nfp_cpp_mutex_lock(struct nfp_cpp_mutex *mutex) int nfp_cpp_mutex_lock(struct nfp_cpp_mutex *mutex)
{ {
unsigned long warn_at = jiffies + 15 * HZ; unsigned long warn_at = jiffies + NFP_MUTEX_WAIT_FIRST_WARN * HZ;
unsigned long err_at = jiffies + NFP_MUTEX_WAIT_ERROR * HZ;
unsigned int timeout_ms = 1; unsigned int timeout_ms = 1;
int err; int err;
...@@ -214,12 +215,16 @@ int nfp_cpp_mutex_lock(struct nfp_cpp_mutex *mutex) ...@@ -214,12 +215,16 @@ int nfp_cpp_mutex_lock(struct nfp_cpp_mutex *mutex)
return -ERESTARTSYS; return -ERESTARTSYS;
if (time_is_before_eq_jiffies(warn_at)) { if (time_is_before_eq_jiffies(warn_at)) {
warn_at = jiffies + 60 * HZ; warn_at = jiffies + NFP_MUTEX_WAIT_NEXT_WARN * HZ;
nfp_warn(mutex->cpp, nfp_warn(mutex->cpp,
"Warning: waiting for NFP mutex [depth:%hd target:%d addr:%llx key:%08x]\n", "Warning: waiting for NFP mutex [depth:%hd target:%d addr:%llx key:%08x]\n",
mutex->depth, mutex->depth,
mutex->target, mutex->address, mutex->key); mutex->target, mutex->address, mutex->key);
} }
if (time_is_before_eq_jiffies(err_at)) {
nfp_err(mutex->cpp, "Error: mutex wait timed out\n");
return -EBUSY;
}
} }
return err; return err;
......
...@@ -181,7 +181,8 @@ nfp_resource_try_acquire(struct nfp_cpp *cpp, struct nfp_resource *res, ...@@ -181,7 +181,8 @@ nfp_resource_try_acquire(struct nfp_cpp *cpp, struct nfp_resource *res,
struct nfp_resource * struct nfp_resource *
nfp_resource_acquire(struct nfp_cpp *cpp, const char *name) nfp_resource_acquire(struct nfp_cpp *cpp, const char *name)
{ {
unsigned long warn_at = jiffies + 15 * HZ; unsigned long warn_at = jiffies + NFP_MUTEX_WAIT_FIRST_WARN * HZ;
unsigned long err_at = jiffies + NFP_MUTEX_WAIT_ERROR * HZ;
struct nfp_cpp_mutex *dev_mutex; struct nfp_cpp_mutex *dev_mutex;
struct nfp_resource *res; struct nfp_resource *res;
int err; int err;
...@@ -214,10 +215,15 @@ nfp_resource_acquire(struct nfp_cpp *cpp, const char *name) ...@@ -214,10 +215,15 @@ nfp_resource_acquire(struct nfp_cpp *cpp, const char *name)
} }
if (time_is_before_eq_jiffies(warn_at)) { if (time_is_before_eq_jiffies(warn_at)) {
warn_at = jiffies + 60 * HZ; warn_at = jiffies + NFP_MUTEX_WAIT_NEXT_WARN * HZ;
nfp_warn(cpp, "Warning: waiting for NFP resource %s\n", nfp_warn(cpp, "Warning: waiting for NFP resource %s\n",
name); name);
} }
if (time_is_before_eq_jiffies(err_at)) {
nfp_err(cpp, "Error: resource %s timed out\n", name);
err = -EBUSY;
goto err_free;
}
} }
nfp_cpp_mutex_free(dev_mutex); nfp_cpp_mutex_free(dev_mutex);
......
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