* Added a few KDL commands to improve your debugging experience.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35469 a95241bf-73f2-0310-859d-f6bbb57e9c96
would get us is that the allocations could fail when they wouldn't need to.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35242 a95241bf-73f2-0310-859d-f6bbb57e9c96
* Implemented a more elaborated raw memory allocation backend (MemoryManager).
We allocate 8 MB areas whose pages we allocate and map when needed. An area is
divided into equally-sized chunks which form the basic units of allocation. We
have areas with three possible chunk sizes (small, medium, large), which is
basically what the ObjectCache implementations were using anyway.
* Added "uint32 flags" parameter to several of the slab allocator's object
cache and object depot functions. E.g. object_depot_store() potentially wants
to allocate memory for a magazine. But also in pure freeing functions it
might eventually become useful to have those flags, since they could end up
deleting an area, which might not be allowable in all situations. We should
introduce specific flags to indicate that.
* Reworked the block allocator. Since the MemoryManager allocates block-aligned
areas, maintains a hash table for lookup, and maps chunks to object caches,
we can quickly find out which object cache a to be freed allocation belongs
to and thus don't need the boundary tags anymore.
* Reworked the slab boot strap process. We allocate from the initial area only
when really necessary, i.e. when the object cache for the respective
allocation size has not been created yet. A single page is thus sufficient.
other:
* vm_allocate_early(): Added boolean "blockAlign" parameter. If true, the
semantics is the same as for B_ANY_KERNEL_BLOCK_ADDRESS.
* Use an object cache for page mappings. This significantly reduces the
contention on the heap bin locks.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35232 a95241bf-73f2-0310-859d-f6bbb57e9c96
idea. Splitting large buffers no longer causes KDL.
* merge_buffer() now maintains the size of the source buffer while removing its
nodes.
* The paranoia checks run through again now.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35073 a95241bf-73f2-0310-859d-f6bbb57e9c96
* Added new ENABLE_DEBUGGER_COMMANDS that enables the new "net_buffer" KDL
command to dump a net buffer.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33893 a95241bf-73f2-0310-859d-f6bbb57e9c96
Lukasz!
* It makes split_buffer() more efficient by avoiding making a copy of the
original buffer.
* Minor cleanup, and coding style changes by myself.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31007 a95241bf-73f2-0310-859d-f6bbb57e9c96
module to the stack module. There's a dedicated struct
ancillary_data_container, now. One can just set the container on a
net_buffer.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25292 a95241bf-73f2-0310-859d-f6bbb57e9c96
* Added data_node::flags field and currently only flag
DATA_NODE_READ_ONLY, indicating that the node is read-only (i.e.
a clone). If set, the node won't have any header or tail space. Not
being able to write to it is not yet enforced, though.
* Moved data_node::tail_space to data_header.
* Removed data_node:used_header_space/own_header_space.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25275 a95241bf-73f2-0310-859d-f6bbb57e9c96
although it put the freed space in the free list. Alternating
invocations of alloc_...() and free_...() would thus increase the
header space unboundedly.
* Unified the way a data_header and data_node access the header space.
Originally data_header::data_space and data_node::header_space had to
be kept in sync, which some functions failed to do. Introduced a
header_space structure, which is located in data_header and referenced
by data_node, so that accessing it either way does always keep both
structures in sync.
* Removed the special handling for the data node created with a buffer.
Since remove_{header,trailer}() and trim() could remove it without
knowing, the last reference to the first data header would be freed
prematurely, causing operations on freed memory, and in the end a
second free which screwed the object cache's free list. This crashed
Haiku e.g. when running OpenSSH's "forwarding" test. Now the first
created node is just a node like any other. It's allocated in the data
header, too.
* Changed the mechanism how data nodes are allocated. Now they will
always be allocated on a header associated with the buffer for which
they are created. This fixes a race condition when freeing them. They
would otherwise modify the free list of a header which might be
accessed by another thread at the same time (added a TODO explaining
how the old code could possibly be fixed). Also squashed several
TODOs related to running out of header space when allocating a node.
If the buffer runs out of header space, it will simply allocate a new
header, now.
* Dealt with some TODOs regarding reverting the buffer to its previous
state when running out of memory after allocating a few nodes.
* Added several TODOs.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25256 a95241bf-73f2-0310-859d-f6bbb57e9c96
* cache paranoia was always enabled.
* Changed from paranoia on/off to levels. Adjusted the macros to take a
level argument.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25215 a95241bf-73f2-0310-859d-f6bbb57e9c96
check that is remains the sum of its data node used sizes.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25195 a95241bf-73f2-0310-859d-f6bbb57e9c96
reference to a newly created header. It would thus not be deleted when
the new node (which also has a reference) was removed again.
* Added debugger command "net_buffer_stats" which prints the allocation
counts of net buffers and data headers.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25118 a95241bf-73f2-0310-859d-f6bbb57e9c96
implementation ATM, since it malloc()s the required memory.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24940 a95241bf-73f2-0310-859d-f6bbb57e9c96
potential data corruption. This fixes bug #1388.
* get_node_at_offset() would return a node too early in the list if the offset
fell on a node boundary - didn't cause any actual harm, though.
* append_size(): renamed variable tailSpace to previousTailSpace to make
it clearer.
* Improved debug output for duplicate_buffer() and clone_buffer().
* Debug output is now prepended by the thread ID.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23268 a95241bf-73f2-0310-859d-f6bbb57e9c96
indirectly by the stack - they are now again usable separately as well.
* Minor cleanup.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22673 a95241bf-73f2-0310-859d-f6bbb57e9c96
- introduced base NetBufferFieldReader which deals with obtaining a continuguous field to deal with.
- renamed Detach() to Sync() to better express the fact that we may be writing to the buffer.
- Fixed IPv4's and ICMP's checksum calculation as it assumed the underlying header was contiguous.
- ICMP is now able to reply to ICMP Echo Requests which were split across data nodes.
- in split_buffer(), make sure we were able to trim() the new buffer before damaging the original one.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20657 a95241bf-73f2-0310-859d-f6bbb57e9c96
data_header::first_node to that node. It will also remove some of the
burden of the callers with regard to setting its members correctly.
* Minor cleanup.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20651 a95241bf-73f2-0310-859d-f6bbb57e9c96
- don't try to remove spawned sockets from Endpoints hashtable.
- return B_WOULD_BLOCK (EAGAIN) when we time out in acquire_sem().
- use B_RELEASE_IF_WAITING_ONLY in the TCP WaitList.
- fixed a off by one issue in ReadData() which could result in more than needed iterations (and waiting).
- implemented prepending new buffers to a net_buffer.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20639 a95241bf-73f2-0310-859d-f6bbb57e9c96
* sockaddr_storage::ss_len is max 255, but the structure itself is shorter; we must
not copy ss_len bytes without checking the length first (duplicate & clone were affected).
* count_iovecs() & get_iovecs() both did not work with empty buffers that don't
have any nodes at all (unlikely case, but should be supported).
* the net_buffer::offset union field was not copied in clone & duplicate.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19555 a95241bf-73f2-0310-859d-f6bbb57e9c96
* No need to set data_node::header in the loop - this is already done in add_data_node().
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19408 a95241bf-73f2-0310-859d-f6bbb57e9c96
the initial buffer wasn't empty.
* Enlarged the minimum header size a bit (one more data_node).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19406 a95241bf-73f2-0310-859d-f6bbb57e9c96
so that the buffer could be smaller than the one requested.
* Rewrote data_node management in the header; now, every data_node knows where it's
placed, and can be actually discarded as needed.
* Rewrote free space management in the header: there is now a free chunk list, so
that all memory can be reused (it's currently only used for data_nodes anyway).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19382 a95241bf-73f2-0310-859d-f6bbb57e9c96
if it won't be added anymore.
* Small fix for set_timer(): now set the timer->due field back to 0 when a
timer is removed - this prevented a timer from being correctly readded later
(possible crash)!
* net_buffer's append_cloned_data() now does some more checks to prevent unnecessary
work and detect wrong arguments.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19375 a95241bf-73f2-0310-859d-f6bbb57e9c96
by the TCP implementation for its reorder and retransmit queues.
* The ipv4_fragment is no longer needed, as we can use the above field there
as well - this saves one extra allocation per received fragment.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19369 a95241bf-73f2-0310-859d-f6bbb57e9c96
but it also didn't create valid buffers in a number of cases:
* remove_header() did not work correctly if more than one node had to be
removed or came after the first node to be kept.
* prepend_size() did not update the offset of the following nodes.
* write_data() and read_data() both did not update the data pointer, and thus
always copied the same data to every node.
* merge_buffer() inserted the nodes in the wrong order when prepending a buffer.
* added a dump_buffer() function and lots of additional debug output (currently
commented out)
* simplified split_buffer() a bit more.
* implemented remove_trailer().
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19068 a95241bf-73f2-0310-859d-f6bbb57e9c96
slab allocator we'll have one day), I don't feel like digging in an fixing its
bugs.
IOW local pings won't crash the kernel anymore, are no longer detected as
duplicates, and loopback does work now as well.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19066 a95241bf-73f2-0310-859d-f6bbb57e9c96