Linux cryptographic layer development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Suman Kumar Chakraborty" <suman.kumar.chakraborty@intel.com>,
	herbert@gondor.apana.org.au
Cc: linux-crypto@vger.kernel.org, qat-linux@intel.com,
	"Karthikeyan Gopal" <karthikeyan.gopal@intel.com>,
	"Giovanni Cabiddu" <giovanni.cabiddu@intel.com>
Subject: Re: [PATCH] crypto: qat - add support for enhanced decompression mode on GEN6 devices
Date: Mon, 26 Oct 2026 08:59:36 +0000	[thread overview]
Message-ID: <sashiko-outbox-184716@kernel.org> (raw)
In-Reply-To: <20261026035501.1627846-1-suman.kumar.chakraborty@intel.com>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] crypto: qat - missing state_lock in decomp_enhanced_store() races with down/up
- [Medium] crypto: qat - decomp_enhanced_store() sends FW cmd without dc or decomp
- [Medium] crypto: qat: missing firmware rollback in decomp_enhanced_store()
--

commit 2bd7b68e36bc7513f2621d0b0db284e20b70faca
Author: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>

crypto: qat - add support for enhanced decompression mode on GEN6 devices

This commit adds support for enhanced decompression mode on QAT GEN6
devices via the ICP_QAT_FW_CNV_BYPASS_MODE_SET firmware admin command and
exposes it through a new decomp_enhanced sysfs attribute.

> diff --git a/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c b/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c
> index 388087e64540e..0bf4907a32764 100644
> --- a/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c
> +++ b/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c

[ ... ]

> @@ -1064,7 +1080,8 @@ void adf_init_hw_data_6xxx(struct adf_hw_device_data *hw_data)
>  	hw_data->num_rps = ADF_GEN6_ETR_MAX_BANKS;
>  	hw_data->clock_frequency = ADF_6XXX_AE_FREQ;
>  	hw_data->get_svc_slice_cnt = adf_gen6_get_svc_slice_cnt;
> -	hw_data->accel_capabilities_ext_mask = ADF_ACCEL_CAPABILITIES_EXT_ZSTD;
> +	hw_data->accel_capabilities_ext_mask = ADF_ACCEL_CAPABILITIES_EXT_ZSTD |
> +					       ADF_ACCEL_CAPABILITIES_EXT_ENHANCED_DECOMP;
>  
>  	adf_gen6_init_services_supported(hw_data);
>  	adf_gen6_init_hw_csr_ops(&hw_data->csr_ops);

[Severity: Medium]
Does setting ADF_ACCEL_CAPABILITIES_EXT_ENHANCED_DECOMP unconditionally in
adf_init_hw_data_6xxx() expose the decomp_enhanced sysfs attribute on GEN6
SKUs that do not support compression, such as wireless crypto SKUs where
adf_6xxx_is_wcy(hw_data) is true or devices with ICP_ACCEL_GEN6_MASK_CPR_SLICE
set in hw_data->fuses[ADF_FUSECTL1]?

> diff --git a/drivers/crypto/intel/qat/qat_common/adf_sysfs.c b/drivers/crypto/intel/qat/qat_common/adf_sysfs.c
> index 8daa69a76b01a..ab3f17c878bb7 100644
> --- a/drivers/crypto/intel/qat/qat_common/adf_sysfs.c
> +++ b/drivers/crypto/intel/qat/qat_common/adf_sysfs.c

[ ... ]

