Commit 8adf71fa authored by Jianxin Xiong's avatar Jianxin Xiong Committed by Doug Ledford

IB/hfi1: Fix "suspicious rcu_dereference_check() usage" warnings

This fixes the following warnings with PROVE_LOCKING and PROVE_RCU
enabled in the kernel:

case (1):
[ INFO: suspicious RCU usage. ]
drivers/infiniband/hw/hfi1/init.c:532
suspicious rcu_dereference_check() usage!

case (2):
[ INFO: suspicious RCU usage. ]
drivers/infiniband/hw/hfi1/hfi.h:1624
suspicious rcu_dereference_check() usage!
Reviewed-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarJianxin Xiong <jianxin.xiong@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent a6580f43
...@@ -1616,14 +1616,23 @@ static inline u16 hfi1_get_pkey(struct hfi1_ibport *ibp, unsigned index) ...@@ -1616,14 +1616,23 @@ static inline u16 hfi1_get_pkey(struct hfi1_ibport *ibp, unsigned index)
} }
/* /*
* Readers of cc_state must call get_cc_state() under rcu_read_lock(). * Called by readers of cc_state only, must call under rcu_read_lock().
* Writers of cc_state must call get_cc_state() under cc_state_lock.
*/ */
static inline struct cc_state *get_cc_state(struct hfi1_pportdata *ppd) static inline struct cc_state *get_cc_state(struct hfi1_pportdata *ppd)
{ {
return rcu_dereference(ppd->cc_state); return rcu_dereference(ppd->cc_state);
} }
/*
* Called by writers of cc_state only, must call under cc_state_lock.
*/
static inline
struct cc_state *get_cc_state_protected(struct hfi1_pportdata *ppd)
{
return rcu_dereference_protected(ppd->cc_state,
lockdep_is_held(&ppd->cc_state_lock));
}
/* /*
* values for dd->flags (_device_ related flags) * values for dd->flags (_device_ related flags)
*/ */
......
...@@ -475,8 +475,9 @@ static enum hrtimer_restart cca_timer_fn(struct hrtimer *t) ...@@ -475,8 +475,9 @@ static enum hrtimer_restart cca_timer_fn(struct hrtimer *t)
void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd, void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd,
struct hfi1_devdata *dd, u8 hw_pidx, u8 port) struct hfi1_devdata *dd, u8 hw_pidx, u8 port)
{ {
int i, size; int i;
uint default_pkey_idx; uint default_pkey_idx;
struct cc_state *cc_state;
ppd->dd = dd; ppd->dd = dd;
ppd->hw_pidx = hw_pidx; ppd->hw_pidx = hw_pidx;
...@@ -527,9 +528,9 @@ void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd, ...@@ -527,9 +528,9 @@ void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd,
spin_lock_init(&ppd->cc_state_lock); spin_lock_init(&ppd->cc_state_lock);
spin_lock_init(&ppd->cc_log_lock); spin_lock_init(&ppd->cc_log_lock);
size = sizeof(struct cc_state); cc_state = kzalloc(sizeof(*cc_state), GFP_KERNEL);
RCU_INIT_POINTER(ppd->cc_state, kzalloc(size, GFP_KERNEL)); RCU_INIT_POINTER(ppd->cc_state, cc_state);
if (!rcu_dereference(ppd->cc_state)) if (!cc_state)
goto bail; goto bail;
return; return;
...@@ -1327,7 +1328,7 @@ static void cleanup_device_data(struct hfi1_devdata *dd) ...@@ -1327,7 +1328,7 @@ static void cleanup_device_data(struct hfi1_devdata *dd)
hrtimer_cancel(&ppd->cca_timer[i].hrtimer); hrtimer_cancel(&ppd->cca_timer[i].hrtimer);
spin_lock(&ppd->cc_state_lock); spin_lock(&ppd->cc_state_lock);
cc_state = get_cc_state(ppd); cc_state = get_cc_state_protected(ppd);
RCU_INIT_POINTER(ppd->cc_state, NULL); RCU_INIT_POINTER(ppd->cc_state, NULL);
spin_unlock(&ppd->cc_state_lock); spin_unlock(&ppd->cc_state_lock);
......
...@@ -3375,7 +3375,7 @@ static void apply_cc_state(struct hfi1_pportdata *ppd) ...@@ -3375,7 +3375,7 @@ static void apply_cc_state(struct hfi1_pportdata *ppd)
*/ */
spin_lock(&ppd->cc_state_lock); spin_lock(&ppd->cc_state_lock);
old_cc_state = get_cc_state(ppd); old_cc_state = get_cc_state_protected(ppd);
if (!old_cc_state) { if (!old_cc_state) {
/* never active, or shutting down */ /* never active, or shutting down */
spin_unlock(&ppd->cc_state_lock); spin_unlock(&ppd->cc_state_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment