}
}
-static void sk_msg_set_elem_copy(struct sk_msg *msg, u32 i)
+ static bool sk_msg_elem_is_copy(const struct sk_msg *msg, u32 i)
+ {
+ return test_bit(i, msg->sg.copy);
+ }
+
+ static void sk_msg_clear_elem_copy(struct sk_msg *msg, u32 i)
+ {
+ __clear_bit(i, msg->sg.copy);
+ }
+
- __set_bit(i, msg->sg.copy);
++static void sk_msg_set_elem_copy(struct sk_msg *msg, u32 i, bool sg_copy)
+ {
- if (sk_msg_elem_is_copy(msg, src))
- sk_msg_set_elem_copy(msg, dst);
- else
- sk_msg_clear_elem_copy(msg, dst);
++ __assign_bit(i, msg->sg.copy, sg_copy);
+ }
+
+ static void sk_msg_clear_copy_range(struct sk_msg *msg, u32 start, u32 end)
+ {
+ while (start != end) {
+ sk_msg_clear_elem_copy(msg, start);
+ sk_msg_iter_var_next(start);
+ }
+ }
+
+ static void sk_msg_sg_move(struct sk_msg *msg, u32 dst, u32 src)
+ {
+ msg->sg.data[dst] = msg->sg.data[src];
++
++ sk_msg_set_elem_copy(msg, dst,
++ sk_msg_elem_is_copy(msg, src));
+ }
+
static const struct bpf_func_proto bpf_msg_cork_bytes_proto = {
.func = bpf_msg_cork_bytes,
.gpl_only = false,
poffset += len;
sge->length = 0;
put_page(sg_page(sge));
- __clear_bit(i, msg->sg.copy);
++ sk_msg_clear_elem_copy(msg, i);
sk_msg_iter_var_next(i);
} while (i != last_sge);
while (i != msg->sg.end) {
msg->sg.data[i] = sge;
- __assign_bit(i, msg->sg.copy, sge_copy);
- if (sge_copy)
- sk_msg_set_elem_copy(msg, i);
- else
- sk_msg_clear_elem_copy(msg, i);
++ sk_msg_set_elem_copy(msg, i, sge_copy);
sge = nsge;
sge_copy = nsge_copy;
sk_msg_iter_var_next(i);
get_page(sg_page(&rsge));
sk_msg_iter_var_next(new);
msg->sg.data[new] = rsge;
- __assign_bit(new, msg->sg.copy, rsge_copy);
- if (rsge_copy)
- sk_msg_set_elem_copy(msg, new);
- else
- sk_msg_clear_elem_copy(msg, new);
++ sk_msg_set_elem_copy(msg, new, rsge_copy);
}
+ sk_msg_clear_elem_copy(msg, msg->sg.end);
sk_msg_reset_curr(msg);
sk_msg_compute_data_pointers(msg);
while (i != msg->sg.end) {
msg->sg.data[i] = sge;
- __assign_bit(i, msg->sg.copy, sge_copy);
- if (sge_copy)
- sk_msg_set_elem_copy(msg, i);
- else
- sk_msg_clear_elem_copy(msg, i);
++ sk_msg_set_elem_copy(msg, i, sge_copy);
sk_msg_iter_var_next(i);
sge = tmp;
sge_copy = tmp_copy;
sg_set_page(nsge,
sg_page(sge),
b, sge->offset + pop + a);
- __assign_bit(i, msg->sg.copy, sge_copy);
- if (sge_copy)
- sk_msg_set_elem_copy(msg, i);
- else
- sk_msg_clear_elem_copy(msg, i);
++ sk_msg_set_elem_copy(msg, i, sge_copy);
} else {
struct page *page, *orig;
u8 *to, *from;