Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 May 2013 07:30:20 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Luigi Rizzo <rizzo@iet.unipi.it>
Cc:        current@freebsd.org
Subject:   Re: copyin+copyout in one step ?
Message-ID:  <20130528043020.GK3047@kib.kiev.ua>
In-Reply-To: <20130527233801.GA32042@onelab2.iet.unipi.it>
References:  <20130527233801.GA32042@onelab2.iet.unipi.it>

next in thread | previous in thread | raw e-mail | index | archive | help

--r8byAqrdRIFBlIsc
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, May 28, 2013 at 01:38:01AM +0200, Luigi Rizzo wrote:
> Hi,
> say a process P1 wants to use the kernel to copy the content of a
> buffer SRC (in its user address space) to a buffer DST (in the
> address space of another process P2), and assume that P1 issues the
> request to the kernel when P2 has already told the kernel where the
> data should go:
>=20
>          P1                        P2
>         +------+                 +--------+
>         | SRC  |                 | DST    |
>         +--v---+                 +--^-----+
>    --------|------------------------|----------
>            |                        |    kernel
>            |                        ^
>=20
>            |                        |
>            |      +--------+        |
>            +----->| tmpbuf +--------+
>             copyin|        | copyout
>             P1 ctx+--------+  P2 ctx
>=20
> I guess the one above is the canonical way: P1 does a copyin() to a
> temporary buffer, then notifies P2 which can then issue or complete
> a syscall to do a copyout from tmpbuf to DST in P2's context.
>=20
>=20
> But I wonder, is it possible to do it as follows: P2 tells the kernel
> where the data should go (DST); later, P1 issues a system call and
> through a combined "copyinout()" moves data directly from SRC to DST,
> operating in the context of P1.
>=20
>            |      copyinout() ?     |=20
>            +------------>-----------+
>                    issued by P1
>=20
>=20
> Is this doable at all ? I suspect that "tell DST to the kernel"
> might be especially expensive as it needs to pin the page
> so it is accessible while doing the syscall for P1 ?
> (the whole point for this optimization is saving the extra
> copy through the buffer, but it may be pointless if pinning
> the memory is more expensive than the copy)

Yes, it is doable.  If the copy can happen when either P1 or P2 are
active context, then proc_rwmem() already perform exactly what you
want.  The virtual address in the address space of the 'other process'
is specified as uio->uio_offset.  The iov specifies the region(s) for
the current process.

If you want to perform the copy from P1 to P2 while some other context
P3 is active, the same structure as proc_rwmem() would work, but you=20
obviously would need to do vm_fault_hold() for both sides, and use
pmap_copy_pages() instead of uiomove_fromphys().

In either case, you get copy without temporal buffer, but the setup cost
could be non-trivial. You never know until measured.

--r8byAqrdRIFBlIsc
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.20 (FreeBSD)

iQIcBAEBAgAGBQJRpDLbAAoJEJDCuSvBvK1BicIP/1HZ6RCNYOptpCPACQSbbmlS
ZxI5JNperAKY9c1eTaAH1FhaSAfdXs47NCf1Lf+vfZTo6eSUEvbP0GAfPEMCI1r5
QVlGZVbShP626DwnrEfmaAuv9Es8vANOm259Coi/3G5LN/NxurHs+1RgLvHu48tD
j0dZnfsWmlvwR0XEjPQPn4SZXfUr5Poj0ezf9s8Vz4foA2RJSA3RZo79HwYFSBbp
ppM0gJzGMYa/XQtiSfxwa1M13GCnwJ9H4oUJCgQ+fnO6GWJS/jJbDezhi+Ec3A1O
6VfmIL58v19PmqPsH/k0hMvLXOZeqPDfuhf7ClmSjXOLSB4EVVojf1bd1JkM3v5R
65UuGne2C/0FfWwbznkL4ut8DavF3oZO9K+Lc3X6z7303E1Iq9fMn2beB9IevWpC
bWh6ggFLcS3KFbb+T1dSNLwJhJbE0H8eOWMWyZ6mh/w00iQdHVDklywhBigfKTv2
o71ODhpvFVgzB0DmVDmLovyXM/xlZCNZq28a49kYzCJKAH8j7IQjL+PQ6eX3SjgR
yyxjxpQNjMUAtJR8VR+t4EcVCx710OKQ44c6tavseNox8w8Kvn6Xxu00kX+UJSHS
R3l0awZbI6WLnd5XH5ONdsMRiut2zigkOUubKv1daSG6ISnY0IDO44vK71litOnq
9m8cn8ntoFMEmJzPNWJq
=Jz0x
-----END PGP SIGNATURE-----

--r8byAqrdRIFBlIsc--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130528043020.GK3047>