Thread (9 messages) 9 messages, 2 authors, 2014-12-25

Re: algif_hash: splice of data > 2**16

From: Stephan Mueller <hidden>
Date: 2014-12-24 09:03:24
Also in: lkml

Am Dienstag, 23. Dezember 2014, 18:16:01 schrieb leroy christophe:

Hi leroy,
Le 20/12/2014 07:37, Stephan Mueller a écrit :
quoted
Am Donnerstag, 18. Dezember 2014, 13:22:20 schrieb leroy christophe:

Hi Christophe,
quoted
Le 18/12/2014 13:15, Stephan Mueller a écrit :
quoted
Hi Herbert,

While testing the vmsplice/splice interface of algif_hash I was made
aware of the problem that data blobs larger than 16 pages do not seem to
be hashed properly.

For testing, a file is mmap()ed and handed to vmsplice / splice. If the
file is smaller than 2**16, the interface returns the proper hash.
However, when the file is larger, only the first 2**16 bytes seem to be
used.

When adding printk's to hash_sendpage, I see that this function is
invoked exactly 16 times where the first 15 invocations have the
MSG_MORE flag set and the last invocation does not have MSG_MORE.
Hi Stephan,

I have already noticed the same issue and proposed a patch, but I never
got any feedback and it has never been merged, allthought I pinged it a
few times.

See https://lkml.org/lkml/2014/4/18/276
After testing, this patch does not work for me. The operation still stops
after 16 pages.
Yes, it looks like the function I fixed is exclusively used by
sendfile() system call.
So there is probably the same kind of fix to be done in another function.
I do not believe that is the case. IMHO the blocking issue is found in the 
following code:

splice_from_pipe_feed walks the pipe->nrbufs. And vmsplice_to_pipe defines the 
maximum number of nrbufs as PIPE_DEF_BUFFERS -- which is 16. As subsequent 
functions allocate memory based on PIPE_DEF_BUFFERS, there is no trivial way 
to increase the number of pages to be processed.

Thus I see that the vmsplice/splice combo can at most operate on a chunk of 16 
pages. Thus, you have to segment your input buffer into chunks of that size 
and invoke the vmsplice/splice syscalls for each segment.

-- 
Ciao
Stephan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help