Revision 399f1e30ac17b77d383444aff480c7390f5adf2a authored by Ira W. Snyder on 30 September 2010, 22:15:27 UTC, committed by Linus Torvalds on 01 October 2010, 17:50:58 UTC
The kfifo_dma family of functions use sg_mark_end() on the last element in
their scatterlist.  This forces use of a fresh scatterlist for each DMA
operation, which makes recycling a single scatterlist impossible.

Change the behavior of the kfifo_dma functions to match the usage of the
dma_map_sg function.  This means that users must respect the returned
nents value.  The sample code is updated to reflect the change.

This bug is trivial to cause: call kfifo_dma_in_prepare() such that it
prepares a scatterlist with a single entry comprising the whole fifo.
This is the case when you map the entirety of a newly created empty fifo.
This causes the setup_sgl() function to mark the first scatterlist entry
as the end of the chain, no matter what comes after it.

Afterwards, add and remove some data from the fifo such that another call
to kfifo_dma_in_prepare() will create two scatterlist entries.  It returns
nents=2.  However, due to the previous sg_mark_end() call, sg_is_last()
will now return true for the first scatterlist element.  This causes the
sample code to print a single scatterlist element when it should print
two.

By removing the call to sg_mark_end(), we make the API as similar as
possible to the DMA mapping API.  All users are required to respect the
returned nents.

