* algif_hash: splice of data > 2**16
@ 2014-12-18 12:15 Stephan Mueller
2014-12-18 12:22 ` leroy christophe
0 siblings, 1 reply; 9+ messages in thread
From: Stephan Mueller @ 2014-12-18 12:15 UTC (permalink / raw)
To: Herbert Xu; +Cc: linux-crypto, 'LKML'
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.
To invoke the vmsplice/splice interface, I use my current implementation
of libkcapi available at [1]. That library uses the following calls:
vmsplice(handle->pipes[1], iov, iovlen, SPLICE_F_GIFT);
splice(handle->pipes[0], NULL, handle->opfd, NULL, inlen, 0);
read(handle->opfd, out, outlen);
The return code of splice() is always 65536 irrespectively of the
following variations:
- have one iovec pointing to the entire buffer of the mmap()ed file
- have multiple iovecs with all pointing to at most 2**16 bytes
- invoke splice/read multiple times with at most 2**16 bytes
My guess of the problem is that the maximum buffer size for the pipe is
16 pages. These 16 pages are filled with the repeated invocation of
hash_sendpage.
Is there a specific way of how the splice interface is to be called so
that the pages are released? Or is there a need to change hash_sendpage
such that after the af_alg_wait_for_completion call, some form of
"releasing/putting" of the used page needs to be added?
Note, hashing the large mmap()ed file with one iovec using the sendmsg()
interface works flawlessly.
[1] http://www.chronox.de/libkcapi.html
Thanks
Stephan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: algif_hash: splice of data > 2**16
2014-12-18 12:15 algif_hash: splice of data > 2**16 Stephan Mueller
@ 2014-12-18 12:22 ` leroy christophe
2014-12-18 12:37 ` Stephan Mueller
2014-12-20 6:37 ` Stephan Mueller
0 siblings, 2 replies; 9+ messages in thread
From: leroy christophe @ 2014-12-18 12:22 UTC (permalink / raw)
To: Stephan Mueller, Herbert Xu; +Cc: linux-crypto, 'LKML'
Le 18/12/2014 13:15, Stephan Mueller a écrit :
> 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
Christophe
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: algif_hash: splice of data > 2**16
2014-12-18 12:22 ` leroy christophe
@ 2014-12-18 12:37 ` Stephan Mueller
2014-12-20 6:37 ` Stephan Mueller
1 sibling, 0 replies; 9+ messages in thread
From: Stephan Mueller @ 2014-12-18 12:37 UTC (permalink / raw)
To: leroy christophe, Herbert Xu; +Cc: linux-crypto, 'LKML'
Am Donnerstag, 18. Dezember 2014, 13:22:20 schrieb leroy christophe:
Hi Leroy, Herbert,
>Le 18/12/2014 13:15, Stephan Mueller a écrit :
>> 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
Thanks a lot for pointing to this patch.
Herbert, do you see a problem in this patch? If no, would it be possible
that you ping the VFS maintainer as I guess your word carries more
weight?
In any case, I will test that patch tonight.
Thanks
Stephan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: algif_hash: splice of data > 2**16
2014-12-18 12:22 ` leroy christophe
2014-12-18 12:37 ` Stephan Mueller
@ 2014-12-20 6:37 ` Stephan Mueller
2014-12-23 17:16 ` leroy christophe
1 sibling, 1 reply; 9+ messages in thread
From: Stephan Mueller @ 2014-12-20 6:37 UTC (permalink / raw)
To: leroy christophe; +Cc: Herbert Xu, linux-crypto, 'LKML'
Am Donnerstag, 18. Dezember 2014, 13:22:20 schrieb leroy christophe:
Hi Christophe,
> Le 18/12/2014 13:15, Stephan Mueller a écrit :
> > 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.
>
> Christophe
--
Ciao
Stephan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: algif_hash: splice of data > 2**16
2014-12-20 6:37 ` Stephan Mueller
@ 2014-12-23 17:16 ` leroy christophe
2014-12-24 9:03 ` Stephan Mueller
0 siblings, 1 reply; 9+ messages in thread
From: leroy christophe @ 2014-12-23 17:16 UTC (permalink / raw)
To: Stephan Mueller; +Cc: Herbert Xu, linux-crypto, 'LKML'
Le 20/12/2014 07:37, Stephan Mueller a écrit :
> Am Donnerstag, 18. Dezember 2014, 13:22:20 schrieb leroy christophe:
>
> Hi Christophe,
>
>> Le 18/12/2014 13:15, Stephan Mueller a écrit :
>>> 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.
Christophe
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: algif_hash: splice of data > 2**16
2014-12-23 17:16 ` leroy christophe
@ 2014-12-24 9:03 ` Stephan Mueller
2014-12-24 14:10 ` leroy christophe
0 siblings, 1 reply; 9+ messages in thread
From: Stephan Mueller @ 2014-12-24 9:03 UTC (permalink / raw)
To: leroy christophe; +Cc: Herbert Xu, linux-crypto, 'LKML'
Am Dienstag, 23. Dezember 2014, 18:16:01 schrieb leroy christophe:
Hi leroy,
> Le 20/12/2014 07:37, Stephan Mueller a écrit :
> > Am Donnerstag, 18. Dezember 2014, 13:22:20 schrieb leroy christophe:
> >
> > Hi Christophe,
> >
> >> Le 18/12/2014 13:15, Stephan Mueller a écrit :
> >>> 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
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: algif_hash: splice of data > 2**16
2014-12-24 9:03 ` Stephan Mueller
@ 2014-12-24 14:10 ` leroy christophe
2014-12-24 15:12 ` Stephan Mueller
0 siblings, 1 reply; 9+ messages in thread
From: leroy christophe @ 2014-12-24 14:10 UTC (permalink / raw)
To: Stephan Mueller; +Cc: Herbert Xu, linux-crypto, 'LKML'
Le 24/12/2014 10:03, Stephan Mueller a écrit :
> Am Dienstag, 23. Dezember 2014, 18:16:01 schrieb leroy christophe:
>
> Hi leroy,
>
>> Le 20/12/2014 07:37, Stephan Mueller a écrit :
>>> Am Donnerstag, 18. Dezember 2014, 13:22:20 schrieb leroy christophe:
>>>
>>> Hi Christophe,
>>>
>>>> Le 18/12/2014 13:15, Stephan Mueller a écrit :
>>>>> 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.
>
Yes your are probably right. There splice needs to be called with
SPLICE_F_MORE flag, hope that works.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: algif_hash: splice of data > 2**16
2014-12-24 14:10 ` leroy christophe
@ 2014-12-24 15:12 ` Stephan Mueller
2014-12-25 22:08 ` Stephan Mueller
0 siblings, 1 reply; 9+ messages in thread
From: Stephan Mueller @ 2014-12-24 15:12 UTC (permalink / raw)
To: leroy christophe; +Cc: Herbert Xu, linux-crypto, 'LKML'
Am Mittwoch, 24. Dezember 2014, 15:10:14 schrieb leroy christophe:
Hi leroy,
> Le 24/12/2014 10:03, Stephan Mueller a écrit :
> > Am Dienstag, 23. Dezember 2014, 18:16:01 schrieb leroy christophe:
> >
> > Hi leroy,
> >
> >> Le 20/12/2014 07:37, Stephan Mueller a écrit :
> >>> Am Donnerstag, 18. Dezember 2014, 13:22:20 schrieb leroy christophe:
> >>>
> >>> Hi Christophe,
> >>>
> >>>> Le 18/12/2014 13:15, Stephan Mueller a écrit :
> >>>>> 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.
>
> Yes your are probably right. There splice needs to be called with
> SPLICE_F_MORE flag, hope that works.
That is not the only one. Vmsplice works on a pipe. A pipe is backed by 16
pages max. Thus, you have to call vmsplice once per 16 pages. The current code
I am testing which seems to work is the following:
while (inlen) {
size_t datalen = (inlen > MAXLEN) ? MAXLEN : inlen;
iov.iov_len = datalen;
ret = _kcapi_common_vmsplice_data(handle, &iov, 1, datalen,
1);
if (0 > ret)
return ret;
processed += ret;
iov.iov_base = (void*)(uintptr_t)(in + processed);
inlen -= ret;
}
return _kcapi_common_read_data(handle, out, outlen);
--
Ciao
Stephan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: algif_hash: splice of data > 2**16
2014-12-24 15:12 ` Stephan Mueller
@ 2014-12-25 22:08 ` Stephan Mueller
0 siblings, 0 replies; 9+ messages in thread
From: Stephan Mueller @ 2014-12-25 22:08 UTC (permalink / raw)
To: leroy christophe; +Cc: Herbert Xu, linux-crypto, 'LKML'
Am Mittwoch, 24. Dezember 2014, 16:12:53 schrieb Stephan Mueller:
Hi Christophe,
> Am Mittwoch, 24. Dezember 2014, 15:10:14 schrieb leroy christophe:
>
> Hi leroy,
>
> > Le 24/12/2014 10:03, Stephan Mueller a écrit :
> > > Am Dienstag, 23. Dezember 2014, 18:16:01 schrieb leroy christophe:
> > >
> > > Hi leroy,
> > >
> > >> Le 20/12/2014 07:37, Stephan Mueller a écrit :
> > >>> Am Donnerstag, 18. Dezember 2014, 13:22:20 schrieb leroy christophe:
> > >>>
> > >>> Hi Christophe,
> > >>>
> > >>>> Le 18/12/2014 13:15, Stephan Mueller a écrit :
> > >>>>> 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.
> >
> > Yes your are probably right. There splice needs to be called with
> > SPLICE_F_MORE flag, hope that works.
>
> That is not the only one. Vmsplice works on a pipe. A pipe is backed by 16
> pages max. Thus, you have to call vmsplice once per 16 pages. The current
> code I am testing which seems to work is the following:
>
> while (inlen) {
> size_t datalen = (inlen > MAXLEN) ? MAXLEN : inlen;
>
> iov.iov_len = datalen;
> ret = _kcapi_common_vmsplice_data(handle, &iov, 1, datalen,
> 1);
> if (0 > ret)
> return ret;
> processed += ret;
> iov.iov_base = (void*)(uintptr_t)(in + processed);
> inlen -= ret;
> }
> return _kcapi_common_read_data(handle, out, outlen);
As I do not see an easy fix where a single vmsplice/splice syscall combo can
be applied to an input data stream of arbitrary length, I added appropriate
handling code in libkcapi version 0.6.2 [1].
This code follows the aforementioned approach to segment the input into 16
PAGE_SIZE segments and send them to the kernel individually.
[1] http://www.chronox.de/libkcapi.html
--
Ciao
Stephan
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2014-12-25 22:08 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-12-18 12:15 algif_hash: splice of data > 2**16 Stephan Mueller
2014-12-18 12:22 ` leroy christophe
2014-12-18 12:37 ` Stephan Mueller
2014-12-20 6:37 ` Stephan Mueller
2014-12-23 17:16 ` leroy christophe
2014-12-24 9:03 ` Stephan Mueller
2014-12-24 14:10 ` leroy christophe
2014-12-24 15:12 ` Stephan Mueller
2014-12-25 22:08 ` Stephan Mueller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox