Commit dabed0e6 authored by Eli Cohen's avatar Eli Cohen Committed by Roland Dreier

mlx5: Keep polling to reclaim pages while any returned

Change mlx5_reclaim_startup_pages() to keep polling while any pages
are returned.  If none are returned, keep polling for five more seconds
before exiting with an error message.
Signed-off-by: default avatarEli Cohen <eli@mellanox.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent a0c84c32
...@@ -90,6 +90,10 @@ struct mlx5_manage_pages_outbox { ...@@ -90,6 +90,10 @@ struct mlx5_manage_pages_outbox {
__be64 pas[0]; __be64 pas[0];
}; };
enum {
MAX_RECLAIM_TIME_MSECS = 5000,
};
static int insert_page(struct mlx5_core_dev *dev, u64 addr, struct page *page, u16 func_id) static int insert_page(struct mlx5_core_dev *dev, u64 addr, struct page *page, u16 func_id)
{ {
struct rb_root *root = &dev->priv.page_root; struct rb_root *root = &dev->priv.page_root;
...@@ -279,6 +283,9 @@ static int reclaim_pages(struct mlx5_core_dev *dev, u32 func_id, int npages, ...@@ -279,6 +283,9 @@ static int reclaim_pages(struct mlx5_core_dev *dev, u32 func_id, int npages,
int err; int err;
int i; int i;
if (nclaimed)
*nclaimed = 0;
memset(&in, 0, sizeof(in)); memset(&in, 0, sizeof(in));
outlen = sizeof(*out) + npages * sizeof(out->pas[0]); outlen = sizeof(*out) + npages * sizeof(out->pas[0]);
out = mlx5_vzalloc(outlen); out = mlx5_vzalloc(outlen);
...@@ -388,20 +395,25 @@ static int optimal_reclaimed_pages(void) ...@@ -388,20 +395,25 @@ static int optimal_reclaimed_pages(void)
int mlx5_reclaim_startup_pages(struct mlx5_core_dev *dev) int mlx5_reclaim_startup_pages(struct mlx5_core_dev *dev)
{ {
unsigned long end = jiffies + msecs_to_jiffies(5000); unsigned long end = jiffies + msecs_to_jiffies(MAX_RECLAIM_TIME_MSECS);
struct fw_page *fwp; struct fw_page *fwp;
struct rb_node *p; struct rb_node *p;
int nclaimed = 0;
int err; int err;
do { do {
p = rb_first(&dev->priv.page_root); p = rb_first(&dev->priv.page_root);
if (p) { if (p) {
fwp = rb_entry(p, struct fw_page, rb_node); fwp = rb_entry(p, struct fw_page, rb_node);
err = reclaim_pages(dev, fwp->func_id, optimal_reclaimed_pages(), NULL); err = reclaim_pages(dev, fwp->func_id,
optimal_reclaimed_pages(),
&nclaimed);
if (err) { if (err) {
mlx5_core_warn(dev, "failed reclaiming pages (%d)\n", err); mlx5_core_warn(dev, "failed reclaiming pages (%d)\n", err);
return err; return err;
} }
if (nclaimed)
end = jiffies + msecs_to_jiffies(MAX_RECLAIM_TIME_MSECS);
} }
if (time_after(jiffies, end)) { if (time_after(jiffies, end)) {
mlx5_core_warn(dev, "FW did not return all pages. giving up...\n"); mlx5_core_warn(dev, "FW did not return all pages. giving up...\n");
......
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