From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B6576306B1B for ; Mon, 6 Apr 2026 08:09:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775462956; cv=none; b=KA0/xvYS/GCjGhFpDVdufAoX6fTD65U8H5RB4DuomJC0+wf9EOAR4dZWCm9UJKw0jrWDtn/BBCQPWBdsjxdfy6IouGZJYfFd71UW3KCWTMeB9e9MAx45u6f+Oa3s7bM3I44xDySoVWjnH5qsaE9fiwEJNjaL5N2H8ovuJvoFnMQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775462956; c=relaxed/simple; bh=3i4QqeQ0eDQeBGKnXpTijfSwGZD4a29IZdK8uDi6MJY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=E2TX+P61nEyaNogdE+6K6tOunnyrx477teW9p3EELrqzbzwKRoxWAm6qiPbVxFeVe3rLKyEoiwcvHS1KZhaGM5c3ERub9T8IxkAp7q7o1x6q+Z2X9pHgc0nE/TSppiorP9nHdvzFyEXAG154yJAQXY+wEav1DcYB++aQODffGik= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CInyr+4f; arc=none smtp.client-ip=209.85.216.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CInyr+4f" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-35c238f1063so2190821a91.1 for ; Mon, 06 Apr 2026 01:09:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775462954; x=1776067754; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=W1j46ShQPfwpy3gXgQwfnfKhYctHDdp6l3ofiQ/AUxA=; b=CInyr+4fhIk3yodd1Qyt7miOi8o9pEfni4ZcjuJJdYq1T1itstxgj5ia7WsvtwdUax aTW1I7MigomBd5NXyCwuzVoqD48OzmhmrhilFpjnd2uwAg8h1QWhaxLjUi751LsAjiDC 7YdKSx9TYojI8eR0Qd1u9iLNRtNjw65MCqfIZjySlYs+O2BwUfZZeCiXGHkM0Kx3U3c5 oO2GbWSx22BZW0w6RVIZe5/Ok2SWupKRT/MGtsaUyT7JlmZpHPSfDVp7vXuoHIBmLvlF IJJBHiiuYkp5F1Igsl/LlexnQB9Yr+/MFSpxX1Y6d5bznckZFIXgrud8iEyg3H7JyA2v OgMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775462954; x=1776067754; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=W1j46ShQPfwpy3gXgQwfnfKhYctHDdp6l3ofiQ/AUxA=; b=J9b3d/869a7aywxgDq0iAqanOC7bNv2jp+cySsobsFxBhr2uLdCiulTYAbm27z/pRo xvuxzN1gSR/5MHaqKzUrM+u380MoanpXX7cph+XEErMe3CZ0lwDeLVhXXMSksgzDqfsT IBWY6b6pN68TlcTn2OgvRz4QLKBbDfVfrzvX3a2e6q/eX5Tth6BgERHAFT/oIxMexWvs MIyPLuxhXI2WoLk0jf94Uhxu6sh1wUNqt/o87m6IYXPgY4YCB68RUDQMISRAbaPt78f4 5sJvMTV/38r4o/37t1nWCpFVH3ON2j+fD77CB+HCU/tFOahQrj9G6j/8IQIpUp91Nb10 7MzQ== X-Forwarded-Encrypted: i=1; AJvYcCXbhD4bAX/F3FvJQr8rM4TGJOeJm0n/NU5bSC+Ig+LyNCZVIlu5zW7TghHoQCSNRbvY2+xsfjMKdXufDmo=@vger.kernel.org X-Gm-Message-State: AOJu0Yy1XKdMEmEUFB4wPxjUTDnqRfH6DPOfYvooTf4vIIPDbCzBD6qV KF4/p0d7xlrP2LS56PU/sNrHD9UfShdWC1nkmBXRsVq0I2RFLtnyCt/3 X-Gm-Gg: AeBDievrmyXmwgJ/HlDykKpbb8kqNIiLtnqXNDT/Bj8QcisHRq5HwbeUeBrSycfY+ZV XR+FOKiEhwsCxHoKnM0Uq1uDGPNbp04+KA0e+yaoOISbQxw0QWME64iaHSjvceTXCnF8W4hgHt9 ZaZI7CDJJVER24e3ZWcfq8nctCBrYoYdGeZlneVREaoScRKtTGzFZc0Rkj9rhCTclIZUBlRkX3a I1EGvhmFq6/H92Y2cI1PT6OJThIAUUHk8cboKQnUAK9NPK5U5tWf5vUuBH9rtUVzgTdwYD6CaD2 HQh6vDveH0ZCxz5ZOjXyM/N4usWuy+S0ZzEyzSYPLZAxdu+qpnjUju1C4PaHzZhLdWr0dv/e38U B2VFP3PAz14kCe52jh4O/B/LWWP5toK7lSVQ3zcZvF8dt32fpEa1YHZPW7Tjq1Lb2Bf2REdUvK/ KTQ2QIQUP8Ww8YAkP7RAX188j91eG06ydtjDeQHtf3QA9tZnXU X-Received: by 2002:a17:903:17cb:b0:2b2:50f6:cdd9 with SMTP id d9443c01a7336-2b2817cf037mr128244145ad.8.1775462954078; Mon, 06 Apr 2026 01:09:14 -0700 (PDT) Received: from hu-ckantibh-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b27497af19sm127961835ad.50.2026.04.06.01.09.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Apr 2026 01:09:13 -0700 (PDT) From: Sanjay Chitroda X-Google-Original-From: Sanjay Chitroda To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org Cc: kees@kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, sanjayembeddedse@gmail.com Subject: [PATCH v5 5/5] iio: ssp_sensors: reuse preallocated RX buffer for SPI transfers Date: Mon, 6 Apr 2026 13:38:52 +0530 Message-Id: <20260406080852.2727453-6-sanjayembedded@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260406080852.2727453-1-sanjayembedded@gmail.com> References: <20260406080852.2727453-1-sanjayembedded@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Sanjay Chitroda Avoid allocating a temporary DMA buffer in the interrupt context when handling hub-to-AP and AP-to-hub SPI write messages. Preallocate RX buffer during probe and reuse it for SPI receive operations. This removes repeated kzalloc() calls from the IRQ path, reduces allocation overhead, and avoids potential allocation failures under memory pressure. The RX buffer size is tracked and allocated using devm_kzalloc(), ensuring proper lifetime management tied to the device. No functional change intended; this is an internal optimization and robustness improvement. Signed-off-by: Sanjay Chitroda --- Changes in v5: - Rebase change on top of latest v5 patch series. Changes in v4: - Use preallocated buffer and stash a buffer that gets reused each time instead of a fresh allocation. - Link to v3: https://lore.kernel.org/all/20260315125509.857195-3-sanjayembedded@gmail.com/ Changes in v3: - prepare series to have all respective cleanup API support for the ssp_sensors following input from Andy Shevchenko - Link to v2 https://lore.kernel.org/all/20260311174151.3441429-1-sanjayembedded@gmail.com/ Changes in v2: - split series to individual patch - address review comment from Andy Shevchenko - Link to v1 https://lore.kernel.org/all/20260310200513.2162018-3-sanjayembedded@gmail.com/ --- drivers/iio/common/ssp_sensors/ssp.h | 5 +++++ drivers/iio/common/ssp_sensors/ssp_dev.c | 12 ++++++++++++ drivers/iio/common/ssp_sensors/ssp_spi.c | 19 +++---------------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/drivers/iio/common/ssp_sensors/ssp.h b/drivers/iio/common/ssp_sensors/ssp.h index f649cdecc277..aa125fd1bed5 100644 --- a/drivers/iio/common/ssp_sensors/ssp.h +++ b/drivers/iio/common/ssp_sensors/ssp.h @@ -175,6 +175,8 @@ struct ssp_sensorhub_info { * @sensor_devs: registered IIO devices table * @enable_refcount: enable reference count for wdt (watchdog timer) * @header_buffer: cache aligned buffer for packet header + * @rx_buf: buffer to receive SPI data + * @rx_buf_size: allocated size of rx_buf */ struct ssp_data { struct spi_device *spi; @@ -222,6 +224,9 @@ struct ssp_data { atomic_t enable_refcount; __le16 header_buffer[SSP_HEADER_BUFFER_SIZE / sizeof(__le16)] __aligned(IIO_DMA_MINALIGN); + + u8 *rx_buf; + size_t rx_buf_size; }; void ssp_clean_pending_list(struct ssp_data *data); diff --git a/drivers/iio/common/ssp_sensors/ssp_dev.c b/drivers/iio/common/ssp_sensors/ssp_dev.c index aab28f2a0f75..2a8d6f040ae4 100644 --- a/drivers/iio/common/ssp_sensors/ssp_dev.c +++ b/drivers/iio/common/ssp_sensors/ssp_dev.c @@ -516,6 +516,18 @@ static int ssp_probe(struct spi_device *spi) goto err_setup_spi; } + data->rx_buf_size = SSP_DATA_PACKET_SIZE; + data->rx_buf = devm_kzalloc(&spi->dev, + data->rx_buf_size, + GFP_KERNEL | GFP_DMA); + + if (!data->rx_buf) { + dev_err(&spi->dev, + "Failed to allocate memory for rx_buf\n"); + ret = -ENOMEM; + goto err_setup_spi; + } + for (i = 0; i < SSP_SENSOR_MAX; ++i) { data->delay_buf[i] = SSP_DEFAULT_POLLING_DELAY; data->batch_latency_buf[i] = 0; diff --git a/drivers/iio/common/ssp_sensors/ssp_spi.c b/drivers/iio/common/ssp_sensors/ssp_spi.c index 7c1780e15acf..2f7445e8b4d1 100644 --- a/drivers/iio/common/ssp_sensors/ssp_spi.c +++ b/drivers/iio/common/ssp_sensors/ssp_spi.c @@ -383,19 +383,13 @@ int ssp_irq_msg(struct ssp_data *data) * but the slave should not send such ones - it is to * check but let's handle this */ - buffer = kmalloc(length, GFP_KERNEL | GFP_DMA); - if (!buffer) { - ret = -ENOMEM; - goto _unlock; - } + buffer = data->rx_buf; /* got dead packet so it is always an error */ ret = spi_read(data->spi, buffer, length); if (ret >= 0) ret = -EPROTO; - kfree(buffer); - dev_err(SSP_DEV, "No match error %x\n", msg_options); @@ -428,22 +422,15 @@ int ssp_irq_msg(struct ssp_data *data) mutex_unlock(&data->pending_lock); break; case SSP_HUB2AP_WRITE: - buffer = kzalloc(length, GFP_KERNEL | GFP_DMA); - if (!buffer) - return -ENOMEM; + buffer = data->rx_buf; ret = spi_read(data->spi, buffer, length); if (ret < 0) { dev_err(SSP_DEV, "spi read fail\n"); - kfree(buffer); break; } - ret = ssp_parse_dataframe(data, buffer, length); - - kfree(buffer); - break; - + return ssp_parse_dataframe(data, buffer, length); default: dev_err(SSP_DEV, "unknown msg type\n"); return -EPROTO; -- 2.34.1