[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