Commit Graph
19 Commits
Author SHA1 Message Date
Lucas ManningandgVisor bot 31c7a6281e Automated rollback of changelist 538230394
PiperOrigin-RevId: 540671483
2023-06-15 13:21:26 -07:00
Lucas ManningandgVisor bot 4f0dc3b1a3 Change Buffer.PullUp so that it returns views that are not shared.
The underlying chunks returned from PullUp should not be shared,
since the underlying slice can sometimes be directly modified. This change
also reworks some of the network parsing code so that ownership of
views is more explicit to the reader.

PiperOrigin-RevId: 538230394
2023-06-06 10:51:15 -07:00
Kevin KrakauerandgVisor bot 4d013c2a59 netstack: speed up merge
Merge clears the other buffer, so rather than cloning and dealing with
refcounts, we can just steal other's view list and adjust sizes.

This increases the speed of Merge 10x, and this was with a benchmark that
didn't do any TrimFront/Truncate (which will induce copying in the old
implementation).

BenchmarkMerge
BenchmarkMerge-33               99412884                12.74 ns/op            0 B/op          0 allocs/op
BenchmarkOldMerge
BenchmarkOldMerge-33             6075222               217.4 ns/op             0 B/op          0 allocs/op

This change uncovered that PacketBuffer.DeepCopyForForwarding wasn't doing a
true deep copy. It seems that, in the ICMP error path, a call to Merge was
forcing a deep copy (maybe because Append was copying bytes), obfuscating the
issue. This change also addresses that issue by having DeepCopyForForwarding
produce a copy that shares no data with other packets.

PiperOrigin-RevId: 537143838
2023-06-01 15:25:28 -07:00
Kevin KrakauerandgVisor bot 54a79b380d rename bufferv2 to buffer
The old buffer has been dead for a while. We use type aliases so we can switch
package names in smaller CLs.

PiperOrigin-RevId: 537125110
2023-06-01 14:16:05 -07:00
Lucas ManningandgVisor bot e31ea0f832 Remove the old version of buffer.
This is no longer used anywhere in gVisor. Everything has been migrated to
bufferv2.

PiperOrigin-RevId: 474655746
2022-09-15 14:21:12 -07:00
Lucas ManningandgVisor bot c8207270b3 Remove VectorisedView everywhere.
PiperOrigin-RevId: 453471156
2022-06-07 10:36:23 -07:00
Lucas ManningandgVisor bot 44f609c3c5 Automated rollback of changelist 446102766
PiperOrigin-RevId: 450557769
2022-05-23 17:06:44 -07:00
Lucas ManningandgVisor bot 204906fe68 Convert fdbased link endpoints to use pkg/buffer instead of VectorizedViews.
PiperOrigin-RevId: 447073885
2022-05-06 14:42:53 -07:00
Bhasker HariharanandgVisor bot 2e2afa5a38 Fix buffer aliasing issue when Merging views.
PiperOrigin-RevId: 427662565
2022-02-09 23:00:56 -08:00
Lucas ManningandgVisor bot 919a207b39 Update PacketBuffer to hold a Buffer struct instead of a Buffer pointer.
The extra pointer indirection is not necessary and allows for a nil buffer.
This change bumps the PacketBuffer struct size from 296 to 792 bytes.

PiperOrigin-RevId: 422669812
2022-01-18 16:06:43 -08:00
Ayush RanjanandgVisor bot 469a4a5203 Prevent PacketData from being modified.
PacketData should not be modified and should be treated readonly because it
represents packet payload. The old DeleteFront method allowed callers to modify
the underlying buffer which should not be allowed.

Added a way to consume from the PacketData instead of deleting from it.
Updated call points to use that instead.

