Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright (c) 2004 Topspin Communications.  All rights reserved.
0003  *
0004  * This software is available to you under a choice of one of two
0005  * licenses.  You may choose to be licensed under the terms of the GNU
0006  * General Public License (GPL) Version 2, available from the file
0007  * COPYING in the main directory of this source tree, or the
0008  * OpenIB.org BSD license below:
0009  *
0010  *     Redistribution and use in source and binary forms, with or
0011  *     without modification, are permitted provided that the following
0012  *     conditions are met:
0013  *
0014  *      - Redistributions of source code must retain the above
0015  *        copyright notice, this list of conditions and the following
0016  *        disclaimer.
0017  *
0018  *      - Redistributions in binary form must reproduce the above
0019  *        copyright notice, this list of conditions and the following
0020  *        disclaimer in the documentation and/or other materials
0021  *        provided with the distribution.
0022  *
0023  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
0024  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
0025  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
0026  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
0027  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
0028  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
0029  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
0030  * SOFTWARE.
0031  */
0032 
0033 #ifndef _CORE_PRIV_H
0034 #define _CORE_PRIV_H
0035 
0036 #include <linux/list.h>
0037 #include <linux/spinlock.h>
0038 #include <linux/cgroup_rdma.h>
0039 #include <net/net_namespace.h>
0040 #include <net/netns/generic.h>
0041 
0042 #include <rdma/ib_verbs.h>
0043 #include <rdma/opa_addr.h>
0044 #include <rdma/ib_mad.h>
0045 #include <rdma/restrack.h>
0046 #include "mad_priv.h"
0047 #include "restrack.h"
0048 
0049 /* Total number of ports combined across all struct ib_devices's */
0050 #define RDMA_MAX_PORTS 8192
0051 
0052 struct pkey_index_qp_list {
0053     struct list_head    pkey_index_list;
0054     u16                 pkey_index;
0055     /* Lock to hold while iterating the qp_list. */
0056     spinlock_t          qp_list_lock;
0057     struct list_head    qp_list;
0058 };
0059 
0060 /**
0061  * struct rdma_dev_net - rdma net namespace metadata for a net
0062  * @nl_sock:    Pointer to netlink socket
0063  * @net:    Pointer to owner net namespace
0064  * @id:     xarray id to identify the net namespace.
0065  */
0066 struct rdma_dev_net {
0067     struct sock *nl_sock;
0068     possible_net_t net;
0069     u32 id;
0070 };
0071 
0072 extern const struct attribute_group ib_dev_attr_group;
0073 extern bool ib_devices_shared_netns;
0074 extern unsigned int rdma_dev_net_id;
0075 
0076 static inline struct rdma_dev_net *rdma_net_to_dev_net(struct net *net)
0077 {
0078     return net_generic(net, rdma_dev_net_id);
0079 }
0080 
0081 int ib_device_rename(struct ib_device *ibdev, const char *name);
0082 int ib_device_set_dim(struct ib_device *ibdev, u8 use_dim);
0083 
0084 typedef void (*roce_netdev_callback)(struct ib_device *device, u32 port,
0085           struct net_device *idev, void *cookie);
0086 
0087 typedef bool (*roce_netdev_filter)(struct ib_device *device, u32 port,
0088                    struct net_device *idev, void *cookie);
0089 
0090 struct net_device *ib_device_get_netdev(struct ib_device *ib_dev,
0091                     u32 port);
0092 
0093 void ib_enum_roce_netdev(struct ib_device *ib_dev,
0094              roce_netdev_filter filter,
0095              void *filter_cookie,
0096              roce_netdev_callback cb,
0097              void *cookie);
0098 void ib_enum_all_roce_netdevs(roce_netdev_filter filter,
0099                   void *filter_cookie,
0100                   roce_netdev_callback cb,
0101                   void *cookie);
0102 
0103 typedef int (*nldev_callback)(struct ib_device *device,
0104                   struct sk_buff *skb,
0105                   struct netlink_callback *cb,
0106                   unsigned int idx);
0107 
0108 int ib_enum_all_devs(nldev_callback nldev_cb, struct sk_buff *skb,
0109              struct netlink_callback *cb);
0110 
0111 struct ib_client_nl_info {
0112     struct sk_buff *nl_msg;
0113     struct device *cdev;
0114     u32 port;
0115     u64 abi;
0116 };
0117 int ib_get_client_nl_info(struct ib_device *ibdev, const char *client_name,
0118               struct ib_client_nl_info *res);
0119 
0120 enum ib_cache_gid_default_mode {
0121     IB_CACHE_GID_DEFAULT_MODE_SET,
0122     IB_CACHE_GID_DEFAULT_MODE_DELETE
0123 };
0124 
0125 int ib_cache_gid_parse_type_str(const char *buf);
0126 
0127 const char *ib_cache_gid_type_str(enum ib_gid_type gid_type);
0128 
0129 void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u32 port,
0130                   struct net_device *ndev,
0131                   unsigned long gid_type_mask,
0132                   enum ib_cache_gid_default_mode mode);
0133 
0134 int ib_cache_gid_add(struct ib_device *ib_dev, u32 port,
0135              union ib_gid *gid, struct ib_gid_attr *attr);
0136 
0137 int ib_cache_gid_del(struct ib_device *ib_dev, u32 port,
0138              union ib_gid *gid, struct ib_gid_attr *attr);
0139 
0140 int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u32 port,
0141                      struct net_device *ndev);
0142 
0143 int roce_gid_mgmt_init(void);
0144 void roce_gid_mgmt_cleanup(void);
0145 
0146 unsigned long roce_gid_type_mask_support(struct ib_device *ib_dev, u32 port);
0147 
0148 int ib_cache_setup_one(struct ib_device *device);
0149 void ib_cache_cleanup_one(struct ib_device *device);
0150 void ib_cache_release_one(struct ib_device *device);
0151 void ib_dispatch_event_clients(struct ib_event *event);
0152 
0153 #ifdef CONFIG_CGROUP_RDMA
0154 void ib_device_register_rdmacg(struct ib_device *device);
0155 void ib_device_unregister_rdmacg(struct ib_device *device);
0156 
0157 int ib_rdmacg_try_charge(struct ib_rdmacg_object *cg_obj,
0158              struct ib_device *device,
0159              enum rdmacg_resource_type resource_index);
0160 
0161 void ib_rdmacg_uncharge(struct ib_rdmacg_object *cg_obj,
0162             struct ib_device *device,
0163             enum rdmacg_resource_type resource_index);
0164 #else
0165 static inline void ib_device_register_rdmacg(struct ib_device *device)
0166 {
0167 }
0168 
0169 static inline void ib_device_unregister_rdmacg(struct ib_device *device)
0170 {
0171 }
0172 
0173 static inline int ib_rdmacg_try_charge(struct ib_rdmacg_object *cg_obj,
0174                        struct ib_device *device,
0175                        enum rdmacg_resource_type resource_index)
0176 {
0177     return 0;
0178 }
0179 
0180 static inline void ib_rdmacg_uncharge(struct ib_rdmacg_object *cg_obj,
0181                       struct ib_device *device,
0182                       enum rdmacg_resource_type resource_index)
0183 {
0184 }
0185 #endif
0186 
0187 static inline bool rdma_is_upper_dev_rcu(struct net_device *dev,
0188                      struct net_device *upper)
0189 {
0190     return netdev_has_upper_dev_all_rcu(dev, upper);
0191 }
0192 
0193 int addr_init(void);
0194 void addr_cleanup(void);
0195 
0196 int ib_mad_init(void);
0197 void ib_mad_cleanup(void);
0198 
0199 int ib_sa_init(void);
0200 void ib_sa_cleanup(void);
0201 
0202 void rdma_nl_init(void);
0203 void rdma_nl_exit(void);
0204 
0205 int ib_nl_handle_resolve_resp(struct sk_buff *skb,
0206                   struct nlmsghdr *nlh,
0207                   struct netlink_ext_ack *extack);
0208 int ib_nl_handle_set_timeout(struct sk_buff *skb,
0209                  struct nlmsghdr *nlh,
0210                  struct netlink_ext_ack *extack);
0211 int ib_nl_handle_ip_res_resp(struct sk_buff *skb,
0212                  struct nlmsghdr *nlh,
0213                  struct netlink_ext_ack *extack);
0214 
0215 void ib_get_cached_subnet_prefix(struct ib_device *device,
0216                 u32 port_num,
0217                 u64 *sn_pfx);
0218 
0219 #ifdef CONFIG_SECURITY_INFINIBAND
0220 void ib_security_release_port_pkey_list(struct ib_device *device);
0221 
0222 void ib_security_cache_change(struct ib_device *device,
0223                   u32 port_num,
0224                   u64 subnet_prefix);
0225 
0226 int ib_security_modify_qp(struct ib_qp *qp,
0227               struct ib_qp_attr *qp_attr,
0228               int qp_attr_mask,
0229               struct ib_udata *udata);
0230 
0231 int ib_create_qp_security(struct ib_qp *qp, struct ib_device *dev);
0232 void ib_destroy_qp_security_begin(struct ib_qp_security *sec);
0233 void ib_destroy_qp_security_abort(struct ib_qp_security *sec);
0234 void ib_destroy_qp_security_end(struct ib_qp_security *sec);
0235 int ib_open_shared_qp_security(struct ib_qp *qp, struct ib_device *dev);
0236 void ib_close_shared_qp_security(struct ib_qp_security *sec);
0237 int ib_mad_agent_security_setup(struct ib_mad_agent *agent,
0238                 enum ib_qp_type qp_type);
0239 void ib_mad_agent_security_cleanup(struct ib_mad_agent *agent);
0240 int ib_mad_enforce_security(struct ib_mad_agent_private *map, u16 pkey_index);
0241 void ib_mad_agent_security_change(void);
0242 #else
0243 static inline void ib_security_release_port_pkey_list(struct ib_device *device)
0244 {
0245 }
0246 
0247 static inline void ib_security_cache_change(struct ib_device *device,
0248                         u32 port_num,
0249                         u64 subnet_prefix)
0250 {
0251 }
0252 
0253 static inline int ib_security_modify_qp(struct ib_qp *qp,
0254                     struct ib_qp_attr *qp_attr,
0255                     int qp_attr_mask,
0256                     struct ib_udata *udata)
0257 {
0258     return qp->device->ops.modify_qp(qp->real_qp,
0259                      qp_attr,
0260                      qp_attr_mask,
0261                      udata);
0262 }
0263 
0264 static inline int ib_create_qp_security(struct ib_qp *qp,
0265                     struct ib_device *dev)
0266 {
0267     return 0;
0268 }
0269 
0270 static inline void ib_destroy_qp_security_begin(struct ib_qp_security *sec)
0271 {
0272 }
0273 
0274 static inline void ib_destroy_qp_security_abort(struct ib_qp_security *sec)
0275 {
0276 }
0277 
0278 static inline void ib_destroy_qp_security_end(struct ib_qp_security *sec)
0279 {
0280 }
0281 
0282 static inline int ib_open_shared_qp_security(struct ib_qp *qp,
0283                          struct ib_device *dev)
0284 {
0285     return 0;
0286 }
0287 
0288 static inline void ib_close_shared_qp_security(struct ib_qp_security *sec)
0289 {
0290 }
0291 
0292 static inline int ib_mad_agent_security_setup(struct ib_mad_agent *agent,
0293                           enum ib_qp_type qp_type)
0294 {
0295     return 0;
0296 }
0297 
0298 static inline void ib_mad_agent_security_cleanup(struct ib_mad_agent *agent)
0299 {
0300 }
0301 
0302 static inline int ib_mad_enforce_security(struct ib_mad_agent_private *map,
0303                       u16 pkey_index)
0304 {
0305     return 0;
0306 }
0307 
0308 static inline void ib_mad_agent_security_change(void)
0309 {
0310 }
0311 #endif
0312 
0313 struct ib_device *ib_device_get_by_index(const struct net *net, u32 index);
0314 
0315 /* RDMA device netlink */
0316 void nldev_init(void);
0317 void nldev_exit(void);
0318 
0319 struct ib_qp *ib_create_qp_user(struct ib_device *dev, struct ib_pd *pd,
0320                 struct ib_qp_init_attr *attr,
0321                 struct ib_udata *udata,
0322                 struct ib_uqp_object *uobj, const char *caller);
0323 
0324 void ib_qp_usecnt_inc(struct ib_qp *qp);
0325 void ib_qp_usecnt_dec(struct ib_qp *qp);
0326 
0327 struct rdma_dev_addr;
0328 int rdma_resolve_ip_route(struct sockaddr *src_addr,
0329               const struct sockaddr *dst_addr,
0330               struct rdma_dev_addr *addr);
0331 
0332 int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid,
0333                  const union ib_gid *dgid,
0334                  u8 *dmac, const struct ib_gid_attr *sgid_attr,
0335                  int *hoplimit);
0336 void rdma_copy_src_l2_addr(struct rdma_dev_addr *dev_addr,
0337                const struct net_device *dev);
0338 
0339 struct sa_path_rec;
0340 int roce_resolve_route_from_path(struct sa_path_rec *rec,
0341                  const struct ib_gid_attr *attr);
0342 
0343 struct net_device *rdma_read_gid_attr_ndev_rcu(const struct ib_gid_attr *attr);
0344 
0345 void ib_free_port_attrs(struct ib_core_device *coredev);
0346 int ib_setup_port_attrs(struct ib_core_device *coredev);
0347 struct rdma_hw_stats *ib_get_hw_stats_port(struct ib_device *ibdev, u32 port_num);
0348 void ib_device_release_hw_stats(struct hw_stats_device_data *data);
0349 int ib_setup_device_attrs(struct ib_device *ibdev);
0350 
0351 int rdma_compatdev_set(u8 enable);
0352 
0353 int ib_port_register_client_groups(struct ib_device *ibdev, u32 port_num,
0354                    const struct attribute_group **groups);
0355 void ib_port_unregister_client_groups(struct ib_device *ibdev, u32 port_num,
0356                      const struct attribute_group **groups);
0357 
0358 int ib_device_set_netns_put(struct sk_buff *skb,
0359                 struct ib_device *dev, u32 ns_fd);
0360 
0361 int rdma_nl_net_init(struct rdma_dev_net *rnet);
0362 void rdma_nl_net_exit(struct rdma_dev_net *rnet);
0363 
0364 struct rdma_umap_priv {
0365     struct vm_area_struct *vma;
0366     struct list_head list;
0367     struct rdma_user_mmap_entry *entry;
0368 };
0369 
0370 void rdma_umap_priv_init(struct rdma_umap_priv *priv,
0371              struct vm_area_struct *vma,
0372              struct rdma_user_mmap_entry *entry);
0373 
0374 void ib_cq_pool_cleanup(struct ib_device *dev);
0375 
0376 #endif /* _CORE_PRIV_H */