Signed-off-by: Ira W. Snyder <iws@ovro.caltech.edu>
Cc: Stefani Seibold <stefani@seibold.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 87400e5
History
File Mode Size
lzo
raid6
reed_solomon
zlib_deflate
zlib_inflate
.gitignore -rw-r--r-- 51 bytes
Kconfig -rw-r--r-- 4.1 KB
Kconfig.debug -rw-r--r-- 39.7 KB
Kconfig.kgdb -rw-r--r-- 2.3 KB
Kconfig.kmemcheck -rw-r--r-- 2.9 KB
Makefile -rw-r--r-- 3.6 KB
argv_split.c -rw-r--r-- 1.8 KB
atomic64.c -rw-r--r-- 4.1 KB
atomic64_test.c -rw-r--r-- 3.5 KB
audit.c -rw-r--r-- 1.2 KB
bcd.c -rw-r--r-- 257 bytes
bitmap.c -rw-r--r-- 32.6 KB
bitrev.c -rw-r--r-- 2.1 KB
btree.c -rw-r--r-- 19.2 KB
bug.c -rw-r--r-- 4.7 KB
bust_spinlocks.c -rw-r--r-- 636 bytes
check_signature.c -rw-r--r-- 599 bytes
checksum.c -rw-r--r-- 4.9 KB
cmdline.c -rw-r--r-- 3.6 KB
cpu-notifier-error-inject.c -rw-r--r-- 1.5 KB
cpumask.c -rw-r--r-- 4.6 KB
crc-ccitt.c -rw-r--r-- 3.0 KB
crc-itu-t.c -rw-r--r-- 2.8 KB
crc-t10dif.c -rw-r--r-- 2.9 KB
crc16.c -rw-r--r-- 2.8 KB
crc32.c -rw-r--r-- 14.5 KB
crc32defs.h -rw-r--r-- 1.0 KB
crc7.c -rw-r--r-- 2.3 KB
ctype.c -rw-r--r-- 1.3 KB
debug_locks.c -rw-r--r-- 1.1 KB
debugobjects.c -rw-r--r-- 25.2 KB
dec_and_lock.c -rw-r--r-- 782 bytes
decompress.c -rw-r--r-- 1.2 KB
decompress_bunzip2.c -rw-r--r-- 23.5 KB
decompress_inflate.c -rw-r--r-- 3.6 KB
decompress_unlzma.c -rw-r--r-- 15.5 KB
decompress_unlzo.c -rw-r--r-- 4.9 KB
devres.c -rw-r--r-- 7.7 KB
div64.c -rw-r--r-- 2.3 KB
dma-debug.c -rw-r--r-- 31.5 KB
dump_stack.c -rw-r--r-- 290 bytes
dynamic_debug.c -rw-r--r-- 18.0 KB
extable.c -rw-r--r-- 2.4 KB
fault-inject.c -rw-r--r-- 7.9 KB
find_last_bit.c -rw-r--r-- 1.1 KB
find_next_bit.c -rw-r--r-- 6.4 KB
flex_array.c -rw-r--r-- 9.8 KB
gcd.c -rw-r--r-- 291 bytes
gen_crc32table.c -rw-r--r-- 2.2 KB
genalloc.c -rw-r--r-- 5.1 KB
halfmd4.c -rw-r--r-- 2.0 KB
hexdump.c -rw-r--r-- 6.5 KB
hweight.c -rw-r--r-- 1.9 KB
idr.c -rw-r--r-- 21.5 KB
inflate.c -rw-r--r-- 38.6 KB
int_sqrt.c -rw-r--r-- 533 bytes
iomap.c -rw-r--r-- 7.4 KB
iomap_copy.c -rw-r--r-- 2.1 KB
iommu-helper.c -rw-r--r-- 1006 bytes
ioremap.c -rw-r--r-- 2.1 KB
irq_regs.c -rw-r--r-- 578 bytes
is_single_threaded.c -rw-r--r-- 1.3 KB
kasprintf.c -rw-r--r-- 704 bytes
kernel_lock.c -rw-r--r-- 3.2 KB
klist.c -rw-r--r-- 9.3 KB
kobject.c -rw-r--r-- 23.3 KB
kobject_uevent.c -rw-r--r-- 10.3 KB
kref.c -rw-r--r-- 1.6 KB
lcm.c -rw-r--r-- 265 bytes
libcrc32c.c -rw-r--r-- 2.1 KB
list_debug.c -rw-r--r-- 1.7 KB
list_sort.c -rw-r--r-- 5.3 KB
locking-selftest-hardirq.h -rw-r--r-- 207 bytes
locking-selftest-mutex.h -rw-r--r-- 120 bytes
locking-selftest-rlock-hardirq.h -rw-r--r-- 74 bytes
locking-selftest-rlock-softirq.h -rw-r--r-- 74 bytes
locking-selftest-rlock.h -rw-r--r-- 158 bytes
locking-selftest-rsem.h -rw-r--r-- 163 bytes
locking-selftest-softirq.h -rw-r--r-- 207 bytes
locking-selftest-spin-hardirq.h -rw-r--r-- 73 bytes
locking-selftest-spin-softirq.h -rw-r--r-- 73 bytes
locking-selftest-spin.h -rw-r--r-- 118 bytes
locking-selftest-wlock-hardirq.h -rw-r--r-- 74 bytes
locking-selftest-wlock-softirq.h -rw-r--r-- 74 bytes
locking-selftest-wlock.h -rw-r--r-- 158 bytes
locking-selftest-wsem.h -rw-r--r-- 163 bytes
locking-selftest.c -rw-r--r-- 28.6 KB
lru_cache.c -rw-r--r-- 14.6 KB
nlattr.c -rw-r--r-- 12.2 KB
parser.c -rw-r--r-- 6.1 KB
percpu_counter.c -rw-r--r-- 3.7 KB
plist.c -rw-r--r-- 2.9 KB
prio_heap.c -rw-r--r-- 1.4 KB
prio_tree.c -rw-r--r-- 12.2 KB
proportions.c -rw-r--r-- 9.3 KB
radix-tree.c -rw-r--r-- 35.9 KB
random32.c -rw-r--r-- 3.9 KB
ratelimit.c -rw-r--r-- 1.5 KB
rational.c -rw-r--r-- 1.5 KB
rbtree.c -rw-r--r-- 9.9 KB
reciprocal_div.c -rw-r--r-- 159 bytes
rwsem-spinlock.c -rw-r--r-- 6.9 KB
rwsem.c -rw-r--r-- 8.1 KB
scatterlist.c -rw-r--r-- 12.8 KB
sha1.c -rw-r--r-- 2.4 KB
show_mem.c -rw-r--r-- 1.3 KB
smp_processor_id.c -rw-r--r-- 1.1 KB
sort.c -rw-r--r-- 2.5 KB
spinlock_debug.c -rw-r--r-- 6.9 KB
string.c -rw-r--r-- 14.3 KB
string_helpers.c -rw-r--r-- 1.7 KB
swiotlb.c -rw-r--r-- 25.4 KB
syscall.c -rw-r--r-- 2.4 KB
textsearch.c -rw-r--r-- 9.6 KB
ts_bm.c -rw-r--r-- 5.3 KB
ts_fsm.c -rw-r--r-- 10.6 KB
ts_kmp.c -rw-r--r-- 4.3 KB
uuid.c -rw-r--r-- 1.4 KB
vsprintf.c -rw-r--r-- 50.2 KB

back to top