From patchwork Tue Nov 6 06:10:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sharat Masetty X-Patchwork-Id: 10669681 X-Patchwork-Delegate: agross@codeaurora.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7C25D18FD for ; Tue, 6 Nov 2018 06:10:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6653929A60 for ; Tue, 6 Nov 2018 06:10:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 53DEA29AB4; Tue, 6 Nov 2018 06:10:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 021B229A60 for ; Tue, 6 Nov 2018 06:10:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729605AbeKFPd5 (ORCPT ); Tue, 6 Nov 2018 10:33:57 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:57382 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729342AbeKFPd4 (ORCPT ); Tue, 6 Nov 2018 10:33:56 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 7316660316; Tue, 6 Nov 2018 06:10:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1541484621; bh=f5AB1iGI5di9YNUBEzqtoGEyGn/IQd9ivvTjrrB1Hj8=; h=From:To:Cc:Subject:Date:From; b=X6s7olJmo1OsgkFJWHtlyPLPYpMPAlLg470j47tbbBwrlk7bZGac9gSPQtu0JqliT epOkx0VQ/GEPt9osg0Cfp+vcbBEUXj9cpR5xZWji/TOA97YOB3I8hXL+Y21U6pW7H4 WLiTKb2/6KGRjyegE7HP93tSshVIkAfyg4HPJ1t0= Received: from smasetty-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: smasetty@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 71EF3602F4; Tue, 6 Nov 2018 06:10:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1541484620; bh=f5AB1iGI5di9YNUBEzqtoGEyGn/IQd9ivvTjrrB1Hj8=; h=From:To:Cc:Subject:Date:From; b=bOHTHhTG8cWeSlneLzLjytQ5OnQrJHS61W3S+VYwz9Qq77nXX7n6t3lcneVEtHQBh 256iMX/wxh0BBPAt77CJ95cJF5dAQ3PLYKCI/BsXB6i/VThGG5+aE2BYsMj8M0q3ws unkopXAAYwPvxYnIe5ueF557JVHaLCi9m+cfCk/4= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 71EF3602F4 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=smasetty@codeaurora.org From: Sharat Masetty To: freedreno@lists.freedesktop.org Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, chris@chris-wilson.co.uk, jcrouse@codeaurora.org, robdclark@gmail.com, linux-kernel@vger.kernel.org, Sharat Masetty Subject: [PATCH 1/3] drm/msm: use kvmalloc for ring data in gpu crashstate Date: Tue, 6 Nov 2018 11:40:04 +0530 Message-Id: <1541484606-20813-1-git-send-email-smasetty@codeaurora.org> X-Mailer: git-send-email 1.9.1 Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The ringbuffer data to capture at crashtime can end up being large sometimes, and the size can vary from being less than a page to the full size of 32KB. So use the kvmalloc variant that perfectly fits the bill. Signed-off-by: Sharat Masetty Reviewed-by: Jordan Crouse --- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index 141062f..c93702d 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -406,7 +406,7 @@ int adreno_gpu_state_get(struct msm_gpu *gpu, struct msm_gpu_state *state) size = j + 1; if (size) { - state->ring[i].data = kmalloc(size << 2, GFP_KERNEL); + state->ring[i].data = kvmalloc(size << 2, GFP_KERNEL); if (state->ring[i].data) { memcpy(state->ring[i].data, gpu->rb[i]->start, size << 2); state->ring[i].data_size = size << 2; @@ -445,7 +445,7 @@ void adreno_gpu_state_destroy(struct msm_gpu_state *state) int i; for (i = 0; i < ARRAY_SIZE(state->ring); i++) - kfree(state->ring[i].data); + kvfree(state->ring[i].data); for (i = 0; state->bos && i < state->nr_bos; i++) kvfree(state->bos[i].data); From patchwork Tue Nov 6 06:10:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sharat Masetty X-Patchwork-Id: 10669691 X-Patchwork-Delegate: agross@codeaurora.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1DC7315E9 for ; Tue, 6 Nov 2018 06:10:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0D04829A60 for ; Tue, 6 Nov 2018 06:10:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F389529AB4; Tue, 6 Nov 2018 06:10:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DF36829A60 for ; Tue, 6 Nov 2018 06:10:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730087AbeKFPeA (ORCPT ); Tue, 6 Nov 2018 10:34:00 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:57510 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729342AbeKFPd7 (ORCPT ); Tue, 6 Nov 2018 10:33:59 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 51DF4602F4; Tue, 6 Nov 2018 06:10:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1541484624; bh=8q51VbeDT1DoNSO7aS5ppssUjiaEFViWFx1QkplxRnA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AsF1ifcuUjvffRjZEdj0NrgL7rLjAZdOxvQGtu8ZdhEVWnuWm8Sxgo3hgbtYpYsEF FKvG51xA5pY+LQ02Dpkoi9aHzgGCyco5KcKuswu4CpEZ9V0jenwn/5l20zdAy6fgwN MI/RfYzRbfJIVpF8jnOpHpUHl4FmgrU7lw4ctl1E= Received: from smasetty-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: smasetty@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 5B06B605FD; Tue, 6 Nov 2018 06:10:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1541484623; bh=8q51VbeDT1DoNSO7aS5ppssUjiaEFViWFx1QkplxRnA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=I3m+zjhjfTIHz/VNcTzb5Fpc4OlaIa2ujR5ewjJYpc6hl/G2iuImIATHiCBkS+CvS rDeIg2YCATy13Xg1r2J8XcsMCvS+TgIcA1p2/ZB7gdvxXviZnojIBhmIcbuq/bX4/W MN1OlTI4v3eaLZZOUpP+0CRyyBHhlkgZJ0lLuetg= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 5B06B605FD Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=smasetty@codeaurora.org From: Sharat Masetty To: freedreno@lists.freedesktop.org Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, chris@chris-wilson.co.uk, jcrouse@codeaurora.org, robdclark@gmail.com, linux-kernel@vger.kernel.org, Sharat Masetty Subject: [PATCH 2/3] include/linux/ascii85: Add ascii85_encode_to_buf() Date: Tue, 6 Nov 2018 11:40:05 +0530 Message-Id: <1541484606-20813-2-git-send-email-smasetty@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1541484606-20813-1-git-send-email-smasetty@codeaurora.org> References: <1541484606-20813-1-git-send-email-smasetty@codeaurora.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add a new function which, in addition to ascii85 encoding to buffer also returns the length of the encoded string. The length return enables iteration over the output buffer space. This helps with efficient encoding of larger buffers, since we avoid an additional memcpy/scnprintf. Signed-off-by: Sharat Masetty --- include/linux/ascii85.h | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/include/linux/ascii85.h b/include/linux/ascii85.h index 4cc4020..3665899 100644 --- a/include/linux/ascii85.h +++ b/include/linux/ascii85.h @@ -23,8 +23,12 @@ { int i; - if (in == 0) - return "z"; + if (in == 0) { + out[0] = 'z'; + out[1] = '\0'; + + return out; + } out[5] = '\0'; for (i = 5; i--; ) { @@ -35,4 +39,15 @@ return out; } +static inline size_t +ascii85_encode_to_buf(u32 in, char *out) +{ + ascii85_encode(in, out); + + if (in == 0) + return 1; + + return 5; +} + #endif From patchwork Tue Nov 6 06:10:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sharat Masetty X-Patchwork-Id: 10669689 X-Patchwork-Delegate: agross@codeaurora.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 26A9B14BD for ; Tue, 6 Nov 2018 06:10:41 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 16ACA29A60 for ; Tue, 6 Nov 2018 06:10:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0AEF329AB4; Tue, 6 Nov 2018 06:10:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8D0EB29A60 for ; Tue, 6 Nov 2018 06:10:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730150AbeKFPeD (ORCPT ); Tue, 6 Nov 2018 10:34:03 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:57624 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729342AbeKFPeC (ORCPT ); Tue, 6 Nov 2018 10:34:02 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 13B0260ADB; Tue, 6 Nov 2018 06:10:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1541484627; bh=Cn3HO29ZZ1PWta/JA8C2cL6tD/wzqk1MvMJZ30dT5bk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YJrST7B/VE61p/ifamGYdJyYKDFoTD4YTEHJAFv3UD+mncXsBQTqMmbfFZnCMDr3P YGFHXl2pqM7b3Uw1YmwelBWe5siISoiK3R+EEXDrSNeJdAtzLnKVehgp4mP7r15Cbd NQOiQoXpuznF7z4iDR7X0oVi7RMoUo7m4l/fbg/E= Received: from smasetty-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: smasetty@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 428C360A9B; Tue, 6 Nov 2018 06:10:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1541484626; bh=Cn3HO29ZZ1PWta/JA8C2cL6tD/wzqk1MvMJZ30dT5bk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jbLnU8JR1Z5joEXHE0GJ04EA+cIHsZ2mttks74EpJLES46dxnBmHLMj3v88EZINFU bMRyJEBs4l3WRQoPadz0M2P7f3MNcwBn9Y+zNOkBR/Uvt46L2kUeLu4DIc8VV5xlFN Wn2z7xnFWn/q6+MifejKrCiJHEltC3jMQHCTi8jw= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 428C360A9B Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=smasetty@codeaurora.org From: Sharat Masetty To: freedreno@lists.freedesktop.org Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, chris@chris-wilson.co.uk, jcrouse@codeaurora.org, robdclark@gmail.com, linux-kernel@vger.kernel.org, Sharat Masetty Subject: [PATCH 3/3] drm/msm: Optimize adreno_show_object() Date: Tue, 6 Nov 2018 11:40:06 +0530 Message-Id: <1541484606-20813-3-git-send-email-smasetty@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1541484606-20813-1-git-send-email-smasetty@codeaurora.org> References: <1541484606-20813-1-git-send-email-smasetty@codeaurora.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When the userspace tries to read the crashstate dump, the read side implementation in the driver currently ascii85 encodes all the binary buffers and it does this each time the read system call is called. A userspace tool like cat typically does a page by page read and the number of read calls depends on the size of the data captured by the driver. This is certainly not desirable and does not scale well with large captures. This patch encodes the buffer only once in the read path. With this there is an immediate >10X speed improvement in crashstate save time. Signed-off-by: Sharat Masetty --- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 76 ++++++++++++++++++++++++--------- drivers/gpu/drm/msm/msm_gpu.h | 2 + 2 files changed, 58 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index c93702d..e29093e 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -475,34 +475,70 @@ int adreno_gpu_state_put(struct msm_gpu_state *state) #if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) -static void adreno_show_object(struct drm_printer *p, u32 *ptr, int len) +static char *adreno_gpu_ascii85_encode(u32 *src, size_t len) { - char out[ASCII85_BUFSZ]; - long l, datalen, i; + void *buf; + size_t buf_itr = 0; + long i, l; - if (!ptr || !len) - return; + if (!len) + return NULL; + + l = ascii85_encode_len(len); /* - * Only dump the non-zero part of the buffer - rarely will any data - * completely fill the entire allocated size of the buffer + * ascii85 outputs either a 5 byte string or a 1 byte string. So we + * account for the worst case of 5 bytes per dword plus the 1 for '\0' */ - for (datalen = 0, i = 0; i < len >> 2; i++) { - if (ptr[i]) - datalen = (i << 2) + 1; - } + buf = kvmalloc((l * 5) + 1, GFP_KERNEL); + if (!buf) + return NULL; - /* Skip printing the object if it is empty */ - if (datalen == 0) + for (i = 0; i < l; i++) + buf_itr += ascii85_encode_to_buf(src[i], buf + buf_itr); + + return buf; +} + +/* len is expected to be in bytes */ +static void adreno_show_object(struct drm_printer *p, void **ptr, int len, + bool *encoded) +{ + if (!*ptr || !len) return; - l = ascii85_encode_len(datalen); + if (!*encoded) { + long datalen, i; + u32 *buf = *ptr; + + /* + * Only dump the non-zero part of the buffer - rarely will + * any data completely fill the entire allocated size of + * the buffer. + */ + for (datalen = 0, i = 0; i < len >> 2; i++) { + if (buf[i]) + datalen = ((i + 1) << 2); + } + + /* + * If we reach here, then the originally captured binary buffer + * will be replaced with the ascii85 encoded string + */ + *ptr = adreno_gpu_ascii85_encode(buf, datalen); + + kvfree(buf); + + *encoded = true; + } + + if (!*ptr) + return; drm_puts(p, " data: !!ascii85 |\n"); drm_puts(p, " "); - for (i = 0; i < l; i++) - drm_puts(p, ascii85_encode(ptr[i], out)); + drm_puts(p, *ptr); drm_puts(p, "\n"); } @@ -534,8 +570,8 @@ void adreno_show(struct msm_gpu *gpu, struct msm_gpu_state *state, drm_printf(p, " wptr: %d\n", state->ring[i].wptr); drm_printf(p, " size: %d\n", MSM_GPU_RINGBUFFER_SZ); - adreno_show_object(p, state->ring[i].data, - state->ring[i].data_size); + adreno_show_object(p, &state->ring[i].data, + state->ring[i].data_size, &state->ring[i].encoded); } if (state->bos) { @@ -546,8 +582,8 @@ void adreno_show(struct msm_gpu *gpu, struct msm_gpu_state *state, state->bos[i].iova); drm_printf(p, " size: %zd\n", state->bos[i].size); - adreno_show_object(p, state->bos[i].data, - state->bos[i].size); + adreno_show_object(p, &state->bos[i].data, + state->bos[i].size, &state->bos[i].encoded); } } diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index f82bac0..efb49bb 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -187,6 +187,7 @@ struct msm_gpu_state_bo { u64 iova; size_t size; void *data; + bool encoded; }; struct msm_gpu_state { @@ -201,6 +202,7 @@ struct msm_gpu_state { u32 wptr; void *data; int data_size; + bool encoded; } ring[MSM_GPU_MAX_RINGS]; int nr_registers;