Skip to content

Commit 2eefdaa

Browse files
committed
net: Return buffer and buffer store with get_buffer
1 parent 2b9e924 commit 2eefdaa

8 files changed

Lines changed: 44 additions & 30 deletions

File tree

api/net/buffer_store.hpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ namespace net
3535
**/
3636
class BufferStore {
3737
public:
38-
using buffer_t = uint8_t*;
38+
struct buffer_t
39+
{
40+
BufferStore* bufstore;
41+
uint8_t* addr;
42+
};
3943

4044
BufferStore() = delete;
4145
BufferStore(size_t num, size_t bufsize);
@@ -52,11 +56,11 @@ namespace net
5256
{ return poolsize_; }
5357

5458
/** Check if a buffer belongs here */
55-
bool is_from_pool(buffer_t addr) const noexcept
59+
bool is_from_pool(uint8_t* addr) const noexcept
5660
{ return addr >= pool_begin() and addr < pool_end(); }
5761

5862
/** Check if an address is the start of a buffer */
59-
bool is_buffer(buffer_t addr) const noexcept
63+
bool is_buffer(uint8_t* addr) const noexcept
6064
{ return (addr - pool_) % bufsize_ == 0; }
6165

6266
size_t available() const noexcept
@@ -66,24 +70,21 @@ namespace net
6670
void move_to_this_cpu() noexcept;
6771

6872
private:
69-
buffer_t pool_begin() const noexcept {
73+
uint8_t* pool_begin() const noexcept {
7074
return pool_;
7175
}
72-
buffer_t pool_end() const noexcept {
76+
uint8_t* pool_end() const noexcept {
7377
return pool_begin() + poolsize_;
7478
}
75-
size_t buffer_id(buffer_t addr) const {
76-
return (addr - pool_) / bufsize_;
77-
}
7879

7980
BufferStore* get_next_bufstore();
8081
inline buffer_t get_buffer_directly() noexcept;
81-
inline void release_directly(buffer_t);
82+
inline void release_directly(uint8_t*);
8283

8384
size_t poolsize_;
8485
size_t bufsize_;
85-
buffer_t pool_;
86-
std::vector<buffer_t> available_;
86+
uint8_t* pool_;
87+
std::vector<uint8_t*> available_;
8788
BufferStore* next_;
8889
int cpu;
8990
static bool smp_enabled_;

src/drivers/virtionet.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ void VirtioNet::get_config() {
4444
VirtioNet::VirtioNet(hw::PCI_Device& d)
4545
: Virtio(d),
4646
Link(Link_protocol{{this, &VirtioNet::transmit}, mac()},
47-
std::max(256u, queue_size(0) * 2), 2048 /* half-page buffers */),
47+
256u, 2048 /* 256x half-page buffers */),
4848
packets_rx_{Statman::get().create(Stat::UINT64, device_name() + ".packets_rx").get_uint64()},
4949
packets_tx_{Statman::get().create(Stat::UINT64, device_name() + ".packets_tx").get_uint64()}
5050
{
@@ -119,7 +119,7 @@ VirtioNet::VirtioNet(hw::PCI_Device& d)
119119
rx_q.size() / 2, bufstore().bufsize());
120120

121121
for (int i = 0; i < rx_q.size() / 2; i++)
122-
add_receive_buffer(bufstore().get_buffer());
122+
add_receive_buffer(bufstore().get_buffer().addr);
123123

124124
// Step 4 - If there are many queues, we should negotiate the number.
125125
// Set config length, based on whether there are multiple queues
@@ -196,7 +196,7 @@ void VirtioNet::msix_recv_handler()
196196

197197
dequeued_rx++;
198198
// Requeue a new buffer
199-
add_receive_buffer(bufstore().get_buffer());
199+
add_receive_buffer(bufstore().get_buffer().addr);
200200

201201
// Stat increase packets received
202202
packets_rx_++;
@@ -270,13 +270,14 @@ VirtioNet::recv_packet(uint8_t* data, uint16_t size)
270270
net::Packet_ptr
271271
VirtioNet::create_packet(int link_offset)
272272
{
273-
auto* ptr = (net::Packet*) bufstore().get_buffer();
273+
auto buffer = bufstore().get_buffer();
274+
auto* ptr = (net::Packet*) buffer.addr;
274275

275276
new (ptr) net::Packet(
276277
sizeof(virtio_net_hdr) + link_offset,
277278
0,
278279
sizeof(virtio_net_hdr) + packet_len(),
279-
&bufstore());
280+
buffer.bufstore);
280281

281282
return net::Packet_ptr(ptr);
282283
}

src/drivers/vmxnet3.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ void vmxnet3::refill(rxring_state& rxq)
340340
(rxq.producers & vmxnet3::NUM_RX_DESC) ? 0 : VMXNET3_RXF_GEN;
341341

342342
// get a pointer to packet data
343-
auto* pkt_data = bufstore().get_buffer();
343+
auto* pkt_data = bufstore().get_buffer().addr;
344344
rxq.buffers[i] = &pkt_data[sizeof(net::Packet)];
345345

346346
// assign rx descriptor
@@ -369,8 +369,13 @@ vmxnet3::recv_packet(uint8_t* data, uint16_t size)
369369
net::Packet_ptr
370370
vmxnet3::create_packet(int link_offset)
371371
{
372-
auto* ptr = (net::Packet*) bufstore().get_buffer();
373-
new (ptr) net::Packet(frame_offset_device() + link_offset, 0 , frame_offset_device() + packet_len(), &bufstore());
372+
auto buffer = bufstore().get_buffer();
373+
auto* ptr = (net::Packet*) buffer.addr;
374+
new (ptr) net::Packet(
375+
frame_offset_device() + link_offset,
376+
0,
377+
frame_offset_device() + packet_len(),
378+
buffer.bufstore);
374379
return net::Packet_ptr(ptr);
375380
}
376381

src/kernel/irq_manager.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ static std::array<IRQ_manager, SMP_MAX_CORES> managers;
3333

3434
IRQ_manager& IRQ_manager::get(int cpuid)
3535
{
36+
#ifndef INCLUDEOS_SINGLE_THREADED
3637
return managers.at(cpuid);
38+
#else
39+
return managers[0];
40+
#endif
3741
}
3842
IRQ_manager& IRQ_manager::get()
3943
{

src/net/buffer_store.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ namespace net {
4747
assert(bufsize != 0);
4848
const size_t DATA_SIZE = poolsize_;
4949

50-
this->pool_ = (buffer_t) memalign(PAGE_SIZE, DATA_SIZE);
50+
this->pool_ = (uint8_t*) memalign(PAGE_SIZE, DATA_SIZE);
5151
assert(this->pool_);
5252

5353
available_.reserve(num);
54-
for (buffer_t b = pool_end()-bufsize; b >= pool_begin(); b -= bufsize) {
54+
for (uint8_t* b = pool_end()-bufsize; b >= pool_begin(); b -= bufsize) {
5555
available_.push_back(b);
5656
}
5757
assert(available() == num);
@@ -66,6 +66,7 @@ namespace net {
6666
}
6767

6868
BufferStore::~BufferStore() {
69+
delete this->next_;
6970
free(this->pool_);
7071
}
7172

@@ -89,7 +90,7 @@ namespace net {
8990
{
9091
auto addr = available_.back();
9192
available_.pop_back();
92-
return addr;
93+
return { this, addr };
9394
}
9495

9596
BufferStore::buffer_t BufferStore::get_buffer()
@@ -119,12 +120,12 @@ namespace net {
119120
#ifndef INCLUDEOS_SINGLE_THREADED
120121
if (is_locked) unlock(plock);
121122
#endif
122-
return addr;
123+
return { this, addr };
123124
}
124125

125126
void BufferStore::release(void* addr)
126127
{
127-
buffer_t buff = (buffer_t) addr;
128+
auto* buff = (uint8_t*) addr;
128129
debug("Release %p -> ", buff);
129130

130131
#ifndef INCLUDEOS_SINGLE_THREADED
@@ -163,7 +164,7 @@ namespace net {
163164
#endif
164165
}
165166

166-
void BufferStore::release_directly(buffer_t buffer)
167+
void BufferStore::release_directly(uint8_t* buffer)
167168
{
168169
available_.push_back(buffer);
169170
}

test/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ if ("${ARCH}" STREQUAL "")
88
set (ARCH "ARCH_X86")
99
endif("${ARCH}" STREQUAL "")
1010

11-
add_definitions(-D${ARCH})
11+
add_definitions(-D${ARCH} -DINCLUDEOS_SINGLE_THREADED)
1212

1313
set(CMAKE_CXX_STANDARD 14)
1414
set(CMAKE_C_FLAGS "-m32 -g -O0 -std=c11 -Wall -Wextra")

test/net/integration/bufstore/service.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ BufferStore bufstore_{ BUFFER_CNT, MTU };
3030

3131
auto create_packet(BufferStore& bufstore) {
3232
// get buffer (as packet + data)
33-
auto* ptr = (Packet*) bufstore.get_buffer();
33+
auto buffer = bufstore.get_buffer();
3434
// place packet at front of buffer
35-
new (ptr) Packet(0, 0, MTU, &bufstore);
35+
auto* ptr = (Packet*) buffer.addr;
36+
new (ptr) Packet(0, 0, MTU, buffer.bufstore);
3637
// regular shared_ptr that calls delete on Packet
3738
return std::unique_ptr<Packet>(ptr);
3839
}

test/net/unit/packets.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ CASE("Create empty packet")
4646

4747
Packet_ptr create_packet() noexcept
4848
{
49-
auto* ptr = (net::Packet*) bufstore.get_buffer();
50-
new (ptr) net::Packet(DRIVER_OFFSET, 0, DRIVER_OFFSET + PACKET_CAPA, &bufstore);
49+
auto buffer = bufstore.get_buffer();
50+
auto* ptr = (net::Packet*) buffer.addr;
51+
new (ptr) net::Packet(DRIVER_OFFSET, 0, DRIVER_OFFSET + PACKET_CAPA, buffer.bufstore);
5152
return net::Packet_ptr(ptr);
5253
}
5354

0 commit comments

Comments
 (0)