From: Leon Romanovsky <leonro@xxxxxxxxxxxx> >From Parav, Currently when low level driver notifies Pkey, GID, port change events, they are notified to the registered handlers in the order they are registered. IB core and other ULPs such as IPoIB are interested in GID, LID, Pkey change events. Since all GID query done by ULPs is serviced by IB core, IB core is yet to update the GID cache when IPoIB queries the GID, resulting into not updating IPoIB address. Detailed flow is shown in the patch-1. Hence, all events which require cache update are handled first by the IB core. Once cache update work is completed, IB core distributes the event to subscriber clients. This is tested with opensm's /etc/rdma/opensm.conf subnet_prefix configuration update where before the update $ ip link show dev ib0 ib0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2044 qdisc pfifo_fast state UP mode DEFAULT group default qlen 256 link/infiniband 80:00:01:07:fe:80:00:00:00:00:00:00:24:8a:07:03:00:b3:d1:12 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff And after the subnet prefix update: ib0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2044 qdisc pfifo_fast state UP mode DEFAULT group default qlen 256 link/infiniband 80:00:01:07:fe:80:00:00:00:00:00:02:24:8a:07:03:00:b3:d1:12 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff Patch-1 fixes the race condition between GID users and GID cache update Patch-2 eliminates single entry structure Patch-3 simplifies the code to not generate the event for unregistered device Parav Pandit (3): IB/core: Let IB core distribute cache update events IB/core: Cut down single member ib_cache structure IB/core: Do not notify GID change event of an unregistered device drivers/infiniband/core/cache.c | 132 ++++++++++++++-------------- drivers/infiniband/core/core_priv.h | 3 + drivers/infiniband/core/device.c | 26 ++++-- include/rdma/ib_verbs.h | 8 +- 4 files changed, 87 insertions(+), 82 deletions(-) -- 2.20.1