]>
git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/src/net/proxy.cc
2 * This file is open source software, licensed to you under the terms
3 * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4 * distributed with this work for additional information regarding copyright
5 * ownership. You may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing,
12 * software distributed under the License is distributed on an
13 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 * KIND, either express or implied. See the License for the
15 * specific language governing permissions and limitations
18 #include <seastar/core/reactor.hh>
19 #include <seastar/net/proxy.hh>
26 class proxy_net_device
: public qp
{
28 static constexpr size_t _send_queue_length
= 128;
29 size_t _send_depth
= 0;
32 std::vector
<packet
> _moving
;
34 explicit proxy_net_device(unsigned cpu
, device
* dev
);
35 virtual future
<> send(packet p
) override
{
38 virtual uint32_t send(circular_buffer
<packet
>& p
) override
;
41 proxy_net_device::proxy_net_device(unsigned cpu
, device
* dev
) :
45 _moving
.reserve(_send_queue_length
);
48 uint32_t proxy_net_device::send(circular_buffer
<packet
>& p
)
50 if (!_moving
.empty() || _send_depth
== _send_queue_length
) {
54 for (size_t i
= 0; !p
.empty() && _send_depth
< _send_queue_length
; i
++, _send_depth
++) {
55 _moving
.push_back(std::move(p
.front()));
59 if (!_moving
.empty()) {
60 qp
* dev
= &_dev
->queue_for_cpu(_cpu
);
61 auto cpu
= engine().cpu_id();
62 smp::submit_to(_cpu
, [this, dev
, cpu
]() mutable {
63 for(size_t i
= 0; i
< _moving
.size(); i
++) {
64 dev
->proxy_send(_moving
[i
].free_on_cpu(cpu
, [this] { _send_depth
--; }));
71 return _moving
.size();
74 std::unique_ptr
<qp
> create_proxy_net_device(unsigned master_cpu
, device
* dev
) {
75 return std::make_unique
<proxy_net_device
>(master_cpu
, dev
);