[openib-general] [PATCH] RDMA/addr: Fix some cancellation problems in process_req().

Krishna Kumar krkumar2 at in.ibm.com
Fri Nov 24 02:32:34 PST 2006


Fix following problems in process_req() relating to
cancellation :

- Function is wrongly doing another addr_remote() when
  cancelled, which is not required.
- Make failure reporting immediate by using time_after_eq().
- On cancellation, -ETIMEDOUT was returned to the callback
  routine instead of the more appropriate -ECANCELLED (users
  getting notified may want to print/return this status, eg
  ucma_event_handler).

Change from last submission (other than port to rc5 bits) :
------------------------------------------------------------

Incorporated Sean's comment on patch :

"I think we just need:
		if (req->status == -ENODATA) {
The other changes look fine. But note that if "req->status == -ECANCELLED and
time_after() is true, then it seems like a toss up as to which one can be
reported to the user".

Signed-off-by: Krishna Kumar <krkumar2 at in.ibm.com>
---
diff -ruNp org/drivers/infiniband/core/addr.c new/drivers/infiniband/core/addr.c
--- org/drivers/infiniband/core/addr.c	2006-24-11 10:37:20.000000000 +0530
+++ new/drivers/infiniband/core/addr.c	2006-24-11 11:26:50.000000000 +0530
@@ -225,17 +225,16 @@ static void process_req(void *data)
 
 	mutex_lock(&lock);
 	list_for_each_entry_safe(req, temp_req, &req_list, list) {
-		if (req->status) {
+		if (req->status == -ENODATA) {
 			src_in = (struct sockaddr_in *) &req->src_addr;
 			dst_in = (struct sockaddr_in *) &req->dst_addr;
 			req->status = addr_resolve_remote(src_in, dst_in,
 							  req->addr);
+			if (req->status && time_after_eq(jiffies, req->timeout))
+				req->status = -ETIMEDOUT;
+			else if (req->status == -ENODATA)
+				continue;
 		}
-		if (req->status && time_after(jiffies, req->timeout))
-			req->status = -ETIMEDOUT;
-		else if (req->status == -ENODATA)
-			continue;
-
 		list_del(&req->list);
 		list_add_tail(&req->list, &done_list);
 	}




More information about the general mailing list