Thanks Hal,
this patch fixed the problem (oops in ib_at.c)

  Itamar

> -----Original Message-----
> From: Hal Rosenstock [mailto:[EMAIL PROTECTED]
> Sent: Monday, May 30, 2005 8:37 PM
> To: James Lentini
> Cc: [email protected]
> Subject: [openib-general] [PATCH] [ib_at]: Update async 
> structure prior
> to returning requests to appropriate cache
> 
> 
> [ib_at]: Update async structure prior to returning requests to
> appropriate cache. This change affacts req_free, free_route_req, and
> free_path_req.
> 
> Also, some other minor changes to eliminate unneeded 
> parameter passed to
> path_req_output and changes to some DEBUG messages.
> 
> Signed-off-by: Hal Rosenstock <[EMAIL PROTECTED]>
> 
> Index: at.c
> ===================================================================
> --- at.c      (revision 2507)
> +++ at.c      (working copy)
> @@ -155,7 +155,8 @@
>  
>  static void free_route_req(void *async);
>  static void free_path_req(void *async);
> -static void path_req_complete(int stat, struct 
> ib_sa_path_rec *ret, void *ctx);
> +static void path_req_complete(int status, struct 
> ib_sa_path_rec *resp,
> +                           void *context);
>  static int resolve_path(struct path_req *req);
>  
>  static int resolve_ip(struct ib_at_src *src, u32 dst_ip, u32 src_ip,
> @@ -274,7 +275,6 @@
>       }
>  
>       memset(dgid, 0, sizeof *dgid);
> -
>       return 0;
>  }
>  
> @@ -319,11 +319,10 @@
>               break;
>       default:
>               WARN("bad async req type %d", pend->type);
> +             pend->status = IB_AT_STATUS_INVALID;
> +             pend->type = IBAT_REQ_NONE;
> +             pend->sa_query = NULL;
>       }
> -
> -     pend->status = IB_AT_STATUS_INVALID;
> -     pend->type = IBAT_REQ_NONE;
> -     pend->sa_query = NULL;
>  }
>  
>  static int req_start(struct async *q, struct async *pend,
> @@ -464,6 +463,11 @@
>       struct route_req *req = container_of(async, struct 
> route_req, pend);
>  
>       DEBUG("free async %p req %p", async, req);
> +
> +     req->pend.status = IB_AT_STATUS_INVALID;
> +     req->pend.type = IBAT_REQ_NONE;
> +     req->pend.sa_query = NULL;
> +
>       kmem_cache_free(route_req_cache, req);
>  }
>  
> @@ -472,6 +476,11 @@
>       struct path_req *req = container_of(async, struct 
> path_req, pend);
>  
>       DEBUG("free async %p req %p", async, req);
> +
> +     req->pend.status = IB_AT_STATUS_INVALID;
> +     req->pend.type = IBAT_REQ_NONE;
> +     req->pend.sa_query = NULL;
> +
>       kmem_cache_free(path_req_cache, req);
>  }
>  
> @@ -537,15 +546,14 @@
>       return 1;               /* one entry is filled */
>  }
>  
> -static int path_req_output(struct path_req *req, struct 
> ib_sa_path_rec *resp,
> -                        int npath, struct ib_sa_path_rec 
> *out, int nelem)
> +static int path_req_output(struct ib_sa_path_rec *resp, int npath,
> +                        struct ib_sa_path_rec *out, int nelem)
>  {
>       int n = min(npath, nelem);
>  
> -     DEBUG("parent %p output %d records", req, n);
> +     DEBUG("fill ib_sa_path_rec %p output %d records", out, n);
>  
>       memcpy(out, resp, n * sizeof (struct ib_sa_path_rec));
> -
>       return n;
>  }
>  
> @@ -579,7 +587,7 @@
>       unsigned long flags;
>       struct async *pend;
>  
> -     DEBUG("req %p", req);
> +     DEBUG("req %p status %d", req, status);
>  
>       if (req->pend.parent) {
>               WARN("for child req %p???", req);
> @@ -598,12 +606,12 @@
>               return;
>       }
>  
> -     req->pend.nelem = path_req_output(req, resp, 1,
> +     req->pend.nelem = path_req_output(resp, 1,
>                                         req->pend.data, 
> req->pend.nelem);
>  
>       spin_lock_irqsave(&pending_reqs.lock, flags);
>       for (pend = req->pend.waiting; pend; pend = pend->waiting)      
> -             pend->nelem = path_req_output(req, resp, 1,
> +             pend->nelem = path_req_output(resp, 1,
>                                             pend->data, pend->nelem);
>  
>       req_end(&req->pend, req->pend.nelem, NULL);
> @@ -876,7 +884,7 @@
>       if (in_cache) {
>               DEBUG("!in_cache free req %p", preq);
>               kmem_cache_free(path_req_cache, preq);
> -             return path_req_output(preq, cached_arr, n, 
> path_arr, npath);
> +             return path_req_output(cached_arr, n, path_arr, npath);
>       }
>       */
>  
> @@ -969,7 +977,6 @@
>  EXPORT_SYMBOL(ib_at_status);
>  
>  
> -
>  /*
>   * Internal init/cleanup functions:
>   */
> 
> 
> 
> _______________________________________________
> openib-general mailing list
> [email protected]
> http://openib.org/mailman/listinfo/openib-general
> 
> To unsubscribe, please visit 
http://openib.org/mailman/listinfo/openib-general
_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to