mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-07 04:12:04 -04:00
BACKPORT: net: sockmap: use bitmap for copy info
Don't use bool array in struct sk_msg_sg, save 12 bytes. Change-Id: I50359c5cd6101a1c4f2c78f7d83877fbbaa16063 Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5418db0090
commit
1cea6f1d77
2 changed files with 10 additions and 6 deletions
|
|
@ -29,7 +29,7 @@ struct sk_msg_sg {
|
|||
u32 end;
|
||||
u32 size;
|
||||
u32 copybreak;
|
||||
bool copy[MAX_MSG_FRAGS];
|
||||
unsigned long copy;
|
||||
/* The extra two elements:
|
||||
* 1) used for chaining the front and sections when the list becomes
|
||||
* partitioned (e.g. end < start). The crypto APIs require the
|
||||
|
|
@ -38,6 +38,7 @@ struct sk_msg_sg {
|
|||
*/
|
||||
struct scatterlist data[MAX_MSG_FRAGS + 2];
|
||||
};
|
||||
static_assert(BITS_PER_LONG >= MAX_MSG_FRAGS);
|
||||
|
||||
/* UAPI in filter.c depends on struct sk_msg_sg being first element. */
|
||||
struct sk_msg {
|
||||
|
|
@ -231,7 +232,7 @@ static inline void sk_msg_compute_data_pointers(struct sk_msg *msg)
|
|||
{
|
||||
struct scatterlist *sge = sk_msg_elem(msg, msg->sg.start);
|
||||
|
||||
if (msg->sg.copy[msg->sg.start]) {
|
||||
if (test_bit(msg->sg.start, &msg->sg.copy)) {
|
||||
msg->data = NULL;
|
||||
msg->data_end = NULL;
|
||||
} else {
|
||||
|
|
@ -250,7 +251,7 @@ static inline void sk_msg_page_add(struct sk_msg *msg, struct page *page,
|
|||
sg_set_page(sge, page, len, offset);
|
||||
sg_unmark_end(sge);
|
||||
|
||||
msg->sg.copy[msg->sg.end] = true;
|
||||
__set_bit(msg->sg.end, &msg->sg.copy);
|
||||
msg->sg.size += len;
|
||||
sk_msg_iter_next(msg, end);
|
||||
}
|
||||
|
|
@ -258,7 +259,10 @@ static inline void sk_msg_page_add(struct sk_msg *msg, struct page *page,
|
|||
static inline void sk_msg_sg_copy(struct sk_msg *msg, u32 i, bool copy_state)
|
||||
{
|
||||
do {
|
||||
msg->sg.copy[i] = copy_state;
|
||||
if (copy_state)
|
||||
__set_bit(i, &msg->sg.copy);
|
||||
else
|
||||
__clear_bit(i, &msg->sg.copy);
|
||||
sk_msg_iter_var_next(i);
|
||||
if (i == msg->sg.end)
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -2279,7 +2279,7 @@ BPF_CALL_4(bpf_msg_pull_data, struct sk_msg *, msg, u32, start,
|
|||
* account for the headroom.
|
||||
*/
|
||||
bytes_sg_total = start - offset + bytes;
|
||||
if (!msg->sg.copy[i] && bytes_sg_total <= len)
|
||||
if (!test_bit(i, &msg->sg.copy) && bytes_sg_total <= len)
|
||||
goto out;
|
||||
|
||||
/* At this point we need to linearize multiple scatterlist
|
||||
|
|
@ -2499,7 +2499,7 @@ place_new:
|
|||
/* Place newly allocated data buffer */
|
||||
sk_mem_charge(msg->sk, len);
|
||||
msg->sg.size += len;
|
||||
msg->sg.copy[new] = false;
|
||||
__clear_bit(new, &msg->sg.copy);
|
||||
sg_set_page(&msg->sg.data[new], page, len + copy, 0);
|
||||
if (rsge.length) {
|
||||
get_page(sg_page(&rsge));
|
||||
|
|
|
|||
Loading…
Reference in a new issue