powerpc/mpic_msgr: add lock for MPIC message global variable
Also fix issue of accessing invalid msgr pointer issue. The local msgr pointer in fucntion mpic_msgr_get will be accessed before getting a valid address which will cause kernel crash. Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
This commit is contained in:
parent
bdce27c7f7
commit
e0a5a6c381
1 changed files with 5 additions and 5 deletions
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
static struct mpic_msgr **mpic_msgrs;
|
static struct mpic_msgr **mpic_msgrs;
|
||||||
static unsigned int mpic_msgr_count;
|
static unsigned int mpic_msgr_count;
|
||||||
|
static DEFINE_RAW_SPINLOCK(msgrs_lock);
|
||||||
|
|
||||||
static inline void _mpic_msgr_mer_write(struct mpic_msgr *msgr, u32 value)
|
static inline void _mpic_msgr_mer_write(struct mpic_msgr *msgr, u32 value)
|
||||||
{
|
{
|
||||||
|
@ -56,12 +57,11 @@ struct mpic_msgr *mpic_msgr_get(unsigned int reg_num)
|
||||||
if (reg_num >= mpic_msgr_count)
|
if (reg_num >= mpic_msgr_count)
|
||||||
return ERR_PTR(-ENODEV);
|
return ERR_PTR(-ENODEV);
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&msgr->lock, flags);
|
raw_spin_lock_irqsave(&msgrs_lock, flags);
|
||||||
if (mpic_msgrs[reg_num]->in_use == MSGR_FREE) {
|
msgr = mpic_msgrs[reg_num];
|
||||||
msgr = mpic_msgrs[reg_num];
|
if (msgr->in_use == MSGR_FREE)
|
||||||
msgr->in_use = MSGR_INUSE;
|
msgr->in_use = MSGR_INUSE;
|
||||||
}
|
raw_spin_unlock_irqrestore(&msgrs_lock, flags);
|
||||||
raw_spin_unlock_irqrestore(&msgr->lock, flags);
|
|
||||||
|
|
||||||
return msgr;
|
return msgr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue