crypto: qat - add sysfs_added flag for ras
authorDamian Muszynski <damian.muszynski@intel.com>
Tue, 21 Nov 2023 16:59:45 +0000 (17:59 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 1 Dec 2023 10:03:26 +0000 (18:03 +0800)
The qat_ras sysfs attribute group is registered within the
adf_dev_start() function, alongside other driver components.
If any of the functions preceding the group registration fails,
the adf_dev_start() function returns, and the caller, to undo the
operation, invokes adf_dev_stop() followed by adf_dev_shutdown().
However, the current flow lacks information about whether the
registration of the qat_ras attribute group was successful or not.

In cases where this condition is encountered, an error similar to
the following might be reported:

    4xxx 0000:6b:00.0: Starting device qat_dev0
    4xxx 0000:6b:00.0: qat_dev0 started 9 acceleration engines
    4xxx 0000:6b:00.0: Failed to send init message
    4xxx 0000:6b:00.0: Failed to start device qat_dev0
    sysfs group 'qat_ras' not found for kobject '0000:6b:00.0'
    ...
    sysfs_remove_groups+0x29/0x50
    adf_sysfs_stop_ras+0x4b/0x80 [intel_qat]
    adf_dev_stop+0x43/0x1d0 [intel_qat]
    adf_dev_down+0x4b/0x150 [intel_qat]
    ...
    4xxx 0000:6b:00.0: qat_dev0 stopped 9 acceleration engines
    4xxx 0000:6b:00.0: Resetting device qat_dev0

To prevent attempting to remove attributes from a group that has not
been added yet, a flag named 'sysfs_added' is introduced. This flag
is set to true upon the successful registration of the attribute group.

Fixes: 532d7f6bc458 ("crypto: qat - add error counters")
Signed-off-by: Damian Muszynski <damian.muszynski@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Reviewed-by: Ahsan Atta <ahsan.atta@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/intel/qat/qat_common/adf_accel_devices.h
drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.c

index 4ff5729a34969bd5e5e7aaed6cdb23782f87d0cc..9d5fdd529a2eeef944e548c9fb1b9ec69cf0c5be 100644 (file)
@@ -92,6 +92,7 @@ enum ras_errors {
 
 struct adf_error_counters {
        atomic_t counter[ADF_RAS_ERRORS];
+       bool sysfs_added;
        bool enabled;
 };
 
index cffe2d7229953d1b865c02411409c2f3ad8a3d68..e97c67c87b3cf17d124a4e97099622e170e30253 100644 (file)
@@ -99,6 +99,8 @@ void adf_sysfs_start_ras(struct adf_accel_dev *accel_dev)
        if (device_add_group(&GET_DEV(accel_dev), &qat_ras_group))
                dev_err(&GET_DEV(accel_dev),
                        "Failed to create qat_ras attribute group.\n");
+
+       accel_dev->ras_errors.sysfs_added = true;
 }
 
 void adf_sysfs_stop_ras(struct adf_accel_dev *accel_dev)
@@ -106,7 +108,10 @@ void adf_sysfs_stop_ras(struct adf_accel_dev *accel_dev)
        if (!accel_dev->ras_errors.enabled)
                return;
 
-       device_remove_group(&GET_DEV(accel_dev), &qat_ras_group);
+       if (accel_dev->ras_errors.sysfs_added) {
+               device_remove_group(&GET_DEV(accel_dev), &qat_ras_group);
+               accel_dev->ras_errors.sysfs_added = false;
+       }
 
        ADF_RAS_ERR_CTR_CLEAR(accel_dev->ras_errors);
 }