All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] IB: allow NULL sa_query callbacks
@ 2005-05-24 22:20 Roland Dreier
  2005-05-24 22:20 ` [PATCH 1/2] IB: fix potential ib_umad leak Roland Dreier
  2005-05-24 22:23 ` [openib-general] [PATCH 0/2] IB: allow NULL sa_query callbacks Roland Dreier
  0 siblings, 2 replies; 4+ messages in thread
From: Roland Dreier @ 2005-05-24 22:20 UTC (permalink / raw)
  To: akpm; +Cc: linux-kernel, openib-general

Check if a client passes a NULL callback into an SA query, and if so,
never call back.  This fixes an oops if someone unloads ib_ipoib and
ib_sa in rapid succession.  ib_ipoib does an MCMember delete with a
NULL callback and 0 timeout on unload, which is usually fine since the
delete completes successfully.  However, if ib_sa is unloaded
immediately afterwards, the delete will be canceled and ib_sa will try
to call the (now already unloaded) ib_ipoib module back with the
cancel completion, which triggers the oops.

Signed-off-by: Roland Dreier <roland@topspin.com>

---

 drivers/infiniband/core/sa_query.c |   35 ++++++++++++++++++-----------------
 1 files changed, 18 insertions(+), 17 deletions(-)



--- linux-git.orig/drivers/infiniband/core/sa_query.c	2005-05-24 15:17:29.409716468 -0700
+++ linux-git/drivers/infiniband/core/sa_query.c	2005-05-24 15:17:39.225578334 -0700
@@ -587,7 +587,7 @@
 
 	init_mad(query->sa_query.mad, agent);
 
-	query->sa_query.callback              = ib_sa_path_rec_callback;
+	query->sa_query.callback              = callback ? ib_sa_path_rec_callback : NULL;
 	query->sa_query.release               = ib_sa_path_rec_release;
 	query->sa_query.port                  = port;
 	query->sa_query.mad->mad_hdr.method   = IB_MGMT_METHOD_GET;
@@ -663,7 +663,7 @@
 
 	init_mad(query->sa_query.mad, agent);
 
-	query->sa_query.callback              = ib_sa_mcmember_rec_callback;
+	query->sa_query.callback              = callback ? ib_sa_mcmember_rec_callback : NULL;
 	query->sa_query.release               = ib_sa_mcmember_rec_release;
 	query->sa_query.port                  = port;
 	query->sa_query.mad->mad_hdr.method   = method;
@@ -698,20 +698,21 @@
 	if (!query)
 		return;
 
