@@ -209,23 +209,6 @@ static void __ibdev_printk(const char *level, const struct ib_device *ibdev,
209209 printk ("%s(NULL ib_device): %pV" , level , vaf );
210210}
211211
212- void ibdev_printk (const char * level , const struct ib_device * ibdev ,
213- const char * format , ...)
214- {
215- struct va_format vaf ;
216- va_list args ;
217-
218- va_start (args , format );
219-
220- vaf .fmt = format ;
221- vaf .va = & args ;
222-
223- __ibdev_printk (level , ibdev , & vaf );
224-
225- va_end (args );
226- }
227- EXPORT_SYMBOL (ibdev_printk );
228-
229212#define define_ibdev_printk_level (func , level ) \
230213void func(const struct ib_device *ibdev, const char *fmt, ...) \
231214{ \
@@ -2295,6 +2278,33 @@ struct net_device *ib_device_get_netdev(struct ib_device *ib_dev,
22952278}
22962279EXPORT_SYMBOL (ib_device_get_netdev );
22972280
2281+ /**
2282+ * ib_query_netdev_port - Query the port number of a net_device
2283+ * associated with an ibdev
2284+ * @ibdev: IB device
2285+ * @ndev: Network device
2286+ * @port: IB port the net_device is connected to
2287+ */
2288+ int ib_query_netdev_port (struct ib_device * ibdev , struct net_device * ndev ,
2289+ u32 * port )
2290+ {
2291+ struct net_device * ib_ndev ;
2292+ u32 port_num ;
2293+
2294+ rdma_for_each_port (ibdev , port_num ) {
2295+ ib_ndev = ib_device_get_netdev (ibdev , port_num );
2296+ if (ndev == ib_ndev ) {
2297+ * port = port_num ;
2298+ dev_put (ib_ndev );
2299+ return 0 ;
2300+ }
2301+ dev_put (ib_ndev );
2302+ }
2303+
2304+ return - ENOENT ;
2305+ }
2306+ EXPORT_SYMBOL (ib_query_netdev_port );
2307+
22982308/**
22992309 * ib_device_get_by_netdev - Find an IB device associated with a netdev
23002310 * @ndev: netdev to locate
@@ -2761,6 +2771,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
27612771 SET_DEVICE_OP (dev_ops , set_vf_guid );
27622772 SET_DEVICE_OP (dev_ops , set_vf_link_state );
27632773 SET_DEVICE_OP (dev_ops , ufile_hw_cleanup );
2774+ SET_DEVICE_OP (dev_ops , report_port_event );
27642775
27652776 SET_OBJ_SIZE (dev_ops , ib_ah );
27662777 SET_OBJ_SIZE (dev_ops , ib_counters );
@@ -2854,11 +2865,62 @@ static const struct rdma_nl_cbs ibnl_ls_cb_table[RDMA_NL_LS_NUM_OPS] = {
28542865 },
28552866};
28562867
2868+ void ib_dispatch_port_state_event (struct ib_device * ibdev , struct net_device * ndev )
2869+ {
2870+ enum ib_port_state curr_state ;
2871+ struct ib_event ibevent = {};
2872+ u32 port ;
2873+
2874+ if (ib_query_netdev_port (ibdev , ndev , & port ))
2875+ return ;
2876+
2877+ curr_state = ib_get_curr_port_state (ndev );
2878+
2879+ write_lock_irq (& ibdev -> cache_lock );
2880+ if (ibdev -> port_data [port ].cache .last_port_state == curr_state ) {
2881+ write_unlock_irq (& ibdev -> cache_lock );
2882+ return ;
2883+ }
2884+ ibdev -> port_data [port ].cache .last_port_state = curr_state ;
2885+ write_unlock_irq (& ibdev -> cache_lock );
2886+
2887+ ibevent .event = (curr_state == IB_PORT_DOWN ) ?
2888+ IB_EVENT_PORT_ERR : IB_EVENT_PORT_ACTIVE ;
2889+ ibevent .device = ibdev ;
2890+ ibevent .element .port_num = port ;
2891+ ib_dispatch_event (& ibevent );
2892+ }
2893+ EXPORT_SYMBOL (ib_dispatch_port_state_event );
2894+
2895+ static void handle_port_event (struct net_device * ndev , unsigned long event )
2896+ {
2897+ struct ib_device * ibdev ;
2898+
2899+ /* Currently, link events in bonding scenarios are still
2900+ * reported by drivers that support bonding.
2901+ */
2902+ if (netif_is_lag_master (ndev ) || netif_is_lag_port (ndev ))
2903+ return ;
2904+
2905+ ibdev = ib_device_get_by_netdev (ndev , RDMA_DRIVER_UNKNOWN );
2906+ if (!ibdev )
2907+ return ;
2908+
2909+ if (ibdev -> ops .report_port_event ) {
2910+ ibdev -> ops .report_port_event (ibdev , ndev , event );
2911+ goto put_ibdev ;
2912+ }
2913+
2914+ ib_dispatch_port_state_event (ibdev , ndev );
2915+
2916+ put_ibdev :
2917+ ib_device_put (ibdev );
2918+ };
2919+
28572920static int ib_netdevice_event (struct notifier_block * this ,
28582921 unsigned long event , void * ptr )
28592922{
28602923 struct net_device * ndev = netdev_notifier_info_to_dev (ptr );
2861- struct net_device * ib_ndev ;
28622924 struct ib_device * ibdev ;
28632925 u32 port ;
28642926
@@ -2868,15 +2930,21 @@ static int ib_netdevice_event(struct notifier_block *this,
28682930 if (!ibdev )
28692931 return NOTIFY_DONE ;
28702932
2871- rdma_for_each_port (ibdev , port ) {
2872- ib_ndev = ib_device_get_netdev (ibdev , port );
2873- if (ndev == ib_ndev )
2874- rdma_nl_notify_event (ibdev , port ,
2875- RDMA_NETDEV_RENAME_EVENT );
2876- dev_put (ib_ndev );
2933+ if (ib_query_netdev_port (ibdev , ndev , & port )) {
2934+ ib_device_put (ibdev );
2935+ break ;
28772936 }
2937+
2938+ rdma_nl_notify_event (ibdev , port , RDMA_NETDEV_RENAME_EVENT );
28782939 ib_device_put (ibdev );
28792940 break ;
2941+
2942+ case NETDEV_UP :
2943+ case NETDEV_CHANGE :
2944+ case NETDEV_DOWN :
2945+ handle_port_event (ndev , event );
2946+ break ;
2947+
28802948 default :
28812949 break ;
28822950 }
0 commit comments