brintos

brintos / linux-shallow public Read only

0
0
Text · 24.0 KiB · d5131b3 Raw
929 lines · c
1/*2 * Copyright (c) 2015, Mellanox Technologies inc.  All rights reserved.3 *4 * This software is available to you under a choice of one of two5 * licenses.  You may choose to be licensed under the terms of the GNU6 * General Public License (GPL) Version 2, available from the file7 * COPYING in the main directory of this source tree, or the8 * OpenIB.org BSD license below:9 *10 *     Redistribution and use in source and binary forms, with or11 *     without modification, are permitted provided that the following12 *     conditions are met:13 *14 *      - Redistributions of source code must retain the above15 *        copyright notice, this list of conditions and the following16 *        disclaimer.17 *18 *      - Redistributions in binary form must reproduce the above19 *        copyright notice, this list of conditions and the following20 *        disclaimer in the documentation and/or other materials21 *        provided with the distribution.22 *23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE30 * SOFTWARE.31 */32 33#include "core_priv.h"34 35#include <linux/in.h>36#include <linux/in6.h>37 38/* For in6_dev_get/in6_dev_put */39#include <net/addrconf.h>40#include <net/bonding.h>41 42#include <rdma/ib_cache.h>43#include <rdma/ib_addr.h>44 45static struct workqueue_struct *gid_cache_wq;46 47enum gid_op_type {48	GID_DEL = 0,49	GID_ADD50};51 52struct update_gid_event_work {53	struct work_struct work;54	union ib_gid       gid;55	struct ib_gid_attr gid_attr;56	enum gid_op_type gid_op;57};58 59#define ROCE_NETDEV_CALLBACK_SZ		360struct netdev_event_work_cmd {61	roce_netdev_callback	cb;62	roce_netdev_filter	filter;63	struct net_device	*ndev;64	struct net_device	*filter_ndev;65};66 67struct netdev_event_work {68	struct work_struct		work;69	struct netdev_event_work_cmd	cmds[ROCE_NETDEV_CALLBACK_SZ];70};71 72static const struct {73	bool (*is_supported)(const struct ib_device *device, u32 port_num);74	enum ib_gid_type gid_type;75} PORT_CAP_TO_GID_TYPE[] = {76	{rdma_protocol_roce_eth_encap, IB_GID_TYPE_ROCE},77	{rdma_protocol_roce_udp_encap, IB_GID_TYPE_ROCE_UDP_ENCAP},78};79 80#define CAP_TO_GID_TABLE_SIZE	ARRAY_SIZE(PORT_CAP_TO_GID_TYPE)81 82unsigned long roce_gid_type_mask_support(struct ib_device *ib_dev, u32 port)83{84	int i;85	unsigned int ret_flags = 0;86 87	if (!rdma_protocol_roce(ib_dev, port))88		return 1UL << IB_GID_TYPE_IB;89 90	for (i = 0; i < CAP_TO_GID_TABLE_SIZE; i++)91		if (PORT_CAP_TO_GID_TYPE[i].is_supported(ib_dev, port))92			ret_flags |= 1UL << PORT_CAP_TO_GID_TYPE[i].gid_type;93 94	return ret_flags;95}96EXPORT_SYMBOL(roce_gid_type_mask_support);97 98static void update_gid(enum gid_op_type gid_op, struct ib_device *ib_dev,99		       u32 port, union ib_gid *gid,100		       struct ib_gid_attr *gid_attr)101{102	int i;103	unsigned long gid_type_mask = roce_gid_type_mask_support(ib_dev, port);104 105	for (i = 0; i < IB_GID_TYPE_SIZE; i++) {106		if ((1UL << i) & gid_type_mask) {107			gid_attr->gid_type = i;108			switch (gid_op) {109			case GID_ADD:110				ib_cache_gid_add(ib_dev, port,111						 gid, gid_attr);112				break;113			case GID_DEL:114				ib_cache_gid_del(ib_dev, port,115						 gid, gid_attr);116				break;117			}118		}119	}120}121 122enum bonding_slave_state {123	BONDING_SLAVE_STATE_ACTIVE	= 1UL << 0,124	BONDING_SLAVE_STATE_INACTIVE	= 1UL << 1,125	/* No primary slave or the device isn't a slave in bonding */126	BONDING_SLAVE_STATE_NA		= 1UL << 2,127};128 129static enum bonding_slave_state is_eth_active_slave_of_bonding_rcu(struct net_device *dev,130								   struct net_device *upper)131{132	if (upper && netif_is_bond_master(upper)) {133		struct net_device *pdev =134			bond_option_active_slave_get_rcu(netdev_priv(upper));135 136		if (pdev)137			return dev == pdev ? BONDING_SLAVE_STATE_ACTIVE :138				BONDING_SLAVE_STATE_INACTIVE;139	}140 141	return BONDING_SLAVE_STATE_NA;142}143 144#define REQUIRED_BOND_STATES		(BONDING_SLAVE_STATE_ACTIVE |	\145					 BONDING_SLAVE_STATE_NA)146static bool147is_eth_port_of_netdev_filter(struct ib_device *ib_dev, u32 port,148			     struct net_device *rdma_ndev, void *cookie)149{150	struct net_device *real_dev;151	bool res;152 153	if (!rdma_ndev)154		return false;155 156	rcu_read_lock();157	real_dev = rdma_vlan_dev_real_dev(cookie);158	if (!real_dev)159		real_dev = cookie;160 161	res = ((rdma_is_upper_dev_rcu(rdma_ndev, cookie) &&162	       (is_eth_active_slave_of_bonding_rcu(rdma_ndev, real_dev) &163		REQUIRED_BOND_STATES)) ||164	       real_dev == rdma_ndev);165 166	rcu_read_unlock();167	return res;168}169 170static bool171is_eth_port_inactive_slave_filter(struct ib_device *ib_dev, u32 port,172				  struct net_device *rdma_ndev, void *cookie)173{174	struct net_device *master_dev;175	bool res;176 177	if (!rdma_ndev)178		return false;179 180	rcu_read_lock();181	master_dev = netdev_master_upper_dev_get_rcu(rdma_ndev);182	res = is_eth_active_slave_of_bonding_rcu(rdma_ndev, master_dev) ==183		BONDING_SLAVE_STATE_INACTIVE;184	rcu_read_unlock();185 186	return res;187}188 189/**190 * is_ndev_for_default_gid_filter - Check if a given netdevice191 * can be considered for default GIDs or not.192 * @ib_dev:		IB device to check193 * @port:		Port to consider for adding default GID194 * @rdma_ndev:		rdma netdevice pointer195 * @cookie:             Netdevice to consider to form a default GID196 *197 * is_ndev_for_default_gid_filter() returns true if a given netdevice can be198 * considered for deriving default RoCE GID, returns false otherwise.199 */200static bool201is_ndev_for_default_gid_filter(struct ib_device *ib_dev, u32 port,202			       struct net_device *rdma_ndev, void *cookie)203{204	struct net_device *cookie_ndev = cookie;205	bool res;206 207	if (!rdma_ndev)208		return false;209 210	rcu_read_lock();211 212	/*213	 * When rdma netdevice is used in bonding, bonding master netdevice214	 * should be considered for default GIDs. Therefore, ignore slave rdma215	 * netdevices when bonding is considered.216	 * Additionally when event(cookie) netdevice is bond master device,217	 * make sure that it the upper netdevice of rdma netdevice.218	 */219	res = ((cookie_ndev == rdma_ndev && !netif_is_bond_slave(rdma_ndev)) ||220	       (netif_is_bond_master(cookie_ndev) &&221		rdma_is_upper_dev_rcu(rdma_ndev, cookie_ndev)));222 223	rcu_read_unlock();224	return res;225}226 227static bool pass_all_filter(struct ib_device *ib_dev, u32 port,228			    struct net_device *rdma_ndev, void *cookie)229{230	return true;231}232 233static bool upper_device_filter(struct ib_device *ib_dev, u32 port,234				struct net_device *rdma_ndev, void *cookie)235{236	bool res;237 238	if (!rdma_ndev)239		return false;240 241	if (rdma_ndev == cookie)242		return true;243 244	rcu_read_lock();245	res = rdma_is_upper_dev_rcu(rdma_ndev, cookie);246	rcu_read_unlock();247 248	return res;249}250 251/**252 * is_upper_ndev_bond_master_filter - Check if a given netdevice253 * is bond master device of netdevice of the RDMA device of port.254 * @ib_dev:		IB device to check255 * @port:		Port to consider for adding default GID256 * @rdma_ndev:		Pointer to rdma netdevice257 * @cookie:	        Netdevice to consider to form a default GID258 *259 * is_upper_ndev_bond_master_filter() returns true if a cookie_netdev260 * is bond master device and rdma_ndev is its lower netdevice. It might261 * not have been established as slave device yet.262 */263static bool264is_upper_ndev_bond_master_filter(struct ib_device *ib_dev, u32 port,265				 struct net_device *rdma_ndev,266				 void *cookie)267{268	struct net_device *cookie_ndev = cookie;269	bool match = false;270 271	if (!rdma_ndev)272		return false;273 274	rcu_read_lock();275	if (netif_is_bond_master(cookie_ndev) &&276	    rdma_is_upper_dev_rcu(rdma_ndev, cookie_ndev))277		match = true;278	rcu_read_unlock();279	return match;280}281 282static void update_gid_ip(enum gid_op_type gid_op,283			  struct ib_device *ib_dev,284			  u32 port, struct net_device *ndev,285			  struct sockaddr *addr)286{287	union ib_gid gid;288	struct ib_gid_attr gid_attr;289 290	rdma_ip2gid(addr, &gid);291	memset(&gid_attr, 0, sizeof(gid_attr));292	gid_attr.ndev = ndev;293 294	update_gid(gid_op, ib_dev, port, &gid, &gid_attr);295}296 297static void bond_delete_netdev_default_gids(struct ib_device *ib_dev,298					    u32 port,299					    struct net_device *rdma_ndev,300					    struct net_device *event_ndev)301{302	struct net_device *real_dev = rdma_vlan_dev_real_dev(event_ndev);303	unsigned long gid_type_mask;304 305	if (!rdma_ndev)306		return;307 308	if (!real_dev)309		real_dev = event_ndev;310 311	rcu_read_lock();312 313	if (((rdma_ndev != event_ndev &&314	      !rdma_is_upper_dev_rcu(rdma_ndev, event_ndev)) ||315	     is_eth_active_slave_of_bonding_rcu(rdma_ndev, real_dev)316						 ==317	     BONDING_SLAVE_STATE_INACTIVE)) {318		rcu_read_unlock();319		return;320	}321 322	rcu_read_unlock();323 324	gid_type_mask = roce_gid_type_mask_support(ib_dev, port);325 326	ib_cache_gid_set_default_gid(ib_dev, port, rdma_ndev,327				     gid_type_mask,328				     IB_CACHE_GID_DEFAULT_MODE_DELETE);329}330 331static void enum_netdev_ipv4_ips(struct ib_device *ib_dev,332				 u32 port, struct net_device *ndev)333{334	const struct in_ifaddr *ifa;335	struct in_device *in_dev;336	struct sin_list {337		struct list_head	list;338		struct sockaddr_in	ip;339	};340	struct sin_list *sin_iter;341	struct sin_list *sin_temp;342 343	LIST_HEAD(sin_list);344	if (ndev->reg_state >= NETREG_UNREGISTERING)345		return;346 347	rcu_read_lock();348	in_dev = __in_dev_get_rcu(ndev);349	if (!in_dev) {350		rcu_read_unlock();351		return;352	}353 354	in_dev_for_each_ifa_rcu(ifa, in_dev) {355		struct sin_list *entry = kzalloc(sizeof(*entry), GFP_ATOMIC);356 357		if (!entry)358			continue;359 360		entry->ip.sin_family = AF_INET;361		entry->ip.sin_addr.s_addr = ifa->ifa_address;362		list_add_tail(&entry->list, &sin_list);363	}364 365	rcu_read_unlock();366 367	list_for_each_entry_safe(sin_iter, sin_temp, &sin_list, list) {368		update_gid_ip(GID_ADD, ib_dev, port, ndev,369			      (struct sockaddr *)&sin_iter->ip);370		list_del(&sin_iter->list);371		kfree(sin_iter);372	}373}374 375static void enum_netdev_ipv6_ips(struct ib_device *ib_dev,376				 u32 port, struct net_device *ndev)377{378	struct inet6_ifaddr *ifp;379	struct inet6_dev *in6_dev;380	struct sin6_list {381		struct list_head	list;382		struct sockaddr_in6	sin6;383	};384	struct sin6_list *sin6_iter;385	struct sin6_list *sin6_temp;386	struct ib_gid_attr gid_attr = {.ndev = ndev};387	LIST_HEAD(sin6_list);388 389	if (ndev->reg_state >= NETREG_UNREGISTERING)390		return;391 392	in6_dev = in6_dev_get(ndev);393	if (!in6_dev)394		return;395 396	read_lock_bh(&in6_dev->lock);397	list_for_each_entry(ifp, &in6_dev->addr_list, if_list) {398		struct sin6_list *entry = kzalloc(sizeof(*entry), GFP_ATOMIC);399 400		if (!entry)401			continue;402 403		entry->sin6.sin6_family = AF_INET6;404		entry->sin6.sin6_addr = ifp->addr;405		list_add_tail(&entry->list, &sin6_list);406	}407	read_unlock_bh(&in6_dev->lock);408 409	in6_dev_put(in6_dev);410 411	list_for_each_entry_safe(sin6_iter, sin6_temp, &sin6_list, list) {412		union ib_gid	gid;413 414		rdma_ip2gid((struct sockaddr *)&sin6_iter->sin6, &gid);415		update_gid(GID_ADD, ib_dev, port, &gid, &gid_attr);416		list_del(&sin6_iter->list);417		kfree(sin6_iter);418	}419}420 421static void _add_netdev_ips(struct ib_device *ib_dev, u32 port,422			    struct net_device *ndev)423{424	enum_netdev_ipv4_ips(ib_dev, port, ndev);425	if (IS_ENABLED(CONFIG_IPV6))426		enum_netdev_ipv6_ips(ib_dev, port, ndev);427}428 429static void add_netdev_ips(struct ib_device *ib_dev, u32 port,430			   struct net_device *rdma_ndev, void *cookie)431{432	_add_netdev_ips(ib_dev, port, cookie);433}434 435static void del_netdev_ips(struct ib_device *ib_dev, u32 port,436			   struct net_device *rdma_ndev, void *cookie)437{438	ib_cache_gid_del_all_netdev_gids(ib_dev, port, cookie);439}440 441/**442 * del_default_gids - Delete default GIDs of the event/cookie netdevice443 * @ib_dev:	RDMA device pointer444 * @port:	Port of the RDMA device whose GID table to consider445 * @rdma_ndev:	Unused rdma netdevice446 * @cookie:	Pointer to event netdevice447 *448 * del_default_gids() deletes the default GIDs of the event/cookie netdevice.449 */450static void del_default_gids(struct ib_device *ib_dev, u32 port,451			     struct net_device *rdma_ndev, void *cookie)452{453	struct net_device *cookie_ndev = cookie;454	unsigned long gid_type_mask;455 456	gid_type_mask = roce_gid_type_mask_support(ib_dev, port);457 458	ib_cache_gid_set_default_gid(ib_dev, port, cookie_ndev, gid_type_mask,459				     IB_CACHE_GID_DEFAULT_MODE_DELETE);460}461 462static void add_default_gids(struct ib_device *ib_dev, u32 port,463			     struct net_device *rdma_ndev, void *cookie)464{465	struct net_device *event_ndev = cookie;466	unsigned long gid_type_mask;467 468	gid_type_mask = roce_gid_type_mask_support(ib_dev, port);469	ib_cache_gid_set_default_gid(ib_dev, port, event_ndev, gid_type_mask,470				     IB_CACHE_GID_DEFAULT_MODE_SET);471}472 473static void enum_all_gids_of_dev_cb(struct ib_device *ib_dev,474				    u32 port,475				    struct net_device *rdma_ndev,476				    void *cookie)477{478	struct net *net;479	struct net_device *ndev;480 481	/* Lock the rtnl to make sure the netdevs does not move under482	 * our feet483	 */484	rtnl_lock();485	down_read(&net_rwsem);486	for_each_net(net)487		for_each_netdev(net, ndev) {488			/*489			 * Filter and add default GIDs of the primary netdevice490			 * when not in bonding mode, or add default GIDs491			 * of bond master device, when in bonding mode.492			 */493			if (is_ndev_for_default_gid_filter(ib_dev, port,494							   rdma_ndev, ndev))495				add_default_gids(ib_dev, port, rdma_ndev, ndev);496 497			if (is_eth_port_of_netdev_filter(ib_dev, port,498							 rdma_ndev, ndev))499				_add_netdev_ips(ib_dev, port, ndev);500		}501	up_read(&net_rwsem);502	rtnl_unlock();503}504 505/**506 * rdma_roce_rescan_device - Rescan all of the network devices in the system507 * and add their gids, as needed, to the relevant RoCE devices.508 *509 * @ib_dev:         the rdma device510 */511void rdma_roce_rescan_device(struct ib_device *ib_dev)512{513	ib_enum_roce_netdev(ib_dev, pass_all_filter, NULL,514			    enum_all_gids_of_dev_cb, NULL);515}516EXPORT_SYMBOL(rdma_roce_rescan_device);517 518static void callback_for_addr_gid_device_scan(struct ib_device *device,519					      u32 port,520					      struct net_device *rdma_ndev,521					      void *cookie)522{523	struct update_gid_event_work *parsed = cookie;524 525	return update_gid(parsed->gid_op, device,526			  port, &parsed->gid,527			  &parsed->gid_attr);528}529 530struct upper_list {531	struct list_head list;532	struct net_device *upper;533};534 535static int netdev_upper_walk(struct net_device *upper,536			     struct netdev_nested_priv *priv)537{538	struct upper_list *entry = kmalloc(sizeof(*entry), GFP_ATOMIC);539	struct list_head *upper_list = (struct list_head *)priv->data;540 541	if (!entry)542		return 0;543 544	list_add_tail(&entry->list, upper_list);545	dev_hold(upper);546	entry->upper = upper;547 548	return 0;549}550 551static void handle_netdev_upper(struct ib_device *ib_dev, u32 port,552				void *cookie,553				void (*handle_netdev)(struct ib_device *ib_dev,554						      u32 port,555						      struct net_device *ndev))556{557	struct net_device *ndev = cookie;558	struct netdev_nested_priv priv;559	struct upper_list *upper_iter;560	struct upper_list *upper_temp;561	LIST_HEAD(upper_list);562 563	priv.data = &upper_list;564	rcu_read_lock();565	netdev_walk_all_upper_dev_rcu(ndev, netdev_upper_walk, &priv);566	rcu_read_unlock();567 568	handle_netdev(ib_dev, port, ndev);569	list_for_each_entry_safe(upper_iter, upper_temp, &upper_list,570				 list) {571		handle_netdev(ib_dev, port, upper_iter->upper);572		dev_put(upper_iter->upper);573		list_del(&upper_iter->list);574		kfree(upper_iter);575	}576}577 578static void _roce_del_all_netdev_gids(struct ib_device *ib_dev, u32 port,579				      struct net_device *event_ndev)580{581	ib_cache_gid_del_all_netdev_gids(ib_dev, port, event_ndev);582}583 584static void del_netdev_upper_ips(struct ib_device *ib_dev, u32 port,585				 struct net_device *rdma_ndev, void *cookie)586{587	handle_netdev_upper(ib_dev, port, cookie, _roce_del_all_netdev_gids);588}589 590static void add_netdev_upper_ips(struct ib_device *ib_dev, u32 port,591				 struct net_device *rdma_ndev, void *cookie)592{593	handle_netdev_upper(ib_dev, port, cookie, _add_netdev_ips);594}595 596static void del_netdev_default_ips_join(struct ib_device *ib_dev, u32 port,597					struct net_device *rdma_ndev,598					void *cookie)599{600	struct net_device *master_ndev;601 602	rcu_read_lock();603	master_ndev = netdev_master_upper_dev_get_rcu(rdma_ndev);604	dev_hold(master_ndev);605	rcu_read_unlock();606 607	if (master_ndev) {608		bond_delete_netdev_default_gids(ib_dev, port, rdma_ndev,609						master_ndev);610		dev_put(master_ndev);611	}612}613 614/* The following functions operate on all IB devices. netdevice_event and615 * addr_event execute ib_enum_all_roce_netdevs through a work.616 * ib_enum_all_roce_netdevs iterates through all IB devices.617 */618 619static void netdevice_event_work_handler(struct work_struct *_work)620{621	struct netdev_event_work *work =622		container_of(_work, struct netdev_event_work, work);623	unsigned int i;624 625	for (i = 0; i < ARRAY_SIZE(work->cmds) && work->cmds[i].cb; i++) {626		ib_enum_all_roce_netdevs(work->cmds[i].filter,627					 work->cmds[i].filter_ndev,628					 work->cmds[i].cb,629					 work->cmds[i].ndev);630		dev_put(work->cmds[i].ndev);631		dev_put(work->cmds[i].filter_ndev);632	}633 634	kfree(work);635}636 637static int netdevice_queue_work(struct netdev_event_work_cmd *cmds,638				struct net_device *ndev)639{640	unsigned int i;641	struct netdev_event_work *ndev_work =642		kmalloc(sizeof(*ndev_work), GFP_KERNEL);643 644	if (!ndev_work)645		return NOTIFY_DONE;646 647	memcpy(ndev_work->cmds, cmds, sizeof(ndev_work->cmds));648	for (i = 0; i < ARRAY_SIZE(ndev_work->cmds) && ndev_work->cmds[i].cb; i++) {649		if (!ndev_work->cmds[i].ndev)650			ndev_work->cmds[i].ndev = ndev;651		if (!ndev_work->cmds[i].filter_ndev)652			ndev_work->cmds[i].filter_ndev = ndev;653		dev_hold(ndev_work->cmds[i].ndev);654		dev_hold(ndev_work->cmds[i].filter_ndev);655	}656	INIT_WORK(&ndev_work->work, netdevice_event_work_handler);657 658	queue_work(gid_cache_wq, &ndev_work->work);659 660	return NOTIFY_DONE;661}662 663static const struct netdev_event_work_cmd add_cmd = {664	.cb	= add_netdev_ips,665	.filter	= is_eth_port_of_netdev_filter666};667 668static const struct netdev_event_work_cmd add_cmd_upper_ips = {669	.cb	= add_netdev_upper_ips,670	.filter = is_eth_port_of_netdev_filter671};672 673static void674ndev_event_unlink(struct netdev_notifier_changeupper_info *changeupper_info,675		  struct netdev_event_work_cmd *cmds)676{677	static const struct netdev_event_work_cmd678			upper_ips_del_cmd = {679				.cb	= del_netdev_upper_ips,680				.filter	= upper_device_filter681	};682 683	cmds[0] = upper_ips_del_cmd;684	cmds[0].ndev = changeupper_info->upper_dev;685	cmds[1] = add_cmd;686}687 688static const struct netdev_event_work_cmd bonding_default_add_cmd = {689	.cb	= add_default_gids,690	.filter	= is_upper_ndev_bond_master_filter691};692 693static void694ndev_event_link(struct net_device *event_ndev,695		struct netdev_notifier_changeupper_info *changeupper_info,696		struct netdev_event_work_cmd *cmds)697{698	static const struct netdev_event_work_cmd699			bonding_default_del_cmd = {700				.cb	= del_default_gids,701				.filter	= is_upper_ndev_bond_master_filter702			};703	/*704	 * When a lower netdev is linked to its upper bonding705	 * netdev, delete lower slave netdev's default GIDs.706	 */707	cmds[0] = bonding_default_del_cmd;708	cmds[0].ndev = event_ndev;709	cmds[0].filter_ndev = changeupper_info->upper_dev;710 711	/* Now add bonding upper device default GIDs */712	cmds[1] = bonding_default_add_cmd;713	cmds[1].ndev = changeupper_info->upper_dev;714	cmds[1].filter_ndev = changeupper_info->upper_dev;715 716	/* Now add bonding upper device IP based GIDs */717	cmds[2] = add_cmd_upper_ips;718	cmds[2].ndev = changeupper_info->upper_dev;719	cmds[2].filter_ndev = changeupper_info->upper_dev;720}721 722static void netdevice_event_changeupper(struct net_device *event_ndev,723		struct netdev_notifier_changeupper_info *changeupper_info,724		struct netdev_event_work_cmd *cmds)725{726	if (changeupper_info->linking)727		ndev_event_link(event_ndev, changeupper_info, cmds);728	else729		ndev_event_unlink(changeupper_info, cmds);730}731 732static const struct netdev_event_work_cmd add_default_gid_cmd = {733	.cb	= add_default_gids,734	.filter	= is_ndev_for_default_gid_filter,735};736 737static int netdevice_event(struct notifier_block *this, unsigned long event,738			   void *ptr)739{740	static const struct netdev_event_work_cmd del_cmd = {741		.cb = del_netdev_ips, .filter = pass_all_filter};742	static const struct netdev_event_work_cmd743			bonding_default_del_cmd_join = {744				.cb	= del_netdev_default_ips_join,745				.filter	= is_eth_port_inactive_slave_filter746			};747	static const struct netdev_event_work_cmd748			netdev_del_cmd = {749				.cb	= del_netdev_ips,750				.filter = is_eth_port_of_netdev_filter751			};752	static const struct netdev_event_work_cmd bonding_event_ips_del_cmd = {753		.cb = del_netdev_upper_ips, .filter = upper_device_filter};754	struct net_device *ndev = netdev_notifier_info_to_dev(ptr);755	struct netdev_event_work_cmd cmds[ROCE_NETDEV_CALLBACK_SZ] = { {NULL} };756 757	if (ndev->type != ARPHRD_ETHER)758		return NOTIFY_DONE;759 760	switch (event) {761	case NETDEV_REGISTER:762	case NETDEV_UP:763		cmds[0] = bonding_default_del_cmd_join;764		cmds[1] = add_default_gid_cmd;765		cmds[2] = add_cmd;766		break;767 768	case NETDEV_UNREGISTER:769		if (ndev->reg_state < NETREG_UNREGISTERED)770			cmds[0] = del_cmd;771		else772			return NOTIFY_DONE;773		break;774 775	case NETDEV_CHANGEADDR:776		cmds[0] = netdev_del_cmd;777		if (ndev->reg_state == NETREG_REGISTERED) {778			cmds[1] = add_default_gid_cmd;779			cmds[2] = add_cmd;780		}781		break;782 783	case NETDEV_CHANGEUPPER:784		netdevice_event_changeupper(ndev,785			container_of(ptr, struct netdev_notifier_changeupper_info, info),786			cmds);787		break;788 789	case NETDEV_BONDING_FAILOVER:790		cmds[0] = bonding_event_ips_del_cmd;791		/* Add default GIDs of the bond device */792		cmds[1] = bonding_default_add_cmd;793		/* Add IP based GIDs of the bond device */794		cmds[2] = add_cmd_upper_ips;795		break;796 797	default:798		return NOTIFY_DONE;799	}800 801	return netdevice_queue_work(cmds, ndev);802}803 804static void update_gid_event_work_handler(struct work_struct *_work)805{806	struct update_gid_event_work *work =807		container_of(_work, struct update_gid_event_work, work);808 809	ib_enum_all_roce_netdevs(is_eth_port_of_netdev_filter,810				 work->gid_attr.ndev,811				 callback_for_addr_gid_device_scan, work);812 813	dev_put(work->gid_attr.ndev);814	kfree(work);815}816 817static int addr_event(struct notifier_block *this, unsigned long event,818		      struct sockaddr *sa, struct net_device *ndev)819{820	struct update_gid_event_work *work;821	enum gid_op_type gid_op;822 823	if (ndev->type != ARPHRD_ETHER)824		return NOTIFY_DONE;825 826	switch (event) {827	case NETDEV_UP:828		gid_op = GID_ADD;829		break;830 831	case NETDEV_DOWN:832		gid_op = GID_DEL;833		break;834 835	default:836		return NOTIFY_DONE;837	}838 839	work = kmalloc(sizeof(*work), GFP_ATOMIC);840	if (!work)841		return NOTIFY_DONE;842 843	INIT_WORK(&work->work, update_gid_event_work_handler);844 845	rdma_ip2gid(sa, &work->gid);846	work->gid_op = gid_op;847 848	memset(&work->gid_attr, 0, sizeof(work->gid_attr));849	dev_hold(ndev);850	work->gid_attr.ndev   = ndev;851 852	queue_work(gid_cache_wq, &work->work);853 854	return NOTIFY_DONE;855}856 857static int inetaddr_event(struct notifier_block *this, unsigned long event,858			  void *ptr)859{860	struct sockaddr_in	in;861	struct net_device	*ndev;862	struct in_ifaddr	*ifa = ptr;863 864	in.sin_family = AF_INET;865	in.sin_addr.s_addr = ifa->ifa_address;866	ndev = ifa->ifa_dev->dev;867 868	return addr_event(this, event, (struct sockaddr *)&in, ndev);869}870 871static int inet6addr_event(struct notifier_block *this, unsigned long event,872			   void *ptr)873{874	struct sockaddr_in6	in6;875	struct net_device	*ndev;876	struct inet6_ifaddr	*ifa6 = ptr;877 878	in6.sin6_family = AF_INET6;879	in6.sin6_addr = ifa6->addr;880	ndev = ifa6->idev->dev;881 882	return addr_event(this, event, (struct sockaddr *)&in6, ndev);883}884 885static struct notifier_block nb_netdevice = {886	.notifier_call = netdevice_event887};888 889static struct notifier_block nb_inetaddr = {890	.notifier_call = inetaddr_event891};892 893static struct notifier_block nb_inet6addr = {894	.notifier_call = inet6addr_event895};896 897int __init roce_gid_mgmt_init(void)898{899	gid_cache_wq = alloc_ordered_workqueue("gid-cache-wq", 0);900	if (!gid_cache_wq)901		return -ENOMEM;902 903	register_inetaddr_notifier(&nb_inetaddr);904	if (IS_ENABLED(CONFIG_IPV6))905		register_inet6addr_notifier(&nb_inet6addr);906	/* We relay on the netdevice notifier to enumerate all907	 * existing devices in the system. Register to this notifier908	 * last to make sure we will not miss any IP add/del909	 * callbacks.910	 */911	register_netdevice_notifier(&nb_netdevice);912 913	return 0;914}915 916void __exit roce_gid_mgmt_cleanup(void)917{918	if (IS_ENABLED(CONFIG_IPV6))919		unregister_inet6addr_notifier(&nb_inet6addr);920	unregister_inetaddr_notifier(&nb_inetaddr);921	unregister_netdevice_notifier(&nb_netdevice);922	/* Ensure all gid deletion tasks complete before we go down,923	 * to avoid any reference to free'd memory. By the time924	 * ib-core is removed, all physical devices have been removed,925	 * so no issue with remaining hardware contexts.926	 */927	destroy_workqueue(gid_cache_wq);928}929