Reported-by: [email protected]
PiperOrigin-RevId: 399268473
2021-09-27 13:35:22 -07:00
Ayush RanjanandgVisor bot 037b2f40c2 [op] Make PacketBuffer Clone() do a deeper copy.
Earlier PacketBuffer.Clone() would do a shallow top level copy of the packet
buffer - which involved sharing the *buffer.Buffer between packets. Reading
or writing to the buffer in one packet would impact the other.

This caused modifications in one packet to affect the other's pkt.Views() which
is not desired. Change the clone to do a deeper copy of the underlying buffer
list and buffer pointers. The payload buffers (which are immutable) are still
shared. This change makes the Clone() operation more expensive as we now need to
allocate the entire buffer list.

Added unit test to test integrity of packet data after cloning.

Reported-by: [email protected]
Reported-by: [email protected]
Reported-by: [email protected]
PiperOrigin-RevId: 390277713
2021-08-11 20:18:19 -07:00
Ting-Yu WangandgVisor bot f864ec0b6d pkg/buffer: Remove dependency to safemem, code no longer used
PiperOrigin-RevId: 373846881
2021-05-14 12:53:29 -07:00
Ting-Yu WangandgVisor bot c28f6a4d33 Migrate PacketBuffer to use pkg/buffer
Benchmark iperf3:
                    Before      After
native->runsc       5.14        5.01    (Gbps)
runsc->native       4.15        4.07    (Gbps)

It did introduce overhead, mainly at the bridge between pkg/buffer and
VectorisedView, the ExtractVV method. Once endpoints start migrating away from
VV, this overhead will be gone.

Updates #2404

PiperOrigin-RevId: 373651666
2021-05-13 13:56:16 -07:00
Ting-Yu WangandgVisor bot e2ae518cd4 pkg/buffer: Reorganize internal structure to allow dynamic sizes.
This change changes `buffer.data` into a `[]byte`, from `[bufferSize]byte`.
In exchange, each `buffer` is now grouped together to reduce the number of
allocation. Plus, `View` now holds an embeded list of `buffer` (via `pool`) to
support the happy path which the number of buffer is small. Expect no extra
allocation for the happy path.

It is to enable the use case for PacketBuffer, which
* each `View` is small (way less than `defaultBufferSize`), and
* needs to dynamically transfer ownership of `[]byte` to `View`.
  (to allow gradual migration)

PiperOrigin-RevId: 333197252
2020-09-22 17:56:40 -07:00
Dean DengandgVisor bot 58df3ae7ca Fix vfs2 pipe behavior when splicing to a non-pipe.
Fixes *.sh Java runtime tests, where splice()-ing from a pipe to /dev/zero
would not actually empty the pipe.

There was no guarantee that the data would actually be consumed on a splice
operation unless the output file's implementation of Write/PWrite actually
called VFSPipeFD.CopyIn. Now, whatever bytes are "written" are consumed
regardless of whether CopyIn is called or not.

Furthermore, the number of bytes in the IOSequence for reads is now capped at
the amount of data actually available. Before, splicing to /dev/zero would
always return the requested splice size without taking the actual available
data into account.

This change also refactors the case where an input file is spliced into an
output pipe so that it follows a similar pattern, which is arguably cleaner
anyway.

Updates #3576.

PiperOrigin-RevId: 328843954
2020-08-27 16:57:40 -07:00
Jamie LiuandgVisor bot cbb472afc2 Implement splice(2) and tee(2) for VFS2.
Updates #138

PiperOrigin-RevId: 313326354
2020-05-26 21:43:26 -07:00
Adin ScannellandgVisor bot 7a3b606ae7 Clean-up buffer implementation.
This also adds substantial test cases.

The Read/Write interfaces are dropped as they are not necessary.

PiperOrigin-RevId: 300461547
2020-03-11 19:52:14 -07:00
Adin ScannellandgVisor bot 2bc4702e30 Make pipe buffer implementation standard.
A follow-up change will convert the networking code to use this standard
pipe implementation.

PiperOrigin-RevId: 297903206
2020-02-28 12:29:23 -08:00