linux/drivers
Roland Dreier 0d89fe2c0c IB/mthca: Fix and simplify page size calculation in mthca_reg_phys_mr()
In mthca_reg_phys_mr(), we calculate the page size for the HCA
hardware to use to map the buffer list passed in by the consumer.
For example, if the consumer passes in

    [0] addr 0x1000, size 0x1000
    [1] addr 0x2000, size 0x1000

then the algorithm would come up with a page size of 0x2000 and a list
of two pages, at 0x0000 and 0x2000.  Usually, this would work fine
since the memory region would start at an offset of 0x1000 and have a
length of 0x2000.

However, the old code did not take into account the alignment of the
IO virtual address passed in.  For example, if the consumer passed in
a virtual address of 0x6000 for the above, then the offset of 0x1000
would not be used correctly because the page mask of 0x1fff would
result in an offset of 0.

We can fix this quite neatly by making sure that the page shift we use
is no bigger than the first bit where the start of the first buffer
and the IO virtual address differ.  Also, we can further simplify the
code by removing the special case for a single buffer by noticing that
it doesn't matter if we use a page size that is too big.  This allows
the loop to compute the page shift to be replaced with __ffs().

Thanks to Bryan S Rosenburg <rosnbrg@us.ibm.com> for pointing out the
original bug and suggesting several ways to improve this patch.

Signed-off-by: Roland Dreier <rolandd@cisco.com>
2008-02-04 20:20:42 -08:00
..
acorn/char
acpi drivers/acpi/: Spelling fixes 2008-02-03 17:06:17 +02:00
amba
ata drivers/ata/: Spelling fixes 2008-02-03 17:08:11 +02:00
atm [ATM]: [he] fixing compilation when you define USE_RBPS_POOL/USE_RBPL_POOL 2008-01-28 15:00:15 -08:00
auxdisplay
base Driver core: Remove unneeded get_{device,driver}() calls. 2008-02-02 15:14:49 -08:00
block Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus 2008-02-04 08:00:54 -08:00
bluetooth drivers/bluetooth/: Spelling fixes 2008-02-03 17:10:31 +02:00
cdrom ide-cd: move lba_to_msf() and msf_to_lba() to <linux/cdrom.h> 2008-02-01 23:09:24 +01:00
char Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus 2008-02-04 08:00:54 -08:00
clocksource
connector [NETNS]: Consolidate kernel netlink socket destruction. 2008-01-28 15:08:07 -08:00
cpufreq cpufreq: fix obvious condition statement error 2008-01-30 13:33:34 +01:00
cpuidle
crypto [S390] crypto: move s390 Kconfig options. 2008-01-26 14:11:17 +01:00
dca
dio dio: fix kernel-doc notation 2008-02-03 16:29:12 +02:00
dma
edac drivers/edac/: Spelling fixes 2008-02-03 17:12:34 +02:00
eisa
firewire firewire: fw-sbp2: Use sbp2 device-provided mgt orb timeout for logins 2008-01-30 22:22:29 +01:00
firmware drivers/firmware/: Spelling fixes 2008-02-03 17:13:40 +02:00
hid HID: ADS/Tech Radio si470x needs blacklist entry 2008-01-28 14:51:23 +01:00
hwmon
i2c PCI: Remove users of pci_enable_device_bars() 2008-02-01 15:04:27 -08:00
ide Spelling fixes: lenght->length 2008-02-03 15:42:53 +02:00
ieee1394 ieee1394: sbp2: fix bogus s/g access change 2008-02-02 13:48:16 +01:00
infiniband IB/mthca: Fix and simplify page size calculation in mthca_reg_phys_mr() 2008-02-04 20:20:42 -08:00
input drivers/input/: Spelling fixes 2008-02-03 17:15:20 +02:00
isdn drivers/isdn/: Spelling fixes 2008-02-03 17:16:28 +02:00
leds
lguest virtio: reset function 2008-02-04 23:50:03 +11:00
macintosh Merge git://git.kernel.org/pub/scm/linux/kernel/git/bunk/trivial 2008-02-04 07:58:52 -08:00
mca
md
media drivers/media/: Spelling fixes 2008-02-03 17:18:59 +02:00
message drivers/message/: Spelling fixes 2008-02-03 17:21:01 +02:00
mfd [ARM] Fix class_device damage caused by 0c55445f20 2008-01-28 10:59:09 +00:00
misc
mmc Merge branch 'blk-end-request' of git://git.kernel.dk/linux-2.6-block 2008-01-29 08:51:32 +11:00
mtd drivers/mtd/: Spelling fixes 2008-02-03 17:22:34 +02:00
net mlx4_core: Fix more section mismatches 2008-02-04 20:20:41 -08:00
nubus drivers/nubus/: Spelling fixes 2008-02-03 17:23:36 +02:00
of
oprofile
parisc drivers/parisc/: Spelling fixes 2008-02-03 17:24:37 +02:00
parport Spelling fixes: lenght->length 2008-02-03 15:42:53 +02:00
pci PCI: fix 4x section mismatch warnings 2008-02-02 15:08:04 -08:00
pcmcia Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm 2008-02-04 15:29:53 -08:00
pnp git-x86: drivers/pnp/pnpbios/bioscalls.c build fix 2008-01-30 13:32:31 +01:00
power apm_power: check I.intval for zero value, we use it as the divisor 2008-02-02 02:44:34 +03:00
ps3
rapidio Merge branch 'linux-2.6' 2008-01-31 11:25:51 +11:00
rtc Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 2008-01-29 08:52:50 +11:00
s390 [SCSI] zfcp: fix sense_buffer access bug 2008-01-30 13:03:39 -06:00
sbus
scsi Merge git://git.kernel.org/pub/scm/linux/kernel/git/bunk/trivial 2008-02-04 07:58:52 -08:00
serial Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm 2008-02-04 15:29:53 -08:00
sh
sn
spi Spelling fixes: lenght->length 2008-02-03 15:42:53 +02:00
ssb drivers/ssb/: Spelling fixes 2008-02-03 17:30:25 +02:00
tc
telephony
uio
usb Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6 2008-02-02 14:29:33 +11:00
video drivers/video/: Spelling fixes 2008-02-03 17:31:49 +02:00
virtio virtio: balloon driver 2008-02-04 23:50:13 +11:00
w1 i2c: normal_i2c can be made const (remaining drivers) 2008-01-27 18:14:47 +01:00
watchdog drivers/watchdog/: Spelling fixes 2008-02-03 17:32:52 +02:00
xen
zorro
Kconfig virtio: Put the virtio under the virtualization menu 2008-02-04 23:50:05 +11:00
Makefile Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus 2008-01-31 09:35:32 +11:00