-	switch (mad_send_wc->status) {
-	case IB_WC_SUCCESS:
-		/* No callback -- already got recv */
-		break;
-	case IB_WC_RESP_TIMEOUT_ERR:
-		query->callback(query, -ETIMEDOUT, NULL);
-		break;
-	case IB_WC_WR_FLUSH_ERR:
-		query->callback(query, -EINTR, NULL);
-		break;
-	default:
-		query->callback(query, -EIO, NULL);
-		break;
-	}
+	if (query->callback)
+		switch (mad_send_wc->status) {
+		case IB_WC_SUCCESS:
+			/* No callback -- already got recv */
+			break;
+		case IB_WC_RESP_TIMEOUT_ERR:
+			query->callback(query, -ETIMEDOUT, NULL);
+			break;
+		case IB_WC_WR_FLUSH_ERR:
+			query->callback(query, -EINTR, NULL);
+			break;
+		default:
+			query->callback(query, -EIO, NULL);
+			break;
+		}
 
 	dma_unmap_single(agent->device->dma_device,
 			 pci_unmap_addr(query, mapping),
@@ -736,7 +737,7 @@
 	query = idr_find(&query_idr, mad_recv_wc->wc->wr_id);
 	spin_unlock_irqrestore(&idr_lock, flags);
 
-	if (query) {
+	if (query && query->callback) {
 		if (mad_recv_wc->wc->status == IB_WC_SUCCESS)
 			query->callback(query,
 					mad_recv_wc->recv_buf.mad->mad_hdr.status ?


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] IB: fix potential ib_umad leak
  2005-05-24 22:20 [PATCH 0/2] IB: allow NULL sa_query callbacks Roland Dreier
@ 2005-05-24 22:20 ` Roland Dreier
  2005-05-24 22:20   ` [PATCH 2/2] IB: fix endianness of path record MTU field Roland Dreier
  2005-05-24 22:23 ` [openib-general] [PATCH 0/2] IB: allow NULL sa_query callbacks Roland Dreier
  1 sibling, 1 reply; 4+ messages in thread
From: Roland Dreier @ 2005-05-24 22:20 UTC (permalink / raw)
  To: akpm; +Cc: linux-kernel, openib-general

Free all unclaimed MAD receive buffers when userspace closes our file
so we don't leak memory.

Signed-off-by: Roland Dreier <roland@topspin.com>

---

 drivers/infiniband/core/user_mad.c |    4 ++++
 1 files changed, 4 insertions(+)



--- linux-git.orig/drivers/infiniband/core/user_mad.c	2005-05-24 15:11:25.795151912 -0700
+++ linux-git/drivers/infiniband/core/user_mad.c	2005-05-24 15:17:39.800453121 -0700
@@ -499,6 +499,7 @@
 static int ib_umad_close(struct inode *inode, struct file *filp)
 {
 	struct ib_umad_file *file = filp->private_data;
+	struct ib_umad_packet *packet, *tmp;
 	int i;
 
 	for (i = 0; i < IB_UMAD_MAX_AGENTS; ++i)
@@ -507,6 +508,9 @@
 			ib_unregister_mad_agent(file->agent[i]);
 		}
 
+	list_for_each_entry_safe(packet, tmp, &file->recv_list, list)
+		kfree(packet);
+
 	kfree(file);
 
 	return 0;


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2/2] IB: fix endianness of path record MTU field
  2005-05-24 22:20 ` [PATCH 1/2] IB: fix potential ib_umad leak Roland Dreier
@ 2005-05-24 22:20   ` Roland Dreier
  0 siblings, 0 replies; 4+ messages in thread
From: Roland Dreier @ 2005-05-24 22:20 UTC (permalink / raw)
  To: akpm; +Cc: linux-kernel, openib-general

Make MTU field in SA PathRecord and MCMemberRecord a u8 rather than an
enum to avoid complications with endianness.

Signed-off-by: Roland Dreier <roland@topspin.com>

---

 drivers/infiniband/include/ib_sa.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)



--- linux-git.orig/drivers/infiniband/include/ib_sa.h	2005-05-24 15:15:55.076280598 -0700
+++ linux-git/drivers/infiniband/include/ib_sa.h	2005-05-24 15:17:41.485086202 -0700
@@ -147,7 +147,7 @@
 	/* reserved */
 	u8           sl;
 	u8           mtu_selector;
-	enum ib_mtu  mtu;
+	u8           mtu;
 	u8           rate_selector;
 	u8           rate;
 	u8           packet_life_time_selector;
@@ -180,7 +180,7 @@
 	u32          qkey;
 	u16          mlid;
 	u8           mtu_selector;
-	enum         ib_mtu mtu;
+	u8           mtu;
 	u8           traffic_class;
 	u16          pkey;
 	u8 	     rate_selector;


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [openib-general] [PATCH 0/2] IB: allow NULL sa_query callbacks
  2005-05-24 22:20 [PATCH 0/2] IB: allow NULL sa_query callbacks Roland Dreier
  2005-05-24 22:20 ` [PATCH 1/2] IB: fix potential ib_umad leak Roland Dreier
@ 2005-05-24 22:23 ` Roland Dreier
  1 sibling, 0 replies; 4+ messages in thread
From: Roland Dreier @ 2005-05-24 22:23 UTC (permalink / raw)
  To: akpm; +Cc: linux-kernel, openib-general

err, sorry -- slight screwup in the subject lines due to a bug in my
patch scripts.  These should obviously be 1-based rather than 0-based.
Anyway, the patches themselves should be fine.

Thanks,
  Roland


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-05-24 22:26 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-05-24 22:20 [PATCH 0/2] IB: allow NULL sa_query callbacks Roland Dreier
2005-05-24 22:20 ` [PATCH 1/2] IB: fix potential ib_umad leak Roland Dreier
2005-05-24 22:20   ` [PATCH 2/2] IB: fix endianness of path record MTU field Roland Dreier
2005-05-24 22:23 ` [openib-general] [PATCH 0/2] IB: allow NULL sa_query callbacks Roland Dreier

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.