Commit Graph
56 Commits
Author SHA1 Message Date
Axel Dörfler a3ec278add * Made some internal lists use DoublyLinkedLists instead of struct list.
* 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
2010-02-15 13:28:33 +00:00
Ingo Weinhold e54d40e826 There's no reason for allocating with CACHE_DONT_SLEEP. The only thing that
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
2010-01-22 20:01:26 +00:00
Ingo Weinhold 86c794e5c1 slab allocator:
* 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
2010-01-21 23:10:52 +00:00
Axel Dörfler 7108ab1ff9 * copy_meta_data() also copied the size of the buffer, which wasn't such a good
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
2010-01-14 16:35:41 +00:00
Axel Dörfler 41e2ba1437 * Added missing check after an allocation.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35054 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-01-13 17:19:14 +00:00
Axel Dörfler f4ee0103a2 * Replaced ENABLE_DEBUGGER_COMMANDS with ENABLE_STATS.
* 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
2009-11-05 11:40:33 +00:00
Michael Lotz baddb6942c Check for user buffers and properly use user_memcpy() in that case. Fixes #4770.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33564 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-10-13 00:13:08 +00:00
Axel Dörfler f8daaadc80 * Cleanup.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31008 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-11 08:48:40 +00:00
Axel Dörfler 09173f8089 * Applied a patch by Lukasz that already collected dust on my HD - sorry
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
2009-06-11 08:30:40 +00:00
Axel Dörfler 3093705388 * Minor cleanup.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29870 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-04-02 16:54:11 +00:00
Ingo Weinhold 49e00d1f99 Moved the container management for ancillary data from the net_buffer
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
2008-05-02 14:37:16 +00:00
Ingo Weinhold 4e6b38af6c Following Axel's suggestions:
* 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
2008-04-30 18:47:11 +00:00
Ingo Weinhold 0b69689a18 * Fixed free_data_header_space(). It would increase the header space
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
2008-04-29 19:49:43 +00:00
Rene Gollent e6fc462cb3 T2 needs to be defined if net_buffer tracing is disabled entirely.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25222 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-04-27 21:12:57 +00:00
Ingo Weinhold c96512dab1 Added tracing for net buffer data header references at tracing level 2.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25217 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-04-27 17:17:20 +00:00
Ingo Weinhold 2c88b9c82a Added kernel tracing for the interesting net buffer operations.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25216 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-04-27 16:34:23 +00:00
Ingo Weinhold 97c0a2b3f1 * Paranoia checks were accidentally globally enabled by default. Object
* 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
2008-04-27 15:13:31 +00:00
Ingo Weinhold 0d5ea6e6cf Added some paranoia debug code. We track only the buffer size ATM, and
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
2008-04-26 20:31:51 +00:00
Ingo Weinhold f0a15ccac2 * When appending/prepending data to a buffer we kept the initial
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
2008-04-23 18:41:49 +00:00
Ingo Weinhold 62d7da1f45 Added support for attaching ancillary data to a net_buffer. It's a naive
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
2008-04-12 09:19:44 +00:00
Axel Dörfler d2df03947e * init_first_data_node() did not always set tail_space correctly, leading to
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
2008-01-06 16:58:50 +00:00
Axel Dörfler 157da1cd6e * net_buffer is a module, so it shouldn't have its initializers called
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
2007-10-23 00:04:41 +00:00
Hugo Santos a1deb55ef5 net_interface_private: added receive queue and splited device reading from packet processing. Delivering to self no longer is executed in the sender's context, which had some problems with TCP's locking.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21214 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-05-23 07:55:54 +00:00
Hugo Santos d3d38faf41 net_buffer: prevent modules from messing with metadata too much
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21211 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-05-23 03:48:57 +00:00
Hugo Santos 79a0d25245 net_buffer: preparing for better metadata management
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21210 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-05-23 03:48:23 +00:00
Hugo Santos 11b5020f2f rewrote the object cache (slab) implementation a bit, preparing for further integration.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20887 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-28 18:53:58 +00:00
Hugo Santos 5d6551d69f removed some of the slab's initial heavy debugging. we now merge the links into the slab itself resulting in zero overhead per buffer with MergedLink strategy.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20841 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-26 15:40:53 +00:00
Hugo Santos e6fb3d3947 more slab fixes, also introduced a new strategy optimized for medium sized buffers (64 >= x < 512) with lengths other than power of 2 (has an overhead of 2 words per buffer).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20839 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-26 11:38:24 +00:00
Hugo Santos dd89ad0e7e added locking to slab's Cache<>. Now we react to system's low memory conditions freeing up empty slabs.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20836 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-26 07:31:19 +00:00
Hugo Santos 457b03ecb4 net_buffer is the first user of the new slab allocator, let's see how it goes.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20834 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-26 06:05:23 +00:00
Hugo Santos 87001e059c some NetBufferUtility revamp.
- 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
2007-04-11 16:40:40 +00:00
Axel Dörfler bc85ccf5f3 * init_data_node() is now called init_first_data_node(), and also sets
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
2007-04-11 10:17:26 +00:00
Hugo Santos 1c96882baa update buffer size when prepending buffers.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20642 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-10 18:27:41 +00:00
Hugo Santos 914c48cad7 eat header space in each iteration in prepend_size().
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20641 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-10 17:00:22 +00:00
Hugo Santos f73dd74eb9 even more TCP fixage.
- 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
2007-04-10 16:47:47 +00:00
Hugo Santos a5d8483183 small cleanup, use get_node_at_offset().
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20591 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-05 20:45:10 +00:00
Hugo Santos cb711badc1 some cleanups by introducing get_node_at_offset
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20504 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-01 20:23:16 +00:00
Axel Dörfler 10f5cebea3 Added temporary possibility to dump a net_buffer via the buffer module.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19671 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-01-01 19:09:57 +00:00
Axel Dörfler c0d50aaedb Fixed several problems:
* 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
2006-12-18 19:13:59 +00:00
Axel Dörfler d344e18b94 Calmed down net_buffer and IPv4 a bit.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19429 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-12-05 02:21:06 +00:00
Axel Dörfler c31e5df06c count_iovecs() and get_iovecs() now only take nodes into account that contain data.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19426 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-12-04 17:49:47 +00:00
Axel Dörfler cdd2dcca7f * Forgot to set the data_node::located in clone_buffer().
* 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
2006-12-01 11:58:37 +00:00
Axel Dörfler 8ad667cb0b * After my recent change, append_size() did not work correctly anymore, if
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
2006-12-01 09:45:23 +00:00
Axel Dörfler 4dbe78a0cd Discarded the use of data_header::size in the last commit, but forgot to actually
remove it.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19385 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-11-28 23:22:19 +00:00
Axel Dörfler 49961c1489 * Fixed a stupid bug in append_size() - it rounded the size-per-data_header value,
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
2006-11-28 23:00:33 +00:00
Axel Dörfler fc8c0ec946 * Small optimization for set_timer(): now only removes the timer from the list
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
2006-11-26 23:18:36 +00:00
Axel Dörfler 224e38e302 Added function to append cloned data from another buffer (to be used by TCP).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19370 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-11-25 14:30:54 +00:00
Axel Dörfler 604d21a600 * Added an offset/sequence field to the net_buffer - this can and will be used
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
2006-11-25 11:29:36 +00:00
Axel Dörfler 2e95d2f425 Fixed a bunch of bugs in the net_buffer implementation; it didn't crash before,
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
2006-10-15 01:12:54 +00:00
Axel Dörfler 08d85bd298 Reverted back to r18850 - since we won't keep that version anyway (due to the
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
2006-10-14 19:42:43 +00:00