]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/skmsg.h
Merge branch 'parisc-5.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[linux.git] / include / linux / skmsg.h
index ce7055259877b7f42a80a55508700d3dec5833e7..6cb077b646a541c2283b134315e6aea7c5655f93 100644 (file)
@@ -28,13 +28,14 @@ struct sk_msg_sg {
        u32                             end;
        u32                             size;
        u32                             copybreak;
-       bool                            copy[MAX_MSG_FRAGS];
+       unsigned long                   copy;
        /* The extra element is used for chaining the front and sections when
         * the list becomes partitioned (e.g. end < start). The crypto APIs
         * require the chaining.
         */
        struct scatterlist              data[MAX_MSG_FRAGS + 1];
 };
+static_assert(BITS_PER_LONG >= MAX_MSG_FRAGS);
 
 /* UAPI in filter.c depends on struct sk_msg_sg being first element. */
 struct sk_msg {
@@ -230,7 +231,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 {
@@ -249,7 +250,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);
 }
@@ -257,7 +258,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;