> @@ -321,6 +322,70 @@ static ssize_t num_rps_show(struct device *dev, struct device_attribute *attr,
>  }
>  static DEVICE_ATTR_RO(num_rps);
>  
> +static ssize_t decomp_enhanced_show(struct device *dev, struct device_attribute *attr,
> +				    char *buf)
> +{
> +	struct adf_accel_dev *accel_dev;
> +
> +	accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
> +	if (!accel_dev)
> +		return -EINVAL;
> +
> +	return sysfs_emit(buf, "%s\n", str_on_off(adf_is_decomp_enhanced(accel_dev)));
> +}
> +
> +static ssize_t decomp_enhanced_store(struct device *dev, struct device_attribute *attr,
> +				     const char *buf, size_t count)
> +{
> +	struct adf_accel_dev *accel_dev;
> +	unsigned long mask;
> +	bool enabled;
> +	int ret;
> +
> +	ret = kstrtobool(buf, &enabled);
> +	if (ret)
> +		return ret;
> +
> +	accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
> +	if (!accel_dev)
> +		return -EINVAL;
> +
> +	if (adf_devmgr_in_reset(accel_dev))
> +		return -EBUSY;
> +
> +	if (enabled) {
> +		ret = adf_get_service_mask(accel_dev, &mask);
> +		if (ret)
> +			return ret;
> +
> +		if (!(mask & (BIT(SVC_DC) | BIT(SVC_DECOMP)))) {
> +			dev_err(&GET_DEV(accel_dev),
> +				"decomp_enhanced requires dc or decomp service\n");
> +			return -EINVAL;
> +		}
> +	}
> +
> +	/* If the device is down the value is picked up by adf_send_admin_init(). */
> +	if (adf_dev_started(accel_dev)) {
> +		ret = adf_send_admin_decomp_enhanced(accel_dev, enabled);

[Severity: Medium]
When enabled is false and the device is started without dc or decomp
configured (for example, sym;asym, dcc, or sym on a WCY SKU), will this
still send ICP_QAT_FW_CNV_BYPASS_MODE_SET to the firmware?

Because the service mask check is only performed inside the if (enabled)
block, writing 0 or off on a started device without dc or decomp still
calls adf_send_admin_decomp_enhanced(accel_dev, false), whereas the ABI
documentation in Documentation/ABI/testing/sysfs-driver-qat states that
the setting has no effect while neither dc nor decomp is configured.

> +		if (ret) {
> +			dev_err(&GET_DEV(accel_dev),
> +				"Failed to program enhanced decompression: %d\n",
> +				ret);
> +			return ret;
> +		}
> +	}
> +
> +	ret = adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC,
> +					  ADF_DECOMP_ENHANCED,
> +					  enabled ? "1" : "0", ADF_STR);
> +	if (ret)
> +		return ret;

[Severity: High]
Can decomp_enhanced_store() race with adf_dev_down() and adf_dev_up()
because it does not hold accel_dev->state_lock?

In drivers/crypto/intel/qat/qat_common/adf_init.c, adf_dev_down() holds
accel_dev->state_lock while calling adf_dev_stop() and adf_dev_shutdown():

drivers/crypto/intel/qat/qat_common/adf_init.c:adf_dev_down() {
	mutex_lock(&accel_dev->state_lock);

	adf_dev_stop(accel_dev);
	adf_dev_shutdown(accel_dev);

	mutex_unlock(&accel_dev->state_lock);
}

And adf_dev_shutdown() calls adf_exit_admin_comms(), which frees
accel_dev->admin and sets it to NULL:

drivers/crypto/intel/qat/qat_common/adf_admin.c:adf_exit_admin_comms() {
	...
	if (admin->virt_addr)
		dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
				  admin->virt_addr, admin->phy_addr);
	...
	mutex_destroy(&admin->lock);
	kfree(admin);
	accel_dev->admin = NULL;
}

If decomp_enhanced_store() checks adf_dev_started(accel_dev) without
holding accel_dev->state_lock, a concurrent adf_dev_down() can stop the
engines and run adf_exit_admin_comms() while decomp_enhanced_store() calls
adf_send_admin_decomp_enhanced() -> adf_send_admin() ->
adf_put_admin_msg_sync(), which unconditionally dereferences
accel_dev->admin.

Similarly, during adf_dev_up() -> adf_dev_start(), hw_data->send_admin_init()
runs while ADF_STATUS_STARTING is set and before ADF_STATUS_STARTED is
set. If decomp_enhanced_store() runs in that window, adf_dev_started()
returns false, so it skips adf_send_admin_decomp_enhanced() and updates
ADF_DECOMP_ENHANCED in accel_dev->cfg after adf_send_admin_init() has
already completed, leaving the firmware and configuration out of sync
(which can also happen if two concurrent writers on separate file
descriptors interleave adf_send_admin_decomp_enhanced() and
adf_cfg_add_key_value_param()).

[Severity: Medium]
Also in decomp_enhanced_store(), what happens if
adf_cfg_add_key_value_param() fails with -ENOMEM when kzalloc_obj(*key_val)
fails in drivers/crypto/intel/qat/qat_common/adf_cfg.c after
adf_send_admin_decomp_enhanced() has already reprogrammed the firmware?

Would that leave the running firmware's enhanced decompression mode out of
sync with the configuration stored in accel_dev->cfg and reported by
decomp_enhanced_show()?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261026035501.1627846-1-suman.kumar.chakraborty@intel.com?part=1

      reply	other threads:[~2026-10-26  8:59 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-26  3:55 [PATCH] crypto: qat - add support for enhanced decompression mode on GEN6 devices Suman Kumar Chakraborty
2026-10-26  8:59 ` sashiko-bot [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=sashiko-outbox-184716@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=giovanni.cabiddu@intel.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=karthikeyan.gopal@intel.com \
    --cc=linux-crypto@vger.kernel.org \
    --cc=qat-linux@intel.com \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=suman.kumar.chakraborty@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox