]> git.proxmox.com Git - ceph.git/blame - ceph/src/seastar/src/net/proxy.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / seastar / src / net / proxy.cc
CommitLineData
11fdf7f2
TL
1/*
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.
6 *
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
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
16 * under the License.
17 */
11fdf7f2
TL
18#include <seastar/net/proxy.hh>
19#include <utility>
20
21namespace seastar {
22
23namespace net {
24
25class proxy_net_device : public qp {
26private:
27 static constexpr size_t _send_queue_length = 128;
28 size_t _send_depth = 0;
29 unsigned _cpu;
30 device* _dev;
31 std::vector<packet> _moving;
32public:
33 explicit proxy_net_device(unsigned cpu, device* dev);
34 virtual future<> send(packet p) override {
35 abort();
36 }
37 virtual uint32_t send(circular_buffer<packet>& p) override;
38};
39
40proxy_net_device::proxy_net_device(unsigned cpu, device* dev) :
41 _cpu(cpu),
42 _dev(dev)
43{
44 _moving.reserve(_send_queue_length);
45}
46
47uint32_t proxy_net_device::send(circular_buffer<packet>& p)
48{
49 if (!_moving.empty() || _send_depth == _send_queue_length) {
50 return 0;
51 }
52
1e59de90 53 for (; !p.empty() && _send_depth < _send_queue_length; _send_depth++) {
11fdf7f2
TL
54 _moving.push_back(std::move(p.front()));
55 p.pop_front();
56 }
57
58 if (!_moving.empty()) {
59 qp* dev = &_dev->queue_for_cpu(_cpu);
f67539c2 60 auto cpu = this_shard_id();
9f95a23c
TL
61 // FIXME: future is discarded
62 (void)smp::submit_to(_cpu, [this, dev, cpu]() mutable {
11fdf7f2
TL
63 for(size_t i = 0; i < _moving.size(); i++) {
64 dev->proxy_send(_moving[i].free_on_cpu(cpu, [this] { _send_depth--; }));
65 }
66 }).then([this] {
67 _moving.clear();
68 });
69 }
70
71 return _moving.size();
72}
73
74std::unique_ptr<qp> create_proxy_net_device(unsigned master_cpu, device* dev) {
75 return std::make_unique<proxy_net_device>(master_cpu, dev);
76}
77}
78
79}