From: Adrian Szyndela Date: Fri, 9 Aug 2019 07:12:33 +0000 (+0200) Subject: changes I have made to make kdbus-perf work on 4.14.99 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3817fb78b2e0fad188dddd7c9a74bbad3e67b15e;p=platform%2Fkernel%2Flinux-exynos.git changes I have made to make kdbus-perf work on 4.14.99 --- diff --git a/ipc/kdbus/bus.c b/ipc/kdbus/bus.c index bbf9dcf75431..1ddf31c835d0 100644 --- a/ipc/kdbus/bus.c +++ b/ipc/kdbus/bus.c @@ -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); diff --git a/ipc/kdbus/connection.c b/ipc/kdbus/connection.c index 295dd94d32e0..dbfb7e7c1996 100644 --- a/ipc/kdbus/connection.c +++ b/ipc/kdbus/connection.c @@ -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); diff --git a/ipc/kdbus/handle.c b/ipc/kdbus/handle.c index a1186184f768..2bb73d32bc29 100644 --- a/ipc/kdbus/handle.c +++ b/ipc/kdbus/handle.c @@ -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++]; diff --git a/ipc/kdbus/message.c b/ipc/kdbus/message.c index 2d33eddba705..11980cfed338 100644 --- a/ipc/kdbus/message.c +++ b/ipc/kdbus/message.c @@ -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); diff --git a/ipc/kdbus/message.h b/ipc/kdbus/message.h index 1e0d41bd6e7e..41e10870ea50 100644 --- a/ipc/kdbus/message.h +++ b/ipc/kdbus/message.h @@ -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) { diff --git a/ipc/kdbus/metadata.c b/ipc/kdbus/metadata.c index 5464c743c884..94407d7dd8d8 100644 --- a/ipc/kdbus/metadata.c +++ b/ipc/kdbus/metadata.c @@ -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; diff --git a/ipc/kdbus/metadata.h b/ipc/kdbus/metadata.h index fbc033c6229d..87bdc9cad388 100644 --- a/ipc/kdbus/metadata.h +++ b/ipc/kdbus/metadata.h @@ -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); diff --git a/ipc/kdbus/policy.c b/ipc/kdbus/policy.c index c4dae5248602..ed2e61bd40c5 100644 --- a/ipc/kdbus/policy.c +++ b/ipc/kdbus/policy.c @@ -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); diff --git a/ipc/kdbus/pool.c b/ipc/kdbus/pool.c index 63e8b80814ea..d590c4ac5192 100644 --- a/ipc/kdbus/pool.c +++ b/ipc/kdbus/pool.c @@ -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); diff --git a/ipc/kdbus/pool.h b/ipc/kdbus/pool.h index 3754b22795b3..529ad7025a0d 100644 --- a/ipc/kdbus/pool.h +++ b/ipc/kdbus/pool.h @@ -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 diff --git a/ipc/kdbus/util.h b/ipc/kdbus/util.h index 597431c2b887..c9c00dddf242 100644 --- a/ipc/kdbus/util.h +++ b/ipc/kdbus/util.h @@ -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); diff --git a/packaging/kdbusTest.spec b/packaging/kdbusTest.spec index c1f4381b9730..d8e3512f383b 100644 --- a/packaging/kdbusTest.spec +++ b/packaging/kdbusTest.spec @@ -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 diff --git a/tools/testing/selftests/kdbus/Makefile b/tools/testing/selftests/kdbus/Makefile index 174674b075dc..6cad2bae2304 100644 --- a/tools/testing/selftests/kdbus/Makefile +++ b/tools/testing/selftests/kdbus/Makefile @@ -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 diff --git a/tools/testing/selftests/kdbus/kdbus-enum.c b/tools/testing/selftests/kdbus/kdbus-enum.c index 4f1e5797895f..4b642c64c0b0 100644 --- a/tools/testing/selftests/kdbus/kdbus-enum.c +++ b/tools/testing/selftests/kdbus/kdbus-enum.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include diff --git a/tools/testing/selftests/kdbus/kdbus-util.c b/tools/testing/selftests/kdbus/kdbus-util.c index 7addb4409e79..73e1c3994176 100644 --- a/tools/testing/selftests/kdbus/kdbus-util.c +++ b/tools/testing/selftests/kdbus/kdbus-util.c @@ -29,7 +29,6 @@ #include #include #include -#include #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;