Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C) 2019 Intel Corporation.
3 : : * All rights reserved.
4 : : */
5 : :
6 : : #include "spdk/util.h"
7 : : #include "spdk/log.h"
8 : :
9 : : void
10 : 15527 : spdk_iov_memset(struct iovec *iovs, int iovcnt, int c)
11 : : {
12 : 15527 : int iov_idx = 0;
13 : 15 : struct iovec *iov;
14 : :
15 [ + + ]: 31074 : while (iov_idx < iovcnt) {
16 [ - + ]: 15547 : iov = &iovs[iov_idx];
17 [ - + - + : 15547 : memset(iov->iov_base, c, iov->iov_len);
- + - + -
+ ]
18 [ - + ]: 15547 : iov_idx++;
19 : : }
20 : 15527 : }
21 : :
22 [ + + # # ]: 3628 : SPDK_LOG_DEPRECATION_REGISTER(spdk_iov_one, "spdk_iov_one", "v24.05", 0);
23 : :
24 : : void
25 : 0 : spdk_iov_one(struct iovec *iov, int *iovcnt, void *buf, size_t buflen)
26 : : {
27 : 0 : SPDK_LOG_DEPRECATED(spdk_iov_one);
28 : :
29 [ # # # # ]: 0 : iov->iov_base = buf;
30 [ # # # # ]: 0 : iov->iov_len = buflen;
31 [ # # ]: 0 : *iovcnt = 1;
32 : 0 : }
33 : :
34 : : size_t
35 : 267877552 : spdk_ioviter_first(struct spdk_ioviter *iter,
36 : : struct iovec *siov, size_t siovcnt,
37 : : struct iovec *diov, size_t diovcnt,
38 : : void **src, void **dst)
39 : : {
40 : 58951279 : struct iovec *iovs[2];
41 : 58951279 : size_t iovcnts[2];
42 : 58951279 : void *out[2];
43 : 24759 : size_t len;
44 : :
45 [ + - + - ]: 267877552 : iovs[0] = siov;
46 [ + - + - ]: 267877552 : iovcnts[0] = siovcnt;
47 : :
48 [ + - + - : 267877552 : iovs[1] = diov;
+ - ]
49 [ + - + - : 267877552 : iovcnts[1] = diovcnt;
+ - ]
50 : :
51 : 267877552 : len = spdk_ioviter_firstv(iter, 2, iovs, iovcnts, out);
52 : :
53 [ + + ]: 267877552 : if (len > 0) {
54 [ + - + - : 267877549 : *src = out[0];
+ - ]
55 [ + - + - : 267877549 : *dst = out[1];
+ - + - ]
56 : 2890708 : }
57 : :
58 : 267902311 : return len;
59 : 24759 : }
60 : :
61 : : size_t
62 : 268443712 : spdk_ioviter_firstv(struct spdk_ioviter *iter,
63 : : uint32_t count,
64 : : struct iovec **iov,
65 : : size_t *iovcnt,
66 : : void **out)
67 : : {
68 : 30437 : struct spdk_single_ioviter *it;
69 : 30437 : uint32_t i;
70 : :
71 [ + - + - ]: 268443712 : iter->count = count;
72 : :
73 [ + + ]: 805938625 : for (i = 0; i < count; i++) {
74 [ + - + - : 537494913 : it = &iter->iters[i];
+ - ]
75 [ + - + - : 537494913 : it->iov = iov[i];
+ - + - ]
76 [ + - + - : 537494913 : it->iovcnt = iovcnt[i];
+ - + - ]
77 [ + - + - ]: 537494913 : it->idx = 0;
78 [ + - + - : 537494913 : it->iov_len = iov[i][0].iov_len;
+ - + - +
- + - +
- ]
79 [ + - + - : 537494913 : it->iov_base = iov[i][0].iov_base;
+ - + - +
- + - +
- ]
80 : 5805834 : }
81 : :
82 : 268474149 : return spdk_ioviter_nextv(iter, out);
83 : 30437 : }
84 : :
85 : : size_t
86 : 310812474 : spdk_ioviter_next(struct spdk_ioviter *iter, void **src, void **dst)
87 : : {
88 : 63976869 : void *out[2];
89 : 85438 : size_t len;
90 : :
91 : 310812474 : len = spdk_ioviter_nextv(iter, out);
92 : :
93 [ + + ]: 310812474 : if (len > 0) {
94 [ + - + - : 42934927 : *src = out[0];
+ - ]
95 [ + - + - : 42934927 : *dst = out[1];
+ - + - ]
96 : 666695 : }
97 : :
98 : 310897912 : return len;
99 : 85438 : }
100 : :
101 : : size_t
102 : 579426569 : spdk_ioviter_nextv(struct spdk_ioviter *iter, void **out)
103 : : {
104 : 149943 : struct spdk_single_ioviter *it;
105 : 149943 : size_t len;
106 : 149943 : uint32_t i;
107 : :
108 : : /* Figure out the minimum size of each iovec's next segment */
109 : 579426569 : len = UINT32_MAX;
110 [ + + + - : 1315217435 : for (i = 0; i < iter->count; i++) {
+ + ]
111 [ + - + - : 1003668416 : it = &iter->iters[i];
+ - ]
112 [ + + + + : 1003668416 : if (it->idx == it->iovcnt || it->iov_len == 0) {
+ - + - +
+ + - + -
+ + ]
113 : : /* This element has 0 bytes remaining, so we're done. */
114 : 267877550 : return 0;
115 : : }
116 : :
117 [ + - + - : 735790866 : len = spdk_min(len, it->iov_len);
+ + + - +
- ]
118 : 7355261 : }
119 : :
120 [ + + + - : 935646735 : for (i = 0; i < iter->count; i++) {
+ + ]
121 [ + - + - : 624097716 : it = &iter->iters[i];
+ - ]
122 : :
123 [ + - + - : 624097716 : out[i] = it->iov_base;
+ - + - ]
124 : :
125 [ + + + - : 624097716 : if (it->iov_len == len) {
+ + ]
126 : : /* Advance to next element */
127 [ + - ]: 465612427 : it->idx++;
128 [ + + + - : 465612427 : if (it->idx != it->iovcnt) {
+ - + - +
+ ]
129 : : /* Set up for next element */
130 [ - + - + : 64729548 : it->iov_len = it->iov[it->idx].iov_len;
- + - + -
+ - + - +
- + - + ]
131 [ - + - + : 64729548 : it->iov_base = it->iov[it->idx].iov_base;
- + - + -
+ - + - +
- + - + ]
132 : 745171 : }
133 : 6437130 : } else {
134 : : /* Partial buffer */
135 [ + - + - : 158485289 : it->iov_base += len;
+ - ]
136 [ + - + - ]: 158485289 : it->iov_len -= len;
137 : : }
138 : 7285805 : }
139 : :
140 : 311549019 : return len;
141 : 6487862 : }
142 : :
143 : : size_t
144 : 136781718 : spdk_iovcpy(struct iovec *siov, size_t siovcnt, struct iovec *diov, size_t diovcnt)
145 : : {
146 : 1565139 : struct spdk_ioviter iter;
147 : 24716 : size_t len, total_sz;
148 : 1565139 : void *src, *dst;
149 : :
150 : 136781718 : total_sz = 0;
151 [ + + ]: 136980990 : for (len = spdk_ioviter_first(&iter, siov, siovcnt, diov, diovcnt, &src, &dst);
152 [ + + ]: 281411199 : len != 0;
153 : 144629481 : len = spdk_ioviter_next(&iter, &src, &dst)) {
154 [ - + - + ]: 144629481 : memcpy(dst, src, len);
155 : 144629481 : total_sz += len;
156 : 199272 : }
157 : :
158 : 136806434 : return total_sz;
159 : 24716 : }
160 : :
161 : : size_t
162 : 210 : spdk_iovmove(struct iovec *siov, size_t siovcnt, struct iovec *diov, size_t diovcnt)
163 : : {
164 : 175 : struct spdk_ioviter iter;
165 : 35 : size_t len, total_sz;
166 : 175 : void *src, *dst;
167 : :
168 : 210 : total_sz = 0;
169 [ + + ]: 245 : for (len = spdk_ioviter_first(&iter, siov, siovcnt, diov, diovcnt, &src, &dst);
170 [ + + ]: 420 : len != 0;
171 : 210 : len = spdk_ioviter_next(&iter, &src, &dst)) {
172 [ - + - + ]: 210 : memmove(dst, src, len);
173 : 210 : total_sz += len;
174 : 35 : }
175 : :
176 : 245 : return total_sz;
177 : 35 : }
178 : :
179 : : void
180 : 5072394 : spdk_iov_xfer_init(struct spdk_iov_xfer *ix, struct iovec *iovs, int iovcnt)
181 : : {
182 [ + - + - ]: 5072394 : ix->iovs = iovs;
183 [ + - + - ]: 5072394 : ix->iovcnt = iovcnt;
184 [ + - + - ]: 5072394 : ix->cur_iov_idx = 0;
185 [ + - + - ]: 5072394 : ix->cur_iov_offset = 0;
186 : 5072394 : }
187 : :
188 : : static size_t
189 : 5072596 : iov_xfer(struct spdk_iov_xfer *ix, const void *buf, size_t buf_len, bool to_buf)
190 : : {
191 : 5072596 : size_t len, iov_remain_len, copied_len = 0;
192 : 159 : struct iovec *iov;
193 : :
194 [ + + ]: 5072596 : if (buf_len == 0) {
195 : 0 : return 0;
196 : : }
197 : :
198 [ + + + - : 14990392 : while (ix->cur_iov_idx < ix->iovcnt) {
+ - + - +
+ ]
199 [ + - + - : 10031688 : iov = &ix->iovs[ix->cur_iov_idx];
+ - + - +
- ]
200 [ + - + - : 10031688 : iov_remain_len = iov->iov_len - ix->cur_iov_offset;
+ - + - ]
201 [ + + ]: 10031688 : if (iov_remain_len == 0) {
202 [ + - + - ]: 4958901 : ix->cur_iov_idx++;
203 [ + - + - ]: 4958901 : ix->cur_iov_offset = 0;
204 : 4958901 : continue;
205 : : }
206 : :
207 [ + + ]: 5072787 : len = spdk_min(iov_remain_len, buf_len - copied_len);
208 : :
209 [ + + + + ]: 5072787 : if (to_buf) {
210 [ - + - + : 128278 : memcpy((char *)buf + copied_len,
- + ]
211 [ - + - + : 128176 : (char *)iov->iov_base + ix->cur_iov_offset, len);
- + - + -
+ ]
212 : 102 : } else {
213 [ - + - + : 4948899 : memcpy((char *)iov->iov_base + ix->cur_iov_offset,
- + - + -
+ - + -
+ ]
214 [ - + ]: 4288 : (const char *)buf + copied_len, len);
215 : : }
216 : 5072787 : copied_len += len;
217 [ + - + - ]: 5072787 : ix->cur_iov_offset += len;
218 : :
219 [ + + ]: 5072787 : if (buf_len == copied_len) {
220 : 113892 : return copied_len;
221 : : }
222 : : }
223 : :
224 : 4958704 : return copied_len;
225 : 4366 : }
226 : :
227 : : size_t
228 : 4944498 : spdk_iov_xfer_from_buf(struct spdk_iov_xfer *ix, const void *buf, size_t buf_len)
229 : : {
230 : 4944498 : return iov_xfer(ix, buf, buf_len, false);
231 : : }
232 : :
233 : : size_t
234 : 128098 : spdk_iov_xfer_to_buf(struct spdk_iov_xfer *ix, const void *buf, size_t buf_len)
235 : : {
236 : 128098 : return iov_xfer(ix, buf, buf_len, true);
237 : : }
238 : :
239 : : void
240 : 33371 : spdk_copy_iovs_to_buf(void *buf, size_t buf_len, struct iovec *iovs, int iovcnt)
241 : : {
242 : 33337 : struct spdk_iov_xfer ix;
243 : :
244 : 33371 : spdk_iov_xfer_init(&ix, iovs, iovcnt);
245 : 33371 : spdk_iov_xfer_to_buf(&ix, buf, buf_len);
246 : 33371 : }
247 : :
248 : : void
249 : 4930959 : spdk_copy_buf_to_iovs(struct iovec *iovs, int iovcnt, void *buf, size_t buf_len)
250 : : {
251 : 4930186 : struct spdk_iov_xfer ix;
252 : :
253 : 4930959 : spdk_iov_xfer_init(&ix, iovs, iovcnt);
254 : 4930959 : spdk_iov_xfer_from_buf(&ix, buf, buf_len);
255 : 4930959 : }
|