]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
bcachefs: Don't use rep movsq for small memcopies
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 22 Oct 2019 21:35:35 +0000 (17:35 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:30 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bkey.h
fs/bcachefs/extents.c
fs/bcachefs/util.h

index 321fe6fe0b55f7d25390d70982af5f9702200f55..cb2702707c2a2603df5861a11c5c428a16727296 100644 (file)
@@ -95,8 +95,8 @@ do {                                                          \
                (u64 *) (_dst) < (u64 *) (_src) +               \
                ((struct bkey *) (_src))->u64s);                \
                                                                \
-       __memmove_u64s_down((_dst), (_src),                     \
-                           ((struct bkey *) (_src))->u64s);    \
+       memcpy_u64s_small((_dst), (_src),                       \
+                         ((struct bkey *) (_src))->u64s);      \
 } while (0)
 
 struct btree;
index 20a2eeed98cd7477f02f35e26388adf4c5bd3a8b..b427bc1f0f9ca65f928859bddb6cf1d857d199fa 100644 (file)
@@ -1457,8 +1457,8 @@ static inline void __extent_entry_insert(struct bkey_i *k,
 {
        union bch_extent_entry *end = bkey_val_end(bkey_i_to_s(k));
 
-       memmove_u64s_up((u64 *) dst + extent_entry_u64s(new),
-                       dst, (u64 *) end - (u64 *) dst);
+       memmove_u64s_up_small((u64 *) dst + extent_entry_u64s(new),
+                             dst, (u64 *) end - (u64 *) dst);
        k->k.u64s += extent_entry_u64s(new);
        memcpy_u64s_small(dst, new, extent_entry_u64s(new));
 }
index 5f0a3de91ae36994f68df36214cf49ca8ba60dc3..965b6dd73bfa565e32752ce917a97c0aad7514f4 100644 (file)
@@ -593,6 +593,24 @@ static inline void memmove_u64s_down(void *dst, const void *src,
        __memmove_u64s_down(dst, src, u64s);
 }
 
+static inline void __memmove_u64s_up_small(void *_dst, const void *_src,
+                                          unsigned u64s)
+{
+       u64 *dst = (u64 *) _dst + u64s;
+       u64 *src = (u64 *) _src + u64s;
+
+       while (u64s--)
+               *--dst = *--src;
+}
+
+static inline void memmove_u64s_up_small(void *dst, const void *src,
+                                        unsigned u64s)
+{
+       EBUG_ON(dst < src);
+
+       __memmove_u64s_up_small(dst, src, u64s);
+}
+
 static inline void __memmove_u64s_up(void *_dst, const void *_src,
                                     unsigned u64s)
 {