From patchwork Tue Jan 16 16:34:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 124741 Delivered-To: patch@linaro.org Received: by 10.46.64.148 with SMTP id r20csp1071919lje; Tue, 16 Jan 2018 08:34:33 -0800 (PST) X-Google-Smtp-Source: ACJfBotz/r1Aq81xXaudD1AHhjOh8nf4vncjxALA5FaJ37GI1J9KaEkVADuXa80R8vw9gF+hgn7B X-Received: by 10.101.98.216 with SMTP id m24mr30361292pgv.100.1516120472931; Tue, 16 Jan 2018 08:34:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516120472; cv=none; d=google.com; s=arc-20160816; b=H8bI9MgiyUepFTnjMJg4apM2VmL614f5nQSZyZOfqDbVPmZuleGLNs8BgKAhT5FRPe l+zbbedshZjyAW3Y/EM11DJ7Cd0oo6Q2tfJ4uhl5ufLmAWj7qn+077Zn7TS8vHR4lLtP /WXKGBhBmWfZLMrEOeoSc4sgoVBifregNIwoGUpGgUA/dl3axB7x1Pd/9d0aMu0+8fxs tXlZjqXwGBJ3Cz3jzq7g7E+u4yW94KLqvb7wTmIQa0hxWBWgopDVmYSKcxWNKXVOiIJ9 iKau0hAkwcXHMuTIepzji2iVpT3klRuKg4zSEpVxogcFyi3OWem+vCaJoBlsQ6Ow+3fa hOJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=NgklZYSGfHTTatJk7PfeHzL3FsDwOuRhWl3qT314Vcs=; b=rqXXJ0XAHx3Ke7oWGfBN03HJThIngcI3ZcouODj/gYPVRrBeC5gnELQ8J6KLlITmry /QcS1A2A6Ocf/mjlzRP4NZGHJz/HkIDo80yW9jKMe8MNlCS1v/4kMufp/E5XvtOkBy1G QB7/6vN00P+TcGlTboN+ba2rTK8cjRusLKKK6bweyW2jT/yPBe7VWJ5QZh9bpKMmw9nd WMCa8KzhaomTe4GDOQs6zaLo3HVPXGyJm6FUPq8zMu2i4rfZF6kLgqRy9ufBdsTYx+r5 MNY693jPa/4XQzeQe9IPiC5MdDbeesReVoQtkFQolTtMFvvDi7JRmNpiDoontN1aNl/W 06pQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ay8si2267051plb.52.2018.01.16.08.34.32; Tue, 16 Jan 2018 08:34:32 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751449AbeAPQeb (ORCPT + 28 others); Tue, 16 Jan 2018 11:34:31 -0500 Received: from mout.kundenserver.de ([212.227.126.131]:58351 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750878AbeAPQe3 (ORCPT ); Tue, 16 Jan 2018 11:34:29 -0500 Received: from wuerfel.lan ([95.208.111.237]) by mrelayeu.kundenserver.de (mreue003 [212.227.15.129]) with ESMTPA (Nemesis) id 0M8mxE-1egwmA1edY-00CBoT; Tue, 16 Jan 2018 17:34:22 +0100 From: Arnd Bergmann To: Dmitry Tarnyagin , "David S. Miller" Cc: Arnd Bergmann , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] caif: reduce stack size with KASAN Date: Tue, 16 Jan 2018 17:34:00 +0100 Message-Id: <20180116163417.1580826-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:YFlohM6P0VZmJ6C7yRhNBzzQrXf29bltTEEgLEmNtGR0to46H/8 t84rnbBv/coAhvnyKynu0JU6DcKKCJ+WY6XO7TpfMYTMdJ5ylnGoPk6QnEr/LIej6dBm+/Y WJ4hYafZaI9oGCKLo/VEVsWAgbKRVbtqv4d9TzN2hjAjwzWk0fy1VarzpLZkqn/NaPgEnCT M3bzQGzAs6sLP36m0EkCA== X-UI-Out-Filterresults: notjunk:1; V01:K0:iIPAH8XGZZQ=:iFPT2UAU6OQBh5rcHNhkn/ pWtjsSSWbTdIO4r14lL/j26o4Z3/Y+JEoQD9Dm7UdV7/qIY1lat8+FWYKLaoGRxVmNEkWEViN im7ZRBOZw5tpUpsdIjPY/1Nw428qRQrBtC16jDvDEjGntWVYTS/hrBrdQhJ8bdaFFJr+RYtHl DtMl9npCj1OqIVOjF6fZ16RCya3DL08oJP+YTqxq9vOqb2rqWqzk9oMUqpRERsg3sbSspIs8D DbU/E/0UR8f+uBDc1mgn92mecn4JZ+vYScRuyauGhTFLuD2uVeuruKM6m4ratI4FRQnQK/Y0D ZiEgxj1fQ91uXdU30aY4R/lJHvFSylhkvISzPhCnwRCuvgbsmlYf2q8atPRvO8YovOtmzYzKQ 4ANQZz562LcXGGQbRGrlxdk7+nYRvozTOAtozCqQoN5XYiiEkgeGdahVnQFbC5dICfFsD+fE+ ft8TXklroCbIByu6OpGpPZD9wYRNGPaVFvmZHWAmazg5bvHiKWORwU/QnctMyRHSUrfCP9U/v F1BBLNiFJFBD+thd/T91urx8qC/9mV5eAKUXcKIIUAbDxlSxgkj+TSSwmoJMetQAXdd/xcJaH TEAecfz8WX1Cd5sX7d0n1M6xDzq8nPHdcpiqNmmkg5lIzpdV05d4JV2SH6izV6MaM/lUc0efl pIt3OaaRGE+KxcvDicoe7pnXsyjkd0JNo0JabDGtZEIgw9H8ZNfkIT3UitNXkSA4T2afXCQKV BTV2SboGrSVMl4EzVLuFM/+7Lmz6k9VoEM0D6Q== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When CONFIG_KASAN is set, we can use relatively large amounts of kernel stack space: net/caif/cfctrl.c:555:1: warning: the frame size of 1600 bytes is larger than 1280 bytes [-Wframe-larger-than=] This adds convenience wrappers around cfpkt_extr_head(), which is responsible for most of the stack growth. With those wrapper functions, gcc apparently starts reusing the stack slots for each instance, thus avoiding the problem. Signed-off-by: Arnd Bergmann --- I sent this in December, but apparently got the wrong Cc list. It also seems that Dmitry Tarnyagin's email address as listed in the MAINTAINERS file is invalid. Resending now. --- include/net/caif/cfpkt.h | 27 ++++++++++++++++++++++++++ net/caif/cfctrl.c | 50 +++++++++++++++++++++--------------------------- 2 files changed, 49 insertions(+), 28 deletions(-) -- 2.9.0 diff --git a/include/net/caif/cfpkt.h b/include/net/caif/cfpkt.h index fe328c52c46b..801489bb14c3 100644 --- a/include/net/caif/cfpkt.h +++ b/include/net/caif/cfpkt.h @@ -32,6 +32,33 @@ void cfpkt_destroy(struct cfpkt *pkt); */ int cfpkt_extr_head(struct cfpkt *pkt, void *data, u16 len); +static inline u8 cfpkt_extr_head_u8(struct cfpkt *pkt) +{ + u8 tmp; + + cfpkt_extr_head(pkt, &tmp, 1); + + return tmp; +} + +static inline u16 cfpkt_extr_head_u16(struct cfpkt *pkt) +{ + __le16 tmp; + + cfpkt_extr_head(pkt, &tmp, 2); + + return le16_to_cpu(tmp); +} + +static inline u32 cfpkt_extr_head_u32(struct cfpkt *pkt) +{ + __le32 tmp; + + cfpkt_extr_head(pkt, &tmp, 4); + + return le32_to_cpu(tmp); +} + /* * Peek header from packet. * Reads data from packet without changing packet. diff --git a/net/caif/cfctrl.c b/net/caif/cfctrl.c index 655ed7032150..a1e85f032108 100644 --- a/net/caif/cfctrl.c +++ b/net/caif/cfctrl.c @@ -352,15 +352,14 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) u8 cmdrsp; u8 cmd; int ret = -1; - u16 tmp16; u8 len; u8 param[255]; - u8 linkid; + u8 linkid = 0; struct cfctrl *cfctrl = container_obj(layer); struct cfctrl_request_info rsp, *req; - cfpkt_extr_head(pkt, &cmdrsp, 1); + cmdrsp = cfpkt_extr_head_u8(pkt); cmd = cmdrsp & CFCTRL_CMD_MASK; if (cmd != CFCTRL_CMD_LINK_ERR && CFCTRL_RSP_BIT != (CFCTRL_RSP_BIT & cmdrsp) @@ -378,13 +377,12 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) u8 physlinkid; u8 prio; u8 tmp; - u32 tmp32; u8 *cp; int i; struct cfctrl_link_param linkparam; memset(&linkparam, 0, sizeof(linkparam)); - cfpkt_extr_head(pkt, &tmp, 1); + tmp = cfpkt_extr_head_u8(pkt); serv = tmp & CFCTRL_SRV_MASK; linkparam.linktype = serv; @@ -392,13 +390,13 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) servtype = tmp >> 4; linkparam.chtype = servtype; - cfpkt_extr_head(pkt, &tmp, 1); + tmp = cfpkt_extr_head_u8(pkt); physlinkid = tmp & 0x07; prio = tmp >> 3; linkparam.priority = prio; linkparam.phyid = physlinkid; - cfpkt_extr_head(pkt, &endpoint, 1); + endpoint = cfpkt_extr_head_u8(pkt); linkparam.endpoint = endpoint & 0x03; switch (serv) { @@ -407,45 +405,43 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) if (CFCTRL_ERR_BIT & cmdrsp) break; /* Link ID */ - cfpkt_extr_head(pkt, &linkid, 1); + linkid = cfpkt_extr_head_u8(pkt); break; case CFCTRL_SRV_VIDEO: - cfpkt_extr_head(pkt, &tmp, 1); + tmp = cfpkt_extr_head_u8(pkt); linkparam.u.video.connid = tmp; if (CFCTRL_ERR_BIT & cmdrsp) break; /* Link ID */ - cfpkt_extr_head(pkt, &linkid, 1); + linkid = cfpkt_extr_head_u8(pkt); break; case CFCTRL_SRV_DATAGRAM: - cfpkt_extr_head(pkt, &tmp32, 4); linkparam.u.datagram.connid = - le32_to_cpu(tmp32); + cfpkt_extr_head_u32(pkt); if (CFCTRL_ERR_BIT & cmdrsp) break; /* Link ID */ - cfpkt_extr_head(pkt, &linkid, 1); + linkid = cfpkt_extr_head_u8(pkt); break; case CFCTRL_SRV_RFM: /* Construct a frame, convert * DatagramConnectionID * to network format long and copy it out... */ - cfpkt_extr_head(pkt, &tmp32, 4); linkparam.u.rfm.connid = - le32_to_cpu(tmp32); + cfpkt_extr_head_u32(pkt); cp = (u8 *) linkparam.u.rfm.volume; - for (cfpkt_extr_head(pkt, &tmp, 1); + for (tmp = cfpkt_extr_head_u8(pkt); cfpkt_more(pkt) && tmp != '\0'; - cfpkt_extr_head(pkt, &tmp, 1)) + tmp = cfpkt_extr_head_u8(pkt)) *cp++ = tmp; *cp = '\0'; if (CFCTRL_ERR_BIT & cmdrsp) break; /* Link ID */ - cfpkt_extr_head(pkt, &linkid, 1); + linkid = cfpkt_extr_head_u8(pkt); break; case CFCTRL_SRV_UTIL: @@ -454,13 +450,11 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) * to network format long and copy it out... */ /* Fifosize KB */ - cfpkt_extr_head(pkt, &tmp16, 2); linkparam.u.utility.fifosize_kb = - le16_to_cpu(tmp16); + cfpkt_extr_head_u16(pkt); /* Fifosize bufs */ - cfpkt_extr_head(pkt, &tmp16, 2); linkparam.u.utility.fifosize_bufs = - le16_to_cpu(tmp16); + cfpkt_extr_head_u16(pkt); /* name */ cp = (u8 *) linkparam.u.utility.name; caif_assert(sizeof(linkparam.u.utility.name) @@ -468,24 +462,24 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) for (i = 0; i < UTILITY_NAME_LENGTH && cfpkt_more(pkt); i++) { - cfpkt_extr_head(pkt, &tmp, 1); + tmp = cfpkt_extr_head_u8(pkt); *cp++ = tmp; } /* Length */ - cfpkt_extr_head(pkt, &len, 1); + len = cfpkt_extr_head_u8(pkt); linkparam.u.utility.paramlen = len; /* Param Data */ cp = linkparam.u.utility.params; while (cfpkt_more(pkt) && len--) { - cfpkt_extr_head(pkt, &tmp, 1); + tmp = cfpkt_extr_head_u8(pkt); *cp++ = tmp; } if (CFCTRL_ERR_BIT & cmdrsp) break; /* Link ID */ - cfpkt_extr_head(pkt, &linkid, 1); + linkid = cfpkt_extr_head_u8(pkt); /* Length */ - cfpkt_extr_head(pkt, &len, 1); + len = cfpkt_extr_head_u8(pkt); /* Param Data */ cfpkt_extr_head(pkt, ¶m, len); break; @@ -522,7 +516,7 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt) } break; case CFCTRL_CMD_LINK_DESTROY: - cfpkt_extr_head(pkt, &linkid, 1); + linkid = cfpkt_extr_head_u8(pkt); cfctrl->res.linkdestroy_rsp(cfctrl->serv.layer.up, linkid); break; case CFCTRL_CMD_LINK_ERR: