On Tue, Aug 28, 2018 at 02:45:32PM +0300, Leon Romanovsky wrote: > From: Parav Pandit <parav@xxxxxxxxxxxx> > > Currently rdma_addr_cancel() is an async operation, which notifies that > cancel is done by executing the callback function given during > rdma_resolve_ip(). If resolve_ip request is already completed than > callback is not executed. > > Instead, now rdma_resolve_addr() and rdma_addr_cancel() simplified in > following ways. > 1. rdma_addr_cancel() now a synchronous method. If request was > pending, after it is cancelled, no callback is notified. > 2. rdma_resolve_addr() and respective addr_handler() callback doesn't > need to hold reference to cm_id. > > Signed-off-by: Parav Pandit <parav@xxxxxxxxxxxx> > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > drivers/infiniband/core/addr.c | 12 +++++++----- > drivers/infiniband/core/cma.c | 4 ---- > 2 files changed, 7 insertions(+), 9 deletions(-) > > diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c > index 46b855a42884..94ff38731be8 100644 > +++ b/drivers/infiniband/core/addr.c > @@ -660,6 +660,13 @@ int rdma_resolve_ip_route(struct sockaddr *src_addr, > return addr_resolve(src_in, dst_addr, addr, false, 0); > } > > +/** > + * rdma_addr_cancel - Cancel resolve ip request > + * @addr: Pointer to address structure given previously > + * during rdma_resolve_ip(). > + * rdma_addr_cancel() is synchronous function which cancels any pending > + * request if there is any. > + */ > void rdma_addr_cancel(struct rdma_dev_addr *addr) > { > struct addr_req *req, *temp_req; > @@ -687,11 +694,6 @@ void rdma_addr_cancel(struct rdma_dev_addr *addr) > * guarentees no work is running and none will be started. > */ > cancel_delayed_work_sync(&found->work); > - > - if (found->callback) > - found->callback(-ECANCELED, (struct sockaddr *)&found->src_addr, > - found->addr, found->context); > - I still don't understand why this change is needed, and I dislike it from an API design perspective. Jason