]> git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/src/net/proxy.cc
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / seastar / src / net / proxy.cc
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 */
18 #include <seastar/core/reactor.hh>
19 #include <seastar/net/proxy.hh>
20 #include <utility>
21
22 namespace seastar {
23
24 namespace net {
25
26 class proxy_net_device : public qp {
27 private:
28 static constexpr size_t _send_queue_length = 128;
29 size_t _send_depth = 0;
30 unsigned _cpu;
31 device* _dev;
32 std::vector<packet> _moving;
33 public:
34 explicit proxy_net_device(unsigned cpu, device* dev);
35 virtual future<> send(packet p) override {
36 abort();
37 }
38 virtual uint32_t send(circular_buffer<packet>& p) override;
39 };
40
41 proxy_net_device::proxy_net_device(unsigned cpu, device* dev) :
42 _cpu(cpu),
43 _dev(dev)
44 {
45 _moving.reserve(_send_queue_length);
46 }
47
48 uint32_t proxy_net_device::send(circular_buffer<packet>& p)
49 {
50 if (!_moving.empty() || _send_depth == _send_queue_length) {
51 return 0;
52 }
53
54 for (size_t i = 0; !p.empty() && _send_depth < _send_queue_length; i++, _send_depth++) {
55 _moving.push_back(std::move(p.front()));
56 p.pop_front();
57 }
58
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--; }));
65 }
66 }).then([this] {
67 _moving.clear();
68 });
69 }
70
71 return _moving.size();
72 }
73
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);
76 }
77 }
78
79 }