Message ID | 1638277072-6459-4-git-send-email-jeyr@codeaurora.org (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | None | expand |
Hi Jeya,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on char-misc/char-misc-testing]
[also build test ERROR on v5.16-rc3 next-20211130]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Jeya-R/misc-fastrpc-Add-fdlist-implementation/20211130-215833
base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 5d331b5922551637c586cdf5fdc1778910fc937f
config: x86_64-buildonly-randconfig-r004-20211130 (https://download.01.org/0day-ci/archive/20211201/202112010626.i5LYELFF-lkp@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
# https://github.com/0day-ci/linux/commit/b29c5611eb2bd23a416730b8067a107bcc8594a7
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Jeya-R/misc-fastrpc-Add-fdlist-implementation/20211130-215833
git checkout b29c5611eb2bd23a416730b8067a107bcc8594a7
# save the config file to linux build tree
mkdir build_dir
make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/misc/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
drivers/misc/fastrpc.c: In function 'fastrpc_get_meta_size':
drivers/misc/fastrpc.c:721:24: error: 'fastrpc_remote_arg' defined as wrong kind of tag
721 | size = (sizeof(struct fastrpc_remote_arg) +
| ^~~~~~~~~~~~~~~~~~
drivers/misc/fastrpc.c:721:17: error: invalid application of 'sizeof' to incomplete type 'struct fastrpc_remote_arg'
721 | size = (sizeof(struct fastrpc_remote_arg) +
| ^~~~~~
drivers/misc/fastrpc.c: In function 'fastrpc_put_args':
drivers/misc/fastrpc.c:925:9: error: 'fastrpc_remote_arg' defined as wrong kind of tag
925 | struct fastrpc_remote_arg *rpra = ctx->rpra;
| ^~~~~~~~~~~~~~~~~~
drivers/misc/fastrpc.c:925:36: error: initialization of 'struct fastrpc_remote_arg *' from incompatible pointer type 'union fastrpc_remote_arg *' [-Werror=incompatible-pointer-types]
925 | struct fastrpc_remote_arg *rpra = ctx->rpra;
| ^~~
>> drivers/misc/fastrpc.c:935:49: error: dereferencing pointer to incomplete type 'struct fastrpc_remote_arg'
935 | list = ctx->buf->virt + ctx->nscalars * sizeof(*rpra);
| ^~~~~
drivers/misc/fastrpc.c:942:39: error: invalid use of undefined type 'struct fastrpc_remote_arg'
942 | void *src = (void *)(uintptr_t)rpra[i].pv;
| ^
drivers/misc/fastrpc.c:944:18: error: invalid use of undefined type 'struct fastrpc_remote_arg'
944 | u64 len = rpra[i].len;
| ^
drivers/misc/fastrpc.c:958:25: error: 'fl' undeclared (first use in this function); did you mean 'fd'?
958 | if (!fastrpc_map_find(fl, (int)fdlist[i], &mmap))
| ^~
| fd
drivers/misc/fastrpc.c:958:25: note: each undeclared identifier is reported only once for each function it appears in
At top level:
drivers/misc/fastrpc.c:717:12: warning: 'fastrpc_get_meta_size' defined but not used [-Wunused-function]
717 | static int fastrpc_get_meta_size(struct fastrpc_invoke_ctx *ctx)
| ^~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
vim +935 drivers/misc/fastrpc.c
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 921
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 922 static int fastrpc_put_args(struct fastrpc_invoke_ctx *ctx,
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 923 u32 kernel)
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 924 {
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 925 struct fastrpc_remote_arg *rpra = ctx->rpra;
d9eaed76074c94 Jeya R 2021-11-30 926 struct fastrpc_map *mmap = NULL;
d9eaed76074c94 Jeya R 2021-11-30 927 struct fastrpc_invoke_buf *list;
d9eaed76074c94 Jeya R 2021-11-30 928 struct fastrpc_phy_page *pages;
d9eaed76074c94 Jeya R 2021-11-30 929 u64 *fdlist;
d9eaed76074c94 Jeya R 2021-11-30 930 int i, inbufs, outbufs, handles;
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 931
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 932 inbufs = REMOTE_SCALARS_INBUFS(ctx->sc);
d9eaed76074c94 Jeya R 2021-11-30 933 outbufs = REMOTE_SCALARS_OUTBUFS(ctx->sc);
d9eaed76074c94 Jeya R 2021-11-30 934 handles = REMOTE_SCALARS_INHANDLES(ctx->sc) + REMOTE_SCALARS_OUTHANDLES(ctx->sc);
d9eaed76074c94 Jeya R 2021-11-30 @935 list = ctx->buf->virt + ctx->nscalars * sizeof(*rpra);
d9eaed76074c94 Jeya R 2021-11-30 936 pages = ctx->buf->virt + ctx->nscalars * (sizeof(*list) +
d9eaed76074c94 Jeya R 2021-11-30 937 sizeof(*rpra));
d9eaed76074c94 Jeya R 2021-11-30 938 fdlist = (uint64_t *)(pages + inbufs + outbufs + handles);
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 939
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 940 for (i = inbufs; i < ctx->nbufs; ++i) {
847afd7bd5607c Jeya R 2021-09-23 941 if (!ctx->maps[i]) {
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 942 void *src = (void *)(uintptr_t)rpra[i].pv;
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 943 void *dst = (void *)(uintptr_t)ctx->args[i].ptr;
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 944 u64 len = rpra[i].len;
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 945
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 946 if (!kernel) {
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 947 if (copy_to_user((void __user *)dst, src, len))
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 948 return -EFAULT;
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 949 } else {
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 950 memcpy(dst, src, len);
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 951 }
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 952 }
847afd7bd5607c Jeya R 2021-09-23 953 }
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 954
d9eaed76074c94 Jeya R 2021-11-30 955 for (i = 0; i < FASTRPC_MAX_FDLIST; i++) {
d9eaed76074c94 Jeya R 2021-11-30 956 if (!fdlist[i])
d9eaed76074c94 Jeya R 2021-11-30 957 break;
d9eaed76074c94 Jeya R 2021-11-30 958 if (!fastrpc_map_find(fl, (int)fdlist[i], &mmap))
d9eaed76074c94 Jeya R 2021-11-30 959 fastrpc_map_put(mmap);
d9eaed76074c94 Jeya R 2021-11-30 960 }
d9eaed76074c94 Jeya R 2021-11-30 961
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 962 return 0;
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 963 }
c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 964
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Jeya, Thank you for the patch! Yet something to improve: [auto build test ERROR on char-misc/char-misc-testing] [also build test ERROR on v5.16-rc3 next-20211130] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Jeya-R/misc-fastrpc-Add-fdlist-implementation/20211130-215833 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 5d331b5922551637c586cdf5fdc1778910fc937f config: sh-allmodconfig (https://download.01.org/0day-ci/archive/20211201/202112010836.zEFVht0Q-lkp@intel.com/config) compiler: sh4-linux-gcc (GCC) 11.2.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/b29c5611eb2bd23a416730b8067a107bcc8594a7 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Jeya-R/misc-fastrpc-Add-fdlist-implementation/20211130-215833 git checkout b29c5611eb2bd23a416730b8067a107bcc8594a7 # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=sh SHELL=/bin/bash drivers/misc/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): drivers/misc/fastrpc.c: In function 'fastrpc_get_meta_size': >> drivers/misc/fastrpc.c:721:31: error: 'fastrpc_remote_arg' defined as wrong kind of tag 721 | size = (sizeof(struct fastrpc_remote_arg) + | ^~~~~~~~~~~~~~~~~~ >> drivers/misc/fastrpc.c:721:24: error: invalid application of 'sizeof' to incomplete type 'struct fastrpc_remote_arg' 721 | size = (sizeof(struct fastrpc_remote_arg) + | ^~~~~~ drivers/misc/fastrpc.c: In function 'fastrpc_put_args': drivers/misc/fastrpc.c:925:16: error: 'fastrpc_remote_arg' defined as wrong kind of tag 925 | struct fastrpc_remote_arg *rpra = ctx->rpra; | ^~~~~~~~~~~~~~~~~~ >> drivers/misc/fastrpc.c:925:43: error: initialization of 'struct fastrpc_remote_arg *' from incompatible pointer type 'union fastrpc_remote_arg *' [-Werror=incompatible-pointer-types] 925 | struct fastrpc_remote_arg *rpra = ctx->rpra; | ^~~ drivers/misc/fastrpc.c:935:55: error: invalid application of 'sizeof' to incomplete type 'struct fastrpc_remote_arg' 935 | list = ctx->buf->virt + ctx->nscalars * sizeof(*rpra); | ^ drivers/misc/fastrpc.c:937:23: error: invalid application of 'sizeof' to incomplete type 'struct fastrpc_remote_arg' 937 | sizeof(*rpra)); | ^ >> drivers/misc/fastrpc.c:942:60: error: invalid use of undefined type 'struct fastrpc_remote_arg' 942 | void *src = (void *)(uintptr_t)rpra[i].pv; | ^ drivers/misc/fastrpc.c:942:63: error: invalid use of undefined type 'struct fastrpc_remote_arg' 942 | void *src = (void *)(uintptr_t)rpra[i].pv; | ^ drivers/misc/fastrpc.c:944:39: error: invalid use of undefined type 'struct fastrpc_remote_arg' 944 | u64 len = rpra[i].len; | ^ drivers/misc/fastrpc.c:944:42: error: invalid use of undefined type 'struct fastrpc_remote_arg' 944 | u64 len = rpra[i].len; | ^ drivers/misc/fastrpc.c:958:39: error: 'fl' undeclared (first use in this function); did you mean 'fd'? 958 | if (!fastrpc_map_find(fl, (int)fdlist[i], &mmap)) | ^~ | fd drivers/misc/fastrpc.c:958:39: note: each undeclared identifier is reported only once for each function it appears in At top level: drivers/misc/fastrpc.c:717:12: warning: 'fastrpc_get_meta_size' defined but not used [-Wunused-function] 717 | static int fastrpc_get_meta_size(struct fastrpc_invoke_ctx *ctx) | ^~~~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/fastrpc_remote_arg +721 drivers/misc/fastrpc.c c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 689 c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 690 /* c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 691 * Fastrpc payload buffer with metadata looks like: c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 692 * c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 693 * >>>>>> START of METADATA <<<<<<<<< c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 694 * +---------------------------------+ c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 695 * | Arguments | c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 696 * | type:(struct fastrpc_remote_arg)| c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 697 * | (0 - N) | c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 698 * +---------------------------------+ c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 699 * | Invoke Buffer list | c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 700 * | type:(struct fastrpc_invoke_buf)| c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 701 * | (0 - N) | c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 702 * +---------------------------------+ c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 703 * | Page info list | c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 704 * | type:(struct fastrpc_phy_page) | c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 705 * | (0 - N) | c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 706 * +---------------------------------+ c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 707 * | Optional info | c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 708 * |(can be specific to SoC/Firmware)| c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 709 * +---------------------------------+ c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 710 * >>>>>>>> END of METADATA <<<<<<<<< c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 711 * +---------------------------------+ c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 712 * | Inline ARGS | c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 713 * | (0-N) | c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 714 * +---------------------------------+ c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 715 */ c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 716 c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 717 static int fastrpc_get_meta_size(struct fastrpc_invoke_ctx *ctx) c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 718 { c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 719 int size = 0; c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 720 c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 @721 size = (sizeof(struct fastrpc_remote_arg) + c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 722 sizeof(struct fastrpc_invoke_buf) + c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 723 sizeof(struct fastrpc_phy_page)) * ctx->nscalars + c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 724 sizeof(u64) * FASTRPC_MAX_FDLIST + c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 725 sizeof(u32) * FASTRPC_MAX_CRCLIST; c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 726 c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 727 return size; c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 728 } c68cfb718c8f97 Srinivas Kandagatla 2019-02-08 729 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c index 3c937ff..77071ee3 100644 --- a/drivers/misc/fastrpc.c +++ b/drivers/misc/fastrpc.c @@ -92,9 +92,20 @@ struct fastrpc_invoke_buf { u32 pgidx; /* index to start of contiguous region */ }; -struct fastrpc_remote_arg { - u64 pv; - u64 len; +struct fastrpc_remote_dmahandle { + s32 fd; /* dma handle fd */ + u32 offset; /* dma handle offset */ + u32 len; /* dma handle length */ +}; + +struct fastrpc_remote_buf { + u64 pv; /* buffer pointer */ + u64 len; /* length of buffer */ +}; + +union fastrpc_remote_arg { + struct fastrpc_remote_buf buf; + struct fastrpc_remote_dmahandle dma; }; struct fastrpc_mmap_rsp_msg { @@ -189,7 +200,7 @@ struct fastrpc_invoke_ctx { struct work_struct put_work; struct fastrpc_msg msg; struct fastrpc_user *fl; - struct fastrpc_remote_arg *rpra; + union fastrpc_remote_arg *rpra; struct fastrpc_map **maps; struct fastrpc_buf *buf; struct fastrpc_invoke_args *args; @@ -760,12 +771,26 @@ static int fastrpc_create_maps(struct fastrpc_invoke_ctx *ctx) return 0; } +static struct fastrpc_invoke_buf *fastrpc_invoke_buf_start(union fastrpc_remote_arg *pra, u32 sc) +{ + unsigned int len = REMOTE_SCALARS_LENGTH(sc); + + return (struct fastrpc_invoke_buf *)(&pra[len]); +} + +static struct fastrpc_phy_page *fastrpc_phy_page_start(u32 sc, struct fastrpc_invoke_buf *buf) +{ + unsigned int len = REMOTE_SCALARS_LENGTH(sc); + + return (struct fastrpc_phy_page *)(&buf[len]); +} + static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx) { struct device *dev = ctx->fl->sctx->dev; - struct fastrpc_remote_arg *rpra; + union fastrpc_remote_arg *rpra = NULL; struct fastrpc_invoke_buf *list; - struct fastrpc_phy_page *pages; + struct fastrpc_phy_page *pages, *ipage; int inbufs, i, oix, err = 0; u64 len, rlen, pkt_size; u64 pg_start, pg_end; @@ -773,7 +798,13 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx) int metalen; inbufs = REMOTE_SCALARS_INBUFS(ctx->sc); - metalen = fastrpc_get_meta_size(ctx); + list = fastrpc_invoke_buf_start(rpra, ctx->sc); + pages = fastrpc_phy_page_start(ctx->sc, list); + ipage = pages; + ipage += ctx->nscalars; + metalen = (size_t)&ipage[0] + + sizeof(u64) * FASTRPC_MAX_FDLIST + + sizeof(u32) * FASTRPC_MAX_CRCLIST; pkt_size = fastrpc_get_payload_size(ctx, metalen); err = fastrpc_create_maps(ctx); @@ -788,12 +819,11 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx) memset(ctx->buf->virt, 0, pkt_size); rpra = ctx->buf->virt; - list = ctx->buf->virt + ctx->nscalars * sizeof(*rpra); - pages = ctx->buf->virt + ctx->nscalars * (sizeof(*list) + - sizeof(*rpra)); + ctx->rpra = rpra; + list = fastrpc_invoke_buf_start(rpra, ctx->sc); + pages = fastrpc_phy_page_start(ctx->sc, list); args = (uintptr_t)ctx->buf->virt + metalen; rlen = pkt_size - metalen; - ctx->rpra = rpra; for (oix = 0; oix < ctx->nbufs; ++oix) { int mlen; @@ -801,8 +831,8 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx) i = ctx->olaps[oix].raix; len = ctx->args[i].length; - rpra[i].pv = 0; - rpra[i].len = len; + rpra[i].buf.pv = 0; + rpra[i].buf.len = len; list[i].num = len ? 1 : 0; list[i].pgidx = i; @@ -812,7 +842,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx) if (ctx->maps[i]) { struct vm_area_struct *vma = NULL; - rpra[i].pv = (u64) ctx->args[i].ptr; + rpra[i].buf.pv = (u64) ctx->args[i].ptr; pages[i].addr = ctx->maps[i]->phys; mmap_read_lock(current->mm); @@ -839,7 +869,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx) if (rlen < mlen) goto bail; - rpra[i].pv = args - ctx->olaps[oix].offset; + rpra[i].buf.pv = args - ctx->olaps[oix].offset; pages[i].addr = ctx->buf->phys - ctx->olaps[oix].offset + (pkt_size - rlen); @@ -853,7 +883,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx) } if (i < inbufs && !ctx->maps[i]) { - void *dst = (void *)(uintptr_t)rpra[i].pv; + void *dst = (void *)(uintptr_t)rpra[i].buf.pv; void *src = (void *)(uintptr_t)ctx->args[i].ptr; if (!kernel) { @@ -869,12 +899,17 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx) } for (i = ctx->nbufs; i < ctx->nscalars; ++i) { - rpra[i].pv = (u64) ctx->args[i].ptr; - rpra[i].len = ctx->args[i].length; + rpra[i].buf.pv = (u64) ctx->args[i].ptr; + rpra[i].buf.len = ctx->args[i].length; list[i].num = ctx->args[i].length ? 1 : 0; list[i].pgidx = i; - pages[i].addr = ctx->maps[i]->phys; - pages[i].size = ctx->maps[i]->size; + if (ctx->maps[i]) { + pages[i].addr = ctx->maps[i]->phys; + pages[i].size = ctx->maps[i]->size; + } + rpra[i].dma.fd = ctx->args[i].fd; + rpra[i].dma.len = ctx->args[i].length; + rpra[i].dma.offset = (u64) ctx->args[i].ptr; } bail:
Add dma handle instructions to remote arguments. Signed-off-by: Jeya R <jeyr@codeaurora.org> --- drivers/misc/fastrpc.c | 75 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 20 deletions(-)