Thread (31 messages) 31 messages, 2 authors, 2017-08-28

Re: [PATCH v7 06/12] powerpc/vas: Define helpers to alloc/free windows

From: Sukadev Bhattiprolu <hidden>
Date: 2017-08-28 04:52:45
Also in: lkml

Michael Ellerman [mpe@ellerman.id.au] wrote:
Sukadev Bhattiprolu [off-list ref] writes:
quoted
diff --git a/arch/powerpc/platforms/powernv/vas-window.c b/arch/powerpc/platforms/powernv/vas-window.c
quoted
+	rc = ida_pre_get(ida, GFP_KERNEL);
+	if (!rc)
+		return -EAGAIN;
+
+	spin_lock(&vas_ida_lock);
+	rc = ida_get_new_above(ida, 0, &winid);
If you're passing 0 you can just use ida_get_new().
Ok.
Or did you actually want to exclude 0? In which case you should pass 1.
quoted
+	spin_unlock(&vas_ida_lock);
+
+	if (rc)
+		return rc;
You're supposed to handle EAGAIN I thought.
Yes, I will retry the pre_get()
quoted
+
+	if (winid > VAS_WINDOWS_PER_CHIP) {
+		pr_err("VAS: Too many (%d) open windows\n", winid);
+		vas_release_window_id(ida, winid);
+		return -EAGAIN;
+	}
+
+	return winid;
+}
+
+void vas_window_free(struct vas_window *window)
static.
Ok
quoted
+{
+	int winid = window->winid;
+	struct vas_instance *vinst = window->vinst;
+
+	unmap_winctx_mmio_bars(window);
+	kfree(window);
+
+	vas_release_window_id(&vinst->ida, winid);
+}
+
+struct vas_window *vas_window_alloc(struct vas_instance *vinst)
+{
+	int winid;
+	struct vas_window *window;
+
+	winid = vas_assign_window_id(&vinst->ida);
+	if (winid < 0)
+		return ERR_PTR(winid);
+
+	window = kzalloc(sizeof(*window), GFP_KERNEL);
+	if (!window)
+		return ERR_PTR(-ENOMEM);
You leak an id here.
Argh. Yes.
The error handling would be easier in here if the caller did the alloc,
or if you split alloc and init, and alloc just did the kzalloc().
I was trying to simplify error handling in the callers where they have
to only deal with one failure now.
One of the callers even prints "unable to allocate memory" if this
function fails, but that's not accurate, there's several failure modes.
Yes, will fix that message and the leaks.

Thanks,

Suka
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help