Inter-revision diff: patch 6

Comparing v7 (message) to v8 (message)

--- 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);
 +}
 +
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help