Date: Tue, 6 Nov 2007 15:03:47 GMT From: Steve Wise <swise@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 128743 for review Message-ID: <200711061503.lA6F3lbt084693@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=128743 Change 128743 by swise@swise:vic10:iwarp on 2007/11/06 15:02:56 Get rdma_cma.c to compile. Affected files ... .. //depot/projects/iwarp/sys/contrib/rdma/ib_cache.h#2 edit .. //depot/projects/iwarp/sys/contrib/rdma/rdma_cm.h#2 edit .. //depot/projects/iwarp/sys/contrib/rdma/rdma_cma.c#2 edit .. //depot/projects/iwarp/sys/modules/rdma/Makefile#2 edit .. //depot/projects/iwarp/sys/sys/linux_compat.h#3 edit Differences ... ==== //depot/projects/iwarp/sys/contrib/rdma/ib_cache.h#2 (text+ko) ==== @@ -37,7 +37,7 @@ #ifndef _IB_CACHE_H #define _IB_CACHE_H -#include <rdma/ib_verbs.h> +#include <contrib/rdma/ib_verbs.h> /** * ib_get_cached_gid - Returns a cached GID table entry ==== //depot/projects/iwarp/sys/contrib/rdma/rdma_cm.h#2 (text+ko) ==== @@ -30,10 +30,10 @@ #if !defined(RDMA_CM_H) #define RDMA_CM_H -#include <linux/socket.h> -#include <linux/in6.h> -#include <rdma/ib_addr.h> -#include <rdma/ib_sa.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <contrib/rdma/ib_addr.h> +#include <contrib/rdma/ib_sa.h> /* * Upon receiving a device removal event, users must destroy the associated ==== //depot/projects/iwarp/sys/contrib/rdma/rdma_cma.c#2 (text+ko) ==== @@ -28,23 +28,32 @@ * and/or other materials provided with the distribution. * */ +#include <sys/cdefs.h> -#include <linux/completion.h> -#include <linux/in.h> -#include <linux/in6.h> -#include <linux/mutex.h> -#include <linux/random.h> -#include <linux/idr.h> -#include <linux/inetdevice.h> +#include <sys/param.h> +#include <sys/condvar.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/libkern.h> +#include <sys/socket.h> +#include <sys/module.h> +#include <sys/linux_compat.h> +#include <sys/lock.h> +#include <sys/mutex.h> +#include <sys/rwlock.h> +#include <sys/queue.h> +#include <sys/taskqueue.h> +#include <sys/priv.h> +#include <sys/syslog.h> -#include <net/tcp.h> +#include <netinet/in.h> +#include <netinet/in_pcb.h> -#include <rdma/rdma_cm.h> -#include <rdma/rdma_cm_ib.h> -#include <rdma/ib_cache.h> -#include <rdma/ib_cm.h> -#include <rdma/ib_sa.h> -#include <rdma/iw_cm.h> +#include <contrib/rdma/rdma_cm.h> +#include <contrib/rdma/ib_cache.h> +#include <contrib/rdma/ib_cm.h> +#include <contrib/rdma/ib_sa.h> +#include <contrib/rdma/iw_cm.h> MODULE_AUTHOR("Sean Hefty"); MODULE_DESCRIPTION("Generic RDMA CM Agent"); @@ -64,9 +73,9 @@ static struct ib_sa_client sa_client; static struct rdma_addr_client addr_client; -static LIST_HEAD(dev_list); -static LIST_HEAD(listen_any_list); -static DEFINE_MUTEX(lock); +static TAILQ_HEAD(, cma_device) dev_list; +static LIST_HEAD(, rdma_id_private) listen_any_list; +static struct mtx lock; static struct taskqueue *cma_wq; static DEFINE_IDR(sdp_ps); static DEFINE_IDR(tcp_ps); @@ -76,11 +85,12 @@ struct cma_device { struct ib_device *device; - struct completion comp; + struct mtx lock; + struct cv comp; atomic_t refcount; - TAILQ_HEAD(, rdma_id_private) id_list; - TAILQ_ENTRY(cma_device) entry; + LIST_HEAD(, rdma_id_private) id_list; + TAILQ_ENTRY(cma_device) list; }; enum cma_state { @@ -99,7 +109,7 @@ struct rdma_bind_list { struct idr *ps; - struct hlist_head owners; + TAILQ_HEAD(, rdma_id_private) owners; unsigned short port; }; @@ -113,16 +123,17 @@ struct rdma_cm_id id; struct rdma_bind_list *bind_list; - struct hlist_node node; - struct list_head list; - struct list_head listen_list; + TAILQ_ENTRY(rdma_id_private) node; + LIST_ENTRY(rdma_id_private) list; /* listen_any_list or cma_dev.list */ + LIST_HEAD(, rdma_id_private) listen_list; /* per-device listens */ + LIST_ENTRY(rdma_id_private) listen_entry; struct cma_device *cma_dev; #ifdef IB_SUPPORTED - struct list_head mc_list; + LIST_HEAD(, cma_multicast) mc_list; #endif enum cma_state state; struct mtx lock; - struct completion comp; + struct cv comp; atomic_t refcount; struct cv wait_remove; atomic_t dev_remove; @@ -142,6 +153,7 @@ u8 srq; }; +#ifdef IB_SUPPORTED struct cma_multicast { struct rdma_id_private *id_priv; union { @@ -153,9 +165,10 @@ u8 pad[sizeof(struct sockaddr_in6) - sizeof(struct sockaddr)]; }; +#endif struct cma_work { - struct work_struct work; + struct task task; struct rdma_id_private *id; enum cma_state old_state; enum cma_state new_state; @@ -267,22 +280,25 @@ atomic_inc(&cma_dev->refcount); id_priv->cma_dev = cma_dev; id_priv->id.device = cma_dev->device; - list_add_tail(&id_priv->list, &cma_dev->id_list); + LIST_INSERT_HEAD(&cma_dev->id_list, id_priv, list); } static inline void cma_deref_dev(struct cma_device *cma_dev) { + mtx_lock(&cma_dev->lock); if (atomic_dec_and_test(&cma_dev->refcount)) - complete(&cma_dev->comp); + cv_broadcast(&cma_dev->comp); + mtx_unlock(&cma_dev->lock); } static void cma_detach_from_dev(struct rdma_id_private *id_priv) { - list_del(&id_priv->list); + LIST_REMOVE(id_priv, list); cma_deref_dev(id_priv->cma_dev); id_priv->cma_dev = NULL; } +#ifdef IB_SUPPORTED static int cma_set_qkey(struct ib_device *device, u8 port_num, enum rdma_port_space ps, struct rdma_dev_addr *dev_addr, u32 *qkey) @@ -304,6 +320,7 @@ } return ret; } +#endif static int cma_acquire_dev(struct rdma_id_private *id_priv) { @@ -313,9 +330,11 @@ int ret = ENODEV; switch (rdma_node_get_transport(dev_addr->dev_type)) { +#ifdef IB_SUPPORTED case RDMA_TRANSPORT_IB: ib_addr_get_sgid(dev_addr, &gid); break; +#endif case RDMA_TRANSPORT_IWARP: iw_addr_get_sgid(dev_addr, &gid); break; @@ -323,15 +342,17 @@ return (ENODEV); } - list_for_each_entry(cma_dev, &dev_list, list) { + TAILQ_FOREACH(cma_dev, &dev_list, list) { ret = ib_find_cached_gid(cma_dev->device, &gid, &id_priv->id.port_num, NULL); if (!ret) { +#ifdef IB_SUPPORTED ret = cma_set_qkey(cma_dev->device, id_priv->id.port_num, id_priv->id.ps, dev_addr, &id_priv->qkey); if (!ret) +#endif cma_attach_to_dev(id_priv, cma_dev); break; } @@ -341,8 +362,10 @@ static void cma_deref_id(struct rdma_id_private *id_priv) { + mtx_lock(&id_priv->lock); if (atomic_dec_and_test(&id_priv->refcount)) - complete(&id_priv->comp); + cv_broadcast(&id_priv->comp); + mtx_unlock(&id_priv->lock); } static int cma_disable_remove(struct rdma_id_private *id_priv, @@ -362,8 +385,10 @@ static void cma_enable_remove(struct rdma_id_private *id_priv) { + mtx_lock(&id_priv->lock); if (atomic_dec_and_test(&id_priv->dev_remove)) - wake_up(&id_priv->wait_remove, &id_priv->lock); + cv_broadcast(&id_priv->wait_remove); + mtx_unlock(&id_priv->lock); } static int cma_has_cm_dev(struct rdma_id_private *id_priv) @@ -376,22 +401,22 @@ { struct rdma_id_private *id_priv; - id_priv = kzalloc(sizeof *id_priv, M_WAITOK); + id_priv = malloc(sizeof *id_priv, M_DEVBUF, M_WAITOK); if (!id_priv) return ERR_PTR(ENOMEM); + bzero(id_priv, sizeof *id_priv); id_priv->state = CMA_IDLE; id_priv->id.context = context; id_priv->id.event_handler = event_handler; id_priv->id.ps = ps; - mtx_init(&id_priv->lock, "rdma_id_priv", NULL, MTX_DUPOK|MTX_DEF); - init_completion(&id_priv->comp); + mtx_init(&id_priv->lock, "rdma_cm_id_priv", NULL, MTX_DUPOK|MTX_DEF); + cv_init(&id_priv->comp, "rdma_cm_id_priv"); atomic_set(&id_priv->refcount, 1); cv_init(&id_priv->wait_remove, "id priv wait remove"); atomic_set(&id_priv->dev_remove, 0); - TAILQ_INIT(&id_priv->listen_list); - TAILQ_INIT(&id_priv->mc_list); - get_random_bytes(&id_priv->seq_num, sizeof id_priv->seq_num); + LIST_INIT(&id_priv->listen_list); + arc4rand(&id_priv->seq_num, sizeof id_priv->seq_num, 0); return &id_priv->id; } @@ -450,7 +475,6 @@ qp = ib_create_qp(pd, qp_init_attr); if (IS_ERR(qp)) return PTR_ERR(qp); - if (cma_is_ud_ps(id_priv->id.ps)) ret = cma_init_ud_qp(id_priv, qp); else @@ -500,6 +524,7 @@ return ib_modify_qp(id->qp, &qp_attr, qp_attr_mask); } +#ifdef IB_SUPPORTED static int cma_modify_qp_rts(struct rdma_cm_id *id) { struct ib_qp_attr qp_attr; @@ -515,6 +540,7 @@ return ib_modify_qp(id->qp, &qp_attr, qp_attr_mask); } +#endif static int cma_modify_qp_err(struct rdma_cm_id *id) { @@ -591,7 +617,7 @@ struct in6_addr *ip6; if (addr->sa_family == AF_INET) - return ZERONET(((struct sockaddr_in *) addr)->sin_addr.s_addr); + return in_nullhost(((struct sockaddr_in *) addr)->sin_addr); else { ip6 = &((struct sockaddr_in6 *) addr)->sin6_addr; return (ip6->s6_addr32[0] | ip6->s6_addr32[1] | @@ -601,7 +627,7 @@ static inline int cma_loopback_addr(struct sockaddr *addr) { - return LOOPBACK(((struct sockaddr_in *) addr)->sin_addr.s_addr); + return ((struct sockaddr_in *)addr)->sin_addr.s_addr == INADDR_LOOPBACK; } static inline int cma_any_addr(struct sockaddr *addr) @@ -622,6 +648,7 @@ return !cma_port(addr); } +#ifdef IB_SUPPORT static int cma_get_net_info(void *hdr, enum rdma_port_space ps, u8 *ip_ver, __u16 *port, union cma_ip_addr **src, union cma_ip_addr **dst) @@ -690,6 +717,7 @@ break; } } +#endif static inline int cma_user_data_offset(enum rdma_port_space ps) { @@ -738,12 +766,13 @@ } cma_detach_from_dev(id_priv); } - list_del(&id_priv->listen_list); + LIST_REMOVE(id_priv, listen_entry); cma_deref_id(id_priv); - wait_for_completion(&id_priv->comp); + mtx_lock(&id_priv->lock); + cv_wait(&id_priv->comp, &id_priv->lock); - kfree(id_priv); + free(id_priv, M_DEVBUF); } static void cma_cancel_listens(struct rdma_id_private *id_priv) @@ -751,11 +780,10 @@ struct rdma_id_private *dev_id_priv; mtx_lock(&lock); - list_del(&id_priv->list); + LIST_REMOVE(id_priv, list); - while (!list_empty(&id_priv->listen_list)) { - dev_id_priv = list_entry(id_priv->listen_list.next, - struct rdma_id_private, listen_list); + while (!LIST_EMPTY(&id_priv->listen_list)) { + dev_id_priv = LIST_FIRST(&id_priv->listen_list); cma_destroy_listen(dev_id_priv); } mtx_unlock(&lock); @@ -789,26 +817,27 @@ return; mtx_lock(&lock); - hlist_del(&id_priv->node); - if (hlist_empty(&bind_list->owners)) { + TAILQ_REMOVE(&bind_list->owners, id_priv, node); + if (TAILQ_EMPTY(&bind_list->owners)) { idr_remove(bind_list->ps, bind_list->port); - kfree(bind_list); + free(bind_list, M_DEVBUF); } mtx_unlock(&lock); } +#ifdef IB_SUPPORTED static void cma_leave_mc_groups(struct rdma_id_private *id_priv) { struct cma_multicast *mc; - while (!list_empty(&id_priv->mc_list)) { - mc = container_of(id_priv->mc_list.next, - struct cma_multicast, list); - list_del(&mc->list); + while (!LIST_EMPTY(&id_priv->mc_list)) { + mc = LIST_FIRST(&id_priv->mc_list); + LIST_REMOVE(mc, list); ib_sa_free_multicast(mc->multicast.ib); - kfree(mc); + free(mc, M_DEVBUF); } } +#endif void rdma_destroy_id(struct rdma_cm_id *id) { @@ -822,19 +851,23 @@ mtx_lock(&lock); if (id_priv->cma_dev) { mtx_unlock(&lock); +#ifdef IB_SUPPORTED switch (rdma_node_get_transport(id->device->node_type)) { case RDMA_TRANSPORT_IB: if (id_priv->cm_id.ib && !IS_ERR(id_priv->cm_id.ib)) ib_destroy_cm_id(id_priv->cm_id.ib); break; case RDMA_TRANSPORT_IWARP: +#endif if (id_priv->cm_id.iw && !IS_ERR(id_priv->cm_id.iw)) iw_destroy_cm_id(id_priv->cm_id.iw); +#ifdef IB_SUPPORTED break; default: break; } cma_leave_mc_groups(id_priv); +#endif mtx_lock(&lock); cma_detach_from_dev(id_priv); } @@ -842,13 +875,15 @@ cma_release_port(id_priv); cma_deref_id(id_priv); - wait_for_completion(&id_priv->comp); + mtx_lock(&id_priv->lock); + cv_wait(&id_priv->comp, &id_priv->lock); - kfree(id_priv->id.route.path_rec); - kfree(id_priv); + free(id_priv->id.route.path_rec, M_DEVBUF); + free(id_priv, M_DEVBUF); } EXPORT_SYMBOL(rdma_destroy_id); +#ifdef IB_SUPPORT static int cma_rep_recv(struct rdma_id_private *id_priv) { int ret; @@ -993,8 +1028,8 @@ rt = &id->route; rt->num_paths = ib_event->param.req_rcvd.alternate_path ? 2 : 1; - rt->path_rec = kmalloc(sizeof *rt->path_rec * rt->num_paths, - M_WAITOK); + rt->path_rec = malloc(sizeof *rt->path_rec * rt->num_paths, + M_DEVBUF, M_WAITOK); if (!rt->path_rec) goto destroy_id; @@ -1178,6 +1213,7 @@ break; } } +#endif /* IB_SUPPORTED */ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event) { @@ -1246,9 +1282,10 @@ struct rdma_cm_id *new_cm_id; struct rdma_id_private *listen_id, *conn_id; struct sockaddr_in *sin; - struct net_device *dev = NULL; + struct ifnet *dev; struct rdma_cm_event event; int ret; + struct ifaddr *ifa; listen_id = cm_id->context; if (cma_disable_remove(listen_id, CMA_LISTEN)) @@ -1266,13 +1303,14 @@ atomic_inc(&conn_id->dev_remove); conn_id->state = CMA_CONNECT; - dev = ip_dev_find(iw_event->local_addr.sin_addr.s_addr); - if (!dev) { + ifa = ifa_ifwithaddr((struct sockaddr *)&iw_event->local_addr); + if (!ifa) { ret = EADDRNOTAVAIL; cma_enable_remove(conn_id); rdma_destroy_id(new_cm_id); goto out; } + dev = ifa->ifa_ifp; ret = rdma_copy_addr(&conn_id->id.route.addr.dev_addr, dev, NULL); if (ret) { cma_enable_remove(conn_id); @@ -1312,12 +1350,11 @@ } out: - if (dev) - dev_put(dev); cma_enable_remove(listen_id); return ret; } +#ifdef IB_SUPPORTED static int cma_ib_listen(struct rdma_id_private *id_priv) { struct ib_cm_compare_data compare_data; @@ -1346,6 +1383,7 @@ return ret; } +#endif static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog) { @@ -1399,7 +1437,7 @@ ip_addr_size(&id_priv->id.route.addr.src_addr)); cma_attach_to_dev(dev_id_priv, cma_dev); - list_add_tail(&dev_id_priv->listen_list, &id_priv->listen_list); + LIST_INSERT_HEAD(&id_priv->listen_list, dev_id_priv, listen_entry); ret = rdma_listen(id, id_priv->backlog); if (ret) @@ -1415,8 +1453,8 @@ struct cma_device *cma_dev; mtx_lock(&lock); - list_add_tail(&id_priv->list, &listen_any_list); - list_for_each_entry(cma_dev, &dev_list, list) + LIST_INSERT_HEAD(&listen_any_list, id_priv, list); + TAILQ_FOREACH(cma_dev, &dev_list, list) cma_listen_on_dev(id_priv, cma_dev); mtx_unlock(&lock); } @@ -1447,6 +1485,7 @@ id_priv->backlog = backlog; if (id->device) { +#ifdef IB_SUPPORTED switch (rdma_node_get_transport(id->device->node_type)) { case RDMA_TRANSPORT_IB: ret = cma_ib_listen(id_priv); @@ -1454,14 +1493,17 @@ goto err; break; case RDMA_TRANSPORT_IWARP: +#endif ret = cma_iw_listen(id_priv, backlog); if (ret) goto err; +#ifdef IB_SUPPORTED break; default: ret = ENOSYS; goto err; } +#endif } else cma_listen_on_all(id_priv); @@ -1473,6 +1515,7 @@ } EXPORT_SYMBOL(rdma_listen); +#ifdef IB_SUPPORTED static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec, void *context) { @@ -1491,7 +1534,7 @@ work->event.status = status; } - queue_work(cma_wq, &work->work); + taskqueue_enqueue(cma_wq, &work->task); } static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms, @@ -1517,10 +1560,11 @@ return (id_priv->query_id < 0) ? id_priv->query_id : 0; } +#endif -static void cma_work_handler(struct work_struct *_work) +static void cma_work_handler(void *context, int pending) { - struct cma_work *work = container_of(_work, struct cma_work, work); + struct cma_work *work = context; struct rdma_id_private *id_priv = work->id; int destroy = 0; @@ -1537,26 +1581,28 @@ cma_deref_id(id_priv); if (destroy) rdma_destroy_id(&id_priv->id); - kfree(work); + free(work, M_DEVBUF); } +#ifdef IB_SUPPORTED static int cma_resolve_ib_route(struct rdma_id_private *id_priv, int timeout_ms) { struct rdma_route *route = &id_priv->id.route; struct cma_work *work; int ret; - work = kzalloc(sizeof *work, M_WAITOK); + work = malloc(sizeof *work, M_DEVBUF, M_WAITOK); if (!work) return (ENOMEM); + bzero(work, sizeof *work); work->id = id_priv; - INIT_WORK(&work->work, cma_work_handler); + TASK_INIT(&work->task, 0, cma_work_handler, work); work->old_state = CMA_ROUTE_QUERY; work->new_state = CMA_ROUTE_RESOLVED; work->event.event = RDMA_CM_EVENT_ROUTE_RESOLVED; - route->path_rec = kmalloc(sizeof *route->path_rec, M_WAITOK); + route->path_rec = malloc(sizeof *route->path_rec, M_DEVBUF, M_WAITOK); if (!route->path_rec) { ret = ENOMEM; goto err1; @@ -1568,10 +1614,10 @@ return 0; err2: - kfree(route->path_rec); + free(route->path_rec, M_DEVBUF); route->path_rec = NULL; err1: - kfree(work); + free(work, M_DEVBUF); return ret; } @@ -1585,7 +1631,7 @@ if (!cma_comp_exch(id_priv, CMA_ADDR_RESOLVED, CMA_ROUTE_RESOLVED)) return (EINVAL); - id->route.path_rec = kmalloc(sizeof *path_rec * num_paths, M_WAITOK); + id->route.path_rec = malloc(sizeof *path_rec * num_paths, M_DEVBUF, M_WAITOK); if (!id->route.path_rec) { ret = ENOMEM; goto err; @@ -1598,21 +1644,23 @@ return ret; } EXPORT_SYMBOL(rdma_set_ib_paths); +#endif static int cma_resolve_iw_route(struct rdma_id_private *id_priv, int timeout_ms) { struct cma_work *work; - work = kzalloc(sizeof *work, M_WAITOK); + work = malloc(sizeof *work, M_DEVBUF, M_WAITOK); if (!work) return (ENOMEM); + bzero(work, sizeof *work); work->id = id_priv; - INIT_WORK(&work->work, cma_work_handler); + TASK_INIT(&work->task, 0, cma_work_handler, work); work->old_state = CMA_ROUTE_QUERY; work->new_state = CMA_ROUTE_RESOLVED; work->event.event = RDMA_CM_EVENT_ROUTE_RESOLVED; - queue_work(cma_wq, &work->work); + taskqueue_enqueue(cma_wq, &work->task); return 0; } @@ -1626,17 +1674,21 @@ return (EINVAL); atomic_inc(&id_priv->refcount); +#ifdef IB_SUPPORTED switch (rdma_node_get_transport(id->device->node_type)) { case RDMA_TRANSPORT_IB: ret = cma_resolve_ib_route(id_priv, timeout_ms); break; case RDMA_TRANSPORT_IWARP: +#endif ret = cma_resolve_iw_route(id_priv, timeout_ms); +#ifdef IB_SUPPORTED break; default: ret = ENOSYS; break; } +#endif if (ret) goto err; @@ -1658,18 +1710,18 @@ u8 p; mtx_lock(&lock); - if (list_empty(&dev_list)) { + if (TAILQ_EMPTY(&dev_list)) { ret = ENODEV; goto out; } - list_for_each_entry(cma_dev, &dev_list, list) + TAILQ_FOREACH(cma_dev, &dev_list, list) for (p = 1; p <= cma_dev->device->phys_port_cnt; ++p) if (!ib_query_port(cma_dev->device, p, &port_attr) && port_attr.state == IB_PORT_ACTIVE) goto port_found; p = 1; - cma_dev = list_entry(dev_list.next, struct cma_device, list); + cma_dev = TAILQ_FIRST(&dev_list); port_found: ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid); @@ -1742,9 +1794,10 @@ union ib_gid gid; int ret; - work = kzalloc(sizeof *work, M_WAITOK); + work = malloc(sizeof *work, M_DEVBUF, M_WAITOK); if (!work) return (ENOMEM); + bzero(work, sizeof *work); if (!id_priv->cma_dev) { ret = cma_bind_loopback(id_priv); @@ -1763,14 +1816,14 @@ } work->id = id_priv; - INIT_WORK(&work->work, cma_work_handler); + TASK_INIT(&work->task, 0, cma_work_handler, work); work->old_state = CMA_ADDR_QUERY; work->new_state = CMA_ADDR_RESOLVED; work->event.event = RDMA_CM_EVENT_ADDR_RESOLVED; - queue_work(cma_wq, &work->work); + taskqueue_enqueue(cma_wq, &work->task); return 0; err: - kfree(work); + free(work, M_DEVBUF); return ret; } @@ -1826,7 +1879,7 @@ sin = (struct sockaddr_in *) &id_priv->id.route.addr.src_addr; sin->sin_port = htons(bind_list->port); id_priv->bind_list = bind_list; - hlist_add_head(&id_priv->node, &bind_list->owners); + TAILQ_INSERT_HEAD(&bind_list->owners, id_priv, node); } static int cma_alloc_port(struct idr *ps, struct rdma_id_private *id_priv, @@ -1835,9 +1888,10 @@ struct rdma_bind_list *bind_list; int port, ret; - bind_list = kzalloc(sizeof *bind_list, M_WAITOK); + bind_list = malloc(sizeof *bind_list, M_DEVBUF, M_WAITOK); if (!bind_list) return (ENOMEM); + bzero(bind_list, sizeof *bind_list); do { ret = idr_get_new_above(ps, bind_list, snum, &port); @@ -1858,7 +1912,7 @@ err2: idr_remove(ps, port); err1: - kfree(bind_list); + free(bind_list, M_DEVBUF); return ret; } @@ -1867,9 +1921,10 @@ struct rdma_bind_list *bind_list; int port, ret; - bind_list = kzalloc(sizeof *bind_list, M_WAITOK); + bind_list = malloc(sizeof *bind_list, M_DEVBUF, M_WAITOK); if (!bind_list) return (ENOMEM); + bzero(bind_list, sizeof *bind_list); retry: do { @@ -1879,18 +1934,18 @@ if (ret) goto err1; - if (port > sysctl_local_port_range[1]) { - if (next_port != sysctl_local_port_range[0]) { + if (port > ipport_lastauto) { + if (next_port != ipport_firstauto) { idr_remove(ps, port); - next_port = sysctl_local_port_range[0]; + next_port = ipport_firstauto; goto retry; } ret = EADDRNOTAVAIL; goto err2; } - if (port == sysctl_local_port_range[1]) - next_port = sysctl_local_port_range[0]; + if (port == ipport_lastauto) + next_port = ipport_firstauto; else next_port = port + 1; @@ -1901,7 +1956,7 @@ err2: idr_remove(ps, port); err1: - kfree(bind_list); + free(bind_list, M_DEVBUF); return ret; } @@ -1910,12 +1965,12 @@ struct rdma_id_private *cur_id; struct sockaddr_in *sin, *cur_sin; struct rdma_bind_list *bind_list; - struct hlist_node *node; unsigned short snum; sin = (struct sockaddr_in *) &id_priv->id.route.addr.src_addr; snum = ntohs(sin->sin_port); - if (snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE)) + if (snum <= ipport_reservedhigh && snum >= ipport_reservedlow && + priv_check(curthread, PRIV_NETINET_RESERVEDPORT)) return (EACCES); bind_list = idr_find(ps, snum); @@ -1929,7 +1984,7 @@ if (cma_any_addr(&id_priv->id.route.addr.src_addr)) return (EADDRNOTAVAIL); - hlist_for_each_entry(cur_id, node, &bind_list->owners, node) { + TAILQ_FOREACH(cur_id, &bind_list->owners, node) { if (cma_any_addr(&cur_id->id.route.addr.src_addr)) return (EADDRNOTAVAIL); @@ -2016,6 +2071,7 @@ } EXPORT_SYMBOL(rdma_bind_addr); +#ifdef IB_SUPPORTED static int cma_format_hdr(void *hdr, enum rdma_port_space ps, struct rdma_route *route) { @@ -2115,12 +2171,13 @@ req.private_data_len = sizeof(struct cma_hdr) + conn_param->private_data_len; - req.private_data = kzalloc(req.private_data_len, M_NOWAIT); + req.private_data = malloc(req.private_data_len, M_DEVBUF, M_NOWAIT); if (!req.private_data) return (ENOMEM); + bzero((void *)req.private_data, req.private_data_len); if (conn_param->private_data && conn_param->private_data_len) - memcpy((void *) req.private_data + sizeof(struct cma_hdr), + memcpy((caddr_t) req.private_data + sizeof(struct cma_hdr), conn_param->private_data, conn_param->private_data_len); route = &id_priv->id.route; @@ -2147,7 +2204,7 @@ id_priv->cm_id.ib = NULL; } out: - kfree(req.private_data); + free(req.private_data, M_DEVBUF); return ret; } @@ -2162,9 +2219,10 @@ memset(&req, 0, sizeof req); offset = cma_user_data_offset(id_priv->id.ps); req.private_data_len = offset + conn_param->private_data_len; - private_data = kzalloc(req.private_data_len, M_NOWAIT); + private_data = malloc(req.private_data_len, M_DEVBUF, M_NOWAIT); if (!private_data) return (ENOMEM); + bzero(private_data, req.private_data_len); if (conn_param->private_data && conn_param->private_data_len) memcpy(private_data + offset, conn_param->private_data, @@ -2209,9 +2267,10 @@ id_priv->cm_id.ib = NULL; } - kfree(private_data); + free(private_data, M_DEVBUF); return ret; } +#endif static int cma_connect_iw(struct rdma_id_private *id_priv, struct rdma_conn_param *conn_param) @@ -2270,6 +2329,7 @@ id_priv->srq = conn_param->srq; } +#ifdef IB_SUPPORT switch (rdma_node_get_transport(id->device->node_type)) { case RDMA_TRANSPORT_IB: if (cma_is_ud_ps(id->ps)) @@ -2278,12 +2338,15 @@ ret = cma_connect_ib(id_priv, conn_param); break; case RDMA_TRANSPORT_IWARP: +#endif ret = cma_connect_iw(id_priv, conn_param); +#ifdef IB_SUPPORT break; default: ret = ENOSYS; break; } +#endif if (ret) goto err; @@ -2294,6 +2357,7 @@ } EXPORT_SYMBOL(rdma_connect); +#ifdef IB_SUPPORTED static int cma_accept_ib(struct rdma_id_private *id_priv, struct rdma_conn_param *conn_param) { @@ -2335,6 +2399,7 @@ out: return ret; } +#endif static int cma_accept_iw(struct rdma_id_private *id_priv, struct rdma_conn_param *conn_param) @@ -2358,6 +2423,7 @@ return iw_cm_accept(id_priv->cm_id.iw, &iw_param); } +#ifdef IB_SUPPORTED static int cma_send_sidr_rep(struct rdma_id_private *id_priv, enum ib_cm_sidr_status status, const void *private_data, int private_data_len) @@ -2375,6 +2441,7 @@ return ib_send_cm_sidr_rep(id_priv->cm_id.ib, &rep); } +#endif int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param) { @@ -2390,6 +2457,7 @@ id_priv->srq = conn_param->srq; } +#ifdef IB_SUPPORTED switch (rdma_node_get_transport(id->device->node_type)) { case RDMA_TRANSPORT_IB: if (cma_is_ud_ps(id->ps)) @@ -2402,12 +2470,15 @@ ret = cma_rep_recv(id_priv); break; case RDMA_TRANSPORT_IWARP: +#endif ret = cma_accept_iw(id_priv, conn_param); +#ifdef IB_SUPPORTED break; default: ret = ENOSYS; break; } +#endif >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200711061503.lA6F3lbt084693>