aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBryan O'Sullivan <bos@pathscale.com>2007-03-15 17:44:56 -0400
committerRoland Dreier <rolandd@cisco.com>2007-04-18 23:20:56 -0400
commit614d49a21e96737f84b13f644ac813f8eb6d297a (patch)
tree6a8389bcaf26f17d57a6720f84c3fe5b5887423d /drivers
parent8ec1077b35359c973f4b1de7c516be570a6df495 (diff)
IB/ipath: Fix bad argument to clear_bit()
Code was converted from a &= ~mask to clear_bit, but the bit was left shifted instead of being used directly, so we were either trashing memory several pages away, or sometimes taking a kernel page fault on an invalid page. Signed-off-by: Dave Olson <dave.olson@qlogic.com> Signed-off-by: Bryan O'Sullivan <bryan.osullivan@qlogic.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/infiniband/hw/ipath/ipath_intr.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_intr.c b/drivers/infiniband/hw/ipath/ipath_intr.c
index 037b8e276429..24853310df1c 100644
--- a/drivers/infiniband/hw/ipath/ipath_intr.c
+++ b/drivers/infiniband/hw/ipath/ipath_intr.c
@@ -842,11 +842,10 @@ static void handle_urcv(struct ipath_devdata *dd, u32 istat)
842 struct ipath_portdata *pd = dd->ipath_pd[i]; 842 struct ipath_portdata *pd = dd->ipath_pd[i];
843 if (portr & (1 << i) && pd && pd->port_cnt && 843 if (portr & (1 << i) && pd && pd->port_cnt &&
844 test_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag)) { 844 test_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag)) {
845 int rcbit;
846 clear_bit(IPATH_PORT_WAITING_RCV, 845 clear_bit(IPATH_PORT_WAITING_RCV,
847 &pd->port_flag); 846 &pd->port_flag);
848 rcbit = i + INFINIPATH_R_INTRAVAIL_SHIFT; 847 clear_bit(i + INFINIPATH_R_INTRAVAIL_SHIFT,
849 clear_bit(1UL << rcbit, &dd->ipath_rcvctrl); 848 &dd->ipath_rcvctrl);
850 wake_up_interruptible(&pd->port_wait); 849 wake_up_interruptible(&pd->port_wait);
851 rcvdint = 1; 850 rcvdint = 1;
852 } 851 }