mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-28 12:25:31 +00:00
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: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Jianxin Xiong <jianxin.xiong@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
a6580f4310
commit
8adf71fa14
@ -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().
|
||||
* Writers of cc_state must call get_cc_state() under cc_state_lock.
|
||||
* Called by readers of cc_state only, must call under rcu_read_lock().
|
||||
*/
|
||||
static inline struct cc_state *get_cc_state(struct hfi1_pportdata *ppd)
|
||||
{
|
||||
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)
|
||||
*/
|
||||
|
@ -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,
|
||||
struct hfi1_devdata *dd, u8 hw_pidx, u8 port)
|
||||
{
|
||||
int i, size;
|
||||
int i;
|
||||
uint default_pkey_idx;
|
||||
struct cc_state *cc_state;
|
||||
|
||||
ppd->dd = dd;
|
||||
ppd->hw_pidx = hw_pidx;
|
||||
@ -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_log_lock);
|
||||
size = sizeof(struct cc_state);
|
||||
RCU_INIT_POINTER(ppd->cc_state, kzalloc(size, GFP_KERNEL));
|
||||
if (!rcu_dereference(ppd->cc_state))
|
||||
cc_state = kzalloc(sizeof(*cc_state), GFP_KERNEL);
|
||||
RCU_INIT_POINTER(ppd->cc_state, cc_state);
|
||||
if (!cc_state)
|
||||
goto bail;
|
||||
return;
|
||||
|
||||
@ -1327,7 +1328,7 @@ static void cleanup_device_data(struct hfi1_devdata *dd)
|
||||
hrtimer_cancel(&ppd->cca_timer[i].hrtimer);
|
||||
|
||||
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);
|
||||
spin_unlock(&ppd->cc_state_lock);
|
||||
|
||||
|
@ -3375,7 +3375,7 @@ static void apply_cc_state(struct hfi1_pportdata *ppd)
|
||||
*/
|
||||
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) {
|
||||
/* never active, or shutting down */
|
||||
spin_unlock(&ppd->cc_state_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user