--- v7
+++ v8
@@ -1,45 +1,51 @@
Define helpers to allocate/free VAS window objects. These will
be used in follow-on patches when opening/closing windows.
+Changelog[v8]:
+ - [Michael Ellerman] Make some functions static; retry if
+ ida_get_new() fails with EAGAIN; fix a couple of leak in ids
+
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
---
- arch/powerpc/platforms/powernv/vas-window.c | 70 +++++++++++++++++++++++++++++
- 1 file changed, 70 insertions(+)
+ arch/powerpc/platforms/powernv/vas-window.c | 73 +++++++++++++++++++++++++++++
+ 1 file changed, 73 insertions(+)
diff --git a/arch/powerpc/platforms/powernv/vas-window.c b/arch/powerpc/platforms/powernv/vas-window.c
-index 3a50d6a..9c12919 100644
+index 68dfe53..bfc9dba 100644
--- a/arch/powerpc/platforms/powernv/vas-window.c
+++ b/arch/powerpc/platforms/powernv/vas-window.c
-@@ -490,6 +490,76 @@ int init_winctx_regs(struct vas_window *window, struct vas_winctx *winctx)
+@@ -485,6 +485,79 @@ int init_winctx_regs(struct vas_window *window, struct vas_winctx *winctx)
return 0;
}
-+DEFINE_SPINLOCK(vas_ida_lock);
++static DEFINE_SPINLOCK(vas_ida_lock);
+
-+void vas_release_window_id(struct ida *ida, int winid)
++static void vas_release_window_id(struct ida *ida, int winid)
+{
+ spin_lock(&vas_ida_lock);
+ ida_remove(ida, winid);
+ spin_unlock(&vas_ida_lock);
+}
+
-+int vas_assign_window_id(struct ida *ida)
++static int vas_assign_window_id(struct ida *ida)
+{
+ int rc, winid;
+
-+ rc = ida_pre_get(ida, GFP_KERNEL);
-+ if (!rc)
-+ return -EAGAIN;
++ do {
++ rc = ida_pre_get(ida, GFP_KERNEL);
++ if (!rc)
++ return -EAGAIN;
+
-+ spin_lock(&vas_ida_lock);
-+ rc = ida_get_new_above(ida, 0, &winid);
-+ spin_unlock(&vas_ida_lock);
++ spin_lock(&vas_ida_lock);
++ rc = ida_get_new(ida, &winid);
++ spin_unlock(&vas_ida_lock);
++ } while (rc == -EAGAIN);
+
+ if (rc)
+ return rc;
+
+ if (winid > VAS_WINDOWS_PER_CHIP) {
-+ pr_err("VAS: Too many (%d) open windows\n", winid);
++ pr_err("Too many (%d) open windows\n", winid);
+ vas_release_window_id(ida, winid);
+ return -EAGAIN;
+ }
@@ -69,7 +75,7 @@
+
+ window = kzalloc(sizeof(*window), GFP_KERNEL);
+ if (!window)
-+ return ERR_PTR(-ENOMEM);
++ goto out_free;
+
+ window->vinst = vinst;
+ window->winid = winid;
@@ -81,6 +87,7 @@
+
+out_free:
+ kfree(window);
++ vas_release_window_id(&vinst->ida, winid);
+ return ERR_PTR(-ENOMEM);
+}
+