changes I have made to make kdbus-perf work on 4.14.99 sandbox/adrians/kdbus-perf
authorAdrian Szyndela <adrian.s@samsung.com>
Fri, 9 Aug 2019 07:12:33 +0000 (09:12 +0200)
committerAdrian Szyndela <adrian.s@samsung.com>
Wed, 14 Aug 2019 16:38:44 +0000 (18:38 +0200)
15 files changed:
ipc/kdbus/bus.c
ipc/kdbus/connection.c
ipc/kdbus/handle.c
ipc/kdbus/message.c
ipc/kdbus/message.h
ipc/kdbus/metadata.c
ipc/kdbus/metadata.h
ipc/kdbus/policy.c
ipc/kdbus/pool.c
ipc/kdbus/pool.h
ipc/kdbus/util.h
packaging/kdbusTest.spec
tools/testing/selftests/kdbus/Makefile
tools/testing/selftests/kdbus/kdbus-enum.c
tools/testing/selftests/kdbus/kdbus-util.c

index bbf9dcf7543130310b0c131b540efe5f58aba121..1ddf31c835d00bf186a24c3eea690a7919654e3d 100644 (file)
@@ -464,7 +464,7 @@ int kdbus_cmd_bus_creator_info(struct kdbus_conn *conn, void __user *argp)
                kdbus_kvec_set(&kvec[cnt++], kdbus_meta_payload_ptr(pay), KDBUS_ALIGN8(pay_size));
                size = KDBUS_ALIGN8(size) + pay_size;
        }
-       cnt += kdbus_meta_emit_kvecs(&kvec[cnt], bus->meta_items, attach_flags & KDBUS_ATTACH_MASK_PROC_DST_AGNOSTIC, &size);
+       cnt += kdbus_meta_emit(kdbus_wrap_kvec(&kvec[cnt]), bus->meta_items, attach_flags & KDBUS_ATTACH_MASK_PROC_DST_AGNOSTIC, &size, 0);
 
        header.info.size = size;
        size = KDBUS_ALIGN8(size);
index 295dd94d32e0781332fe71e5223b05357617bc6c..dbfb7e7c19963d5e2f98b31fa79db65b1c490369 100644 (file)
@@ -1827,7 +1827,7 @@ int kdbus_cmd_conn_info(struct kdbus_conn *conn, void __user *argp)
                size = KDBUS_ALIGN8(size) + pay_size;
        }
 
-       cnt += kdbus_meta_emit_kvecs(&kvec[cnt], meta_items, attach_flags & (KDBUS_ATTACH_MASK_PROC_DST_AGNOSTIC|KDBUS_ATTACH_CONN_DESCRIPTION), &size);
+       cnt += kdbus_meta_emit(kdbus_wrap_kvec(&kvec[cnt]), meta_items, attach_flags & (KDBUS_ATTACH_MASK_PROC_DST_AGNOSTIC|KDBUS_ATTACH_CONN_DESCRIPTION), &size, 0);
        kdbus_assert(cnt <= sizeof(kvec)/sizeof(kvec[0]));
        info.size = size;
        size = KDBUS_ALIGN8(size);
index a1186184f76881630a9067b052505ff185debc01..2bb73d32bc2968770a674aa01387607c5a82d562 100644 (file)
@@ -335,7 +335,7 @@ static int kdbus_msg_examine(struct kdbus_msg __user *puser, struct kdbus_msg *_
        var(dst_id, msg->dst_id);
        struct kdbus_item *item, *negotiation = NULL;
        var(staging, (struct kdbus_staging_user *__restrict__)((uintptr_t)msg - offsetof(struct kdbus_staging_user, msg)));
-       struct iovec *parts = kdbus_parts_of_staging_user(staging);
+       struct kvec *parts = kdbus_parts_of_staging_user(staging);
        var(scratch, (struct kdbus_msg_parse_scratch *__restrict__)((uintptr_t)staging + scratch_offset));
        ulong items_size;
        ulong bloom_filter_off, iov_1_len, iov_2_off = 0, active_iov_len = offsetof(typeof(*msg), items);
@@ -434,7 +434,7 @@ static int kdbus_msg_examine(struct kdbus_msg __user *puser, struct kdbus_msg *_
 
                                /* real offset is patched later on if not NUL padding */
                                if ((ptr = (void __user *)KDBUS_PTR(item->vec.address))) {
-                                       struct iovec *vec;
+                                       struct kvec *vec;
                                        if (unlikely(!access_ok(VERIFY_READ, ptr, size)))
                                                return -EFAULT;
                                        vec = &parts[n_parts++];
index 2d33eddba70509675086d8751b40595dde930e15..11980cfed33879781a00d83b9a64dafb0f2444d2 100644 (file)
@@ -445,9 +445,9 @@ struct kdbus_pool_slice *kdbus_staging_user_emit(struct kdbus_staging_user *__re
        u64 msg_size;
        struct kdbus_item *item;
        struct kdbus_pool_slice *slice;
-       struct iovec *parts;
+       struct kvec *parts;
        struct kdbus_staging_user *__restrict__ staging = *pstaging;
-       ulong size, n_fds, cnt = 0;
+       ulong size, n_fds, cnt = 0, size_before_payload = 0;
        int ret;
        ulong attach = kdbus_meta_msg_mask(src, dst) & (
                src->have_meta_fake
@@ -548,10 +548,10 @@ struct kdbus_pool_slice *kdbus_staging_user_emit(struct kdbus_staging_user *__re
        BUILD_BUG_ON(sizeof(msg_size) != sizeof(staging->msg->size));
 
        size = staging->emit_size;
-       parts[0].iov_base = (void __user *)&msg_size;
-       parts[1].iov_base = (void __user *)((uintptr_t)staging->msg + sizeof(msg_size));
+       parts[0].iov_base = &msg_size;
+       parts[1].iov_base = (void *)((uintptr_t)staging->msg + sizeof(msg_size));
        parts[1].iov_len = staging->iov_1_len;
-       parts[2].iov_base = (void __user *)((uintptr_t)staging + staging->iov_2_off);
+       parts[2].iov_base = (void *)((uintptr_t)staging + staging->iov_2_off);
        parts[2].iov_len = staging->iov_2_len;
 
        if (attach & KDBUS_ATTACH_TIMESTAMP) { /* timestamp stored after msg proper */
@@ -561,8 +561,8 @@ struct kdbus_pool_slice *kdbus_staging_user_emit(struct kdbus_staging_user *__re
        cnt = 3;
 
        /* metadata items */
-       cnt += kdbus_meta_emit_stack_iovec(&staging->meta, dst, &parts[cnt], &meta_stack, attach, &size);
-       cnt += kdbus_meta_emit_iovecs(&parts[cnt], kdbus_meta_payload_ptr(kdbus_meta_payload_of_staging_user(staging)), attach & (KDBUS_ATTACH_MASK_PROC_DST_AGNOSTIC|KDBUS_ATTACH_AUXGROUPS|KDBUS_ATTACH_NAMES), &size, staging->total_meta_name_size);
+       cnt += kdbus_meta_emit_stack_kvec(&staging->meta, dst, &parts[cnt], &meta_stack, attach, &size);
+       cnt += kdbus_meta_emit(kdbus_wrap_kvec(&parts[cnt]), kdbus_meta_payload_ptr(kdbus_meta_payload_of_staging_user(staging)), attach & (KDBUS_ATTACH_MASK_PROC_DST_AGNOSTIC|KDBUS_ATTACH_AUXGROUPS|KDBUS_ATTACH_NAMES), &size, staging->total_meta_name_size);
        if (attach & KDBUS_ATTACH_CONN_DESCRIPTION && (item = src->description)) {
                ulong item_size = item->size;
                parts[cnt].iov_base = item;
@@ -700,11 +700,34 @@ struct kdbus_pool_slice *kdbus_staging_user_emit(struct kdbus_staging_user *__re
 
        kdbus_assert(kdbus_pool_slice_size(slice) == size);
 
-       ret = kdbus_pool_slice_copy_iovec(&dst->pool, slice, parts,
-                                         staging->n_parts, size);
-       if (ret >= 0) /* all done, return slice to caller */
+       {
+               ulong count_parts;
+               for (count_parts = 0; count_parts < N_RESERVED_STAGING_USER_PARTS_BEFORE_PAYLOAD; count_parts++)
+                       size_before_payload += parts[count_parts].iov_len;
+       }
+
+       ret = kdbus_pool_slice_copy_kvec(&dst->pool, slice, 0, parts,
+                                         N_RESERVED_STAGING_USER_PARTS_BEFORE_PAYLOAD, size_before_payload);
+       if (ret < 0)
+               goto error_copy;
+
+       {
+               ulong count_parts;
+               for (count_parts = N_RESERVED_STAGING_USER_PARTS_BEFORE_PAYLOAD; count_parts < staging->n_parts; count_parts++) {
+                       if (parts[count_parts].iov_base != zeros)
+                               ret = kdbus_pool_slice_copy_iovec(&dst->pool, slice, size_before_payload, (struct iovec *)&parts[count_parts],
+                                               1, parts[count_parts].iov_len);
+                       else
+                               ret = kdbus_pool_slice_copy_kvec(&dst->pool, slice, size_before_payload, &parts[count_parts],
+                                               1, parts[count_parts].iov_len);
+                       if (ret < 0)
+                               goto error_copy;
+                       size_before_payload += parts[count_parts].iov_len;
+               }
                goto exit;
+       }
 
+error_copy:
        kdbus_pool_slice_release(&dst->pool, slice);
 error_quota:
        kdbus_conn_quota_dec(dst, src->user, size, n_fds);
@@ -733,7 +756,7 @@ struct kdbus_pool_slice *kdbus_staging_kernel_emit(struct kdbus_staging_kernel *
 {
        struct kdbus_pool_slice *slice = NULL;
        ulong size = KDBUS_ALIGN8(staging->msg->size);
-       struct iovec iov;
+       struct kvec iov;
        int ret;
 
        iov.iov_base = staging->msg;
@@ -757,7 +780,7 @@ struct kdbus_pool_slice *kdbus_staging_kernel_emit(struct kdbus_staging_kernel *
 
        kdbus_assert(kdbus_pool_slice_size(slice) == size);
 
-       if (0 <= (ret = kdbus_pool_slice_copy_iovec(&dst->pool, slice, &iov, 1, size))) /* all done, return slice to caller */
+       if (0 <= (ret = kdbus_pool_slice_copy_kvec(&dst->pool, slice, 0, &iov, 1, size))) /* all done, return slice to caller */
                goto exit;
 
        kdbus_pool_slice_release(&dst->pool, slice);
index 1e0d41bd6e7ef5847db9f038cb5835a76c825a4f..41e10870ea500aabdd4a0ec2351714b1bada1f56 100644 (file)
@@ -113,12 +113,12 @@ struct kdbus_staging_user {
        struct kdbus_msg msg[0];
 };
 
-/* timestamp item is stored directly after message proper, iovecs directly after timestamp */
+/* timestamp item is stored directly after message proper, kvecs directly after timestamp */
 static inline wur struct kdbus_item *kdbus_timestamp_of_staging_user(struct kdbus_staging_user *staging) {
        return (struct kdbus_item *)(KDBUS_ALIGN8((uintptr_t)staging->msg + (ulong)staging->msg->size));
 }
-static inline wur struct iovec *kdbus_parts_of_staging_user(struct kdbus_staging_user *staging) {
-       return (struct iovec *)((uintptr_t)kdbus_timestamp_of_staging_user(staging) + KDBUS_ITEM_SIZE(sizeof(struct kdbus_timestamp)));
+static inline wur struct kvec *kdbus_parts_of_staging_user(struct kdbus_staging_user *staging) {
+       return (struct kvec *)((uintptr_t)kdbus_timestamp_of_staging_user(staging) + KDBUS_ITEM_SIZE(sizeof(struct kdbus_timestamp)));
 }
 
 static inline wur struct kdbus_meta_payload *kdbus_meta_payload_of_staging_user(struct kdbus_staging_user *staging) {
index 5464c743c884fde52afe402a833293b2254443c2..94407d7dd8d88ef930a91d359c8651c78815a77f 100644 (file)
@@ -530,6 +530,7 @@ int kdbus_meta_payload_collect_names(struct kdbus_meta_payload *__restrict__ *__
                ulong item_size;
                if (owner->flags & KDBUS_NAME_IN_QUEUE)
                        continue;
+
                len = strlen(name = owner->name->name);
                item_size = KDBUS_ITEM_HEADER_SIZE + sizeof(struct kdbus_name) + len+1;
                if (unlikely((missing_space += KDBUS_ALIGN8(item_size)) > 0)) {
@@ -553,7 +554,7 @@ int kdbus_meta_payload_collect_names(struct kdbus_meta_payload *__restrict__ *__
        return total_size;
 }
 
-ulong _kdbus_meta_emit_(struct k_or_io_vec vec, struct kdbus_item *__restrict__ meta_item, ulong what, ulong *__restrict__ size, ulong total_meta_name_size)
+ulong kdbus_meta_emit(struct k_or_io_vec vec, struct kdbus_item *__restrict__ meta_item, ulong what, ulong *__restrict__ size, ulong total_meta_name_size)
 {
        ulong cnt = 0;
        struct kdbus_item *__restrict__ item = NULL;
index fbc033c6229d092286b02d81cd77c5ec3ac244bc..87bdc9cad388513b4e58902baec1abe106b56039 100644 (file)
@@ -254,14 +254,7 @@ static inline wur struct kdbus_item *kdbus_meta_payload_ptr(struct kdbus_meta_pa
 wur int kdbus_meta_proc_collect(struct kdbus_meta_payload *__restrict__ *__restrict__ pptr, ulong what);
 wur int kdbus_meta_fake_collect(struct kdbus_meta_payload *__restrict__ *__restrict__ pptr, const char *__restrict__ seclabel);
 
-wur ulong _kdbus_meta_emit_(struct k_or_io_vec vec, struct kdbus_item *meta_item, ulong what, ulong *size, ulong total_meta_name_size);
-
-static inline wur ulong kdbus_meta_emit_kvecs(struct kvec *vec, struct kdbus_item *meta_item, ulong what, ulong *size) {
-       return _kdbus_meta_emit_(kdbus_wrap_kvec(vec), meta_item, what, size, 0);
-}
-static inline wur ulong kdbus_meta_emit_iovecs(struct iovec *vec, struct kdbus_item *meta_item, ulong what, ulong *size, ulong total_meta_name_size) {
-       return _kdbus_meta_emit_(kdbus_wrap_iovec(vec), meta_item, what, size, total_meta_name_size);
-}
+wur ulong kdbus_meta_emit(struct k_or_io_vec vec, struct kdbus_item *meta_item, ulong what, ulong *size, ulong total_meta_name_size);
 
 wur int kdbus_meta_payload_collect_names(struct kdbus_meta_payload *__restrict__ *__restrict__ pptr, struct kdbus_conn const *__restrict__ owner_conn);
 
index c4dae5248602d48c688bbad2ede8a74c6a862d5e..ed2e61bd40c59dac2691ea8e1c143d34c08b3837 100644 (file)
@@ -83,7 +83,7 @@ static void kdbus_policy_entry_free(struct kdbus_policy_db_entry *e)
 
 static ulong kdbus_strnhash(const char *str, ulong len)
 {
-       ulong hash = init_name_hash(str);
+       ulong hash = init_name_hash(0);
 
        while (len--)
                hash = partial_name_hash(*str++, hash);
index 63e8b80814ea9d6854cab3def87043d78be4f880..d590c4ac51923281e39168bbad84d4ff542155e2 100644 (file)
@@ -484,7 +484,7 @@ void kdbus_pool_accounted(struct kdbus_pool *pool, ulong *size, ulong *acc)
  */
 int
 kdbus_pool_slice_copy_iovec(struct kdbus_pool *pool, const struct kdbus_pool_slice *slice,
-                           struct iovec *iov, ulong iov_len, ulong total_len)
+                           ulong off, struct iovec *iov, ulong iov_len, ulong total_len)
 {
        struct iov_iter iter;
        int len;
@@ -492,8 +492,10 @@ kdbus_pool_slice_copy_iovec(struct kdbus_pool *pool, const struct kdbus_pool_sli
        kdbus_assert(total_len <= slice->size);
 
        iov_iter_init(&iter, WRITE, iov, iov_len, total_len);
+
+       off += slice->off;
        {
-               loff_t off_ = slice->off;
+               loff_t off_ = off;
                len = vfs_iter_write(pool->f, &iter, &off_, 0);
        }
 
@@ -584,7 +586,7 @@ int kdbus_pool_slice_copy(struct kdbus_pool *dst_pool, const struct kdbus_pool_s
                }
 
                kaddr = (char __force __user *)kmap(page) + page_off;
-               n_read = __vfs_read(f_src, kaddr, copy_len, &off_src);
+               n_read = kernel_read(f_src, kaddr, copy_len, &off_src);
                kunmap(page);
                mark_page_accessed(page);
                flush_dcache_page(page);
index 3754b22795b3fb538eb6460fc4d3b31318173662..529ad7025a0d3f92939c863afc64fe73c4daed40 100644 (file)
@@ -109,6 +109,6 @@ wur int kdbus_pool_slice_copy_kvec(struct kdbus_pool *pool, const struct kdbus_p
                                   ulong off, struct kvec *kvec,
                                   ulong kvec_count, ulong total_len);
 wur int kdbus_pool_slice_copy_iovec(struct kdbus_pool *pool, const struct kdbus_pool_slice *slice,
-                                   struct iovec *iov, ulong iov_count, ulong total_len);
+                                  ulong off, struct iovec *iov, ulong iov_count, ulong total_len);
 
 #endif
index 597431c2b8871e7f0abc81d5d305d4adb6e499d2..c9c00dddf24239fd2d519e1545c3d06e2db8b343 100644 (file)
@@ -83,7 +83,7 @@
  */
 static inline wur ulong kdbus_strhash(const char *str)
 {
-       ulong hash = init_name_hash(str);
+       ulong hash = init_name_hash(0);
 
        while (*str)
                hash = partial_name_hash(*str++, hash);
index c1f4381b973031cc3ae6b2532b80e80f48be1baa..d8e3512f383b2a9f4c2703ff6c47d79264855888 100644 (file)
@@ -2,11 +2,11 @@ Name:           kdbusTest
 Summary:        Kdbus tests
 License:        Apache-2.0
 Group:          Base/IPC
-Version:        0.0.1
+Version:        4.14.99
 Release:        0
 Source:         %{name}-%{version}.tar.gz
-Source1001:     packaging/%{name}.manifest
-BuildRequires: libcap-devel
+Source1001:     %{name}.manifest
+BuildRequires: libcap-devel rsync
 
 %define _test_runner_dir /usr/lib/dbus-tests/runner
 
@@ -15,6 +15,7 @@ A single binary that tests kdbus operation.
 
 %prep
 %setup -q
+cp %{SOURCE1001} .
 
 %build
 make -C tools/testing/selftests/kdbus
@@ -26,4 +27,4 @@ make -C tools/testing/selftests/kdbus INSTALL_PATH=%{buildroot}%{_test_runner_di
 %files
 %defattr(-,root,root)
 %{_test_runner_dir}/kdbus-test
-%manifest packaging/%{name}.manifest
+%manifest %{name}.manifest
index 174674b075dc8d4383adfaf349028cf928e2e734..6cad2bae23049e8f113db31f0a5b49bd25785e06 100644 (file)
@@ -1,6 +1,6 @@
-CFLAGS += -I../../../../usr/include/
 CFLAGS += -I../../../../samples/kdbus/
-CFLAGS += -I../../../../include/uapi/
+#CFLAGS += -I../../../../include/uapi/
+CFLAGS += -I../../../../usr/include/
 CFLAGS += -std=c11 -Wall -Wextra -Wno-maybe-uninitialized -Wno-missing-field-initializers
 CFLAGS += -DKBUILD_MODNAME=\"kdbus\" -D_GNU_SOURCE
 LDLIBS = -pthread -lcap -lm
index 4f1e5797895fc7dce98177b77db670d3e919768f..4b642c64c0b03956f57b6e09170bf9e886201620 100644 (file)
@@ -11,7 +11,6 @@
 #include <string.h>
 #include <fcntl.h>
 #include <stdlib.h>
-#include <stddef.h>
 #include <unistd.h>
 #include <stdint.h>
 #include <errno.h>
index 7addb4409e79e87724aa61d38296675f304adeda..73e1c3994176efe0f42d05545f00d6bd5ccec35c 100644 (file)
@@ -29,7 +29,6 @@
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <linux/unistd.h>
-#include <linux/memfd.h>
 
 #ifndef __NR_memfd_create
   #ifdef __x86_64__
@@ -442,7 +441,7 @@ wur int sys_memfd_create(const char *name, __u64 size)
 {
        int ret, fd;
 
-       fd = syscall(__NR_memfd_create, name, MFD_ALLOW_SEALING);
+       fd = syscall(__NR_memfd_create, name, 2/*MFD_ALLOW_SEALING*/);
        if (fd < 0)
                return fd;