Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: qat - increase number of supported devices

The unsigned long type for init_status and start_status in
service_hndl are not long enough to represent more than 64
acceleration devices. Use an array instead.

Signed-off-by: Xin Zeng <xin.zeng@intel.com>
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Xin Zeng and committed by
Herbert Xu
1043c514 21aad0b6

+19 -14
+1
drivers/crypto/qat/qat_common/adf_cfg_common.h
··· 61 61 #define ADF_CFG_AFFINITY_WHATEVER 0xFF 62 62 #define MAX_DEVICE_NAME_SIZE 32 63 63 #define ADF_MAX_DEVICES (32 * 32) 64 + #define ADF_DEVS_ARRAY_SIZE BITS_TO_LONGS(ADF_MAX_DEVICES) 64 65 65 66 enum adf_cfg_val_type { 66 67 ADF_DEC,
+2 -2
drivers/crypto/qat/qat_common/adf_common_drv.h
··· 87 87 struct service_hndl { 88 88 int (*event_hld)(struct adf_accel_dev *accel_dev, 89 89 enum adf_event event); 90 - unsigned long init_status; 91 - unsigned long start_status; 90 + unsigned long init_status[ADF_DEVS_ARRAY_SIZE]; 91 + unsigned long start_status[ADF_DEVS_ARRAY_SIZE]; 92 92 char *name; 93 93 struct list_head list; 94 94 };
+16 -12
drivers/crypto/qat/qat_common/adf_init.c
··· 64 64 65 65 int adf_service_register(struct service_hndl *service) 66 66 { 67 - service->init_status = 0; 68 - service->start_status = 0; 67 + memset(service->init_status, 0, sizeof(service->init_status)); 68 + memset(service->start_status, 0, sizeof(service->start_status)); 69 69 adf_service_add(service); 70 70 return 0; 71 71 } ··· 79 79 80 80 int adf_service_unregister(struct service_hndl *service) 81 81 { 82 - if (service->init_status || service->start_status) { 83 - pr_err("QAT: Could not remove active service\n"); 84 - return -EFAULT; 82 + int i; 83 + 84 + for (i = 0; i < ARRAY_SIZE(service->init_status); i++) { 85 + if (service->init_status[i] || service->start_status[i]) { 86 + pr_err("QAT: Could not remove active service\n"); 87 + return -EFAULT; 88 + } 85 89 } 86 90 adf_service_remove(service); 87 91 return 0; ··· 167 163 service->name); 168 164 return -EFAULT; 169 165 } 170 - set_bit(accel_dev->accel_id, &service->init_status); 166 + set_bit(accel_dev->accel_id, service->init_status); 171 167 } 172 168 173 169 hw_data->enable_error_correction(accel_dev); ··· 214 210 service->name); 215 211 return -EFAULT; 216 212 } 217 - set_bit(accel_dev->accel_id, &service->start_status); 213 + set_bit(accel_dev->accel_id, service->start_status); 218 214 } 219 215 220 216 clear_bit(ADF_STATUS_STARTING, &accel_dev->status); ··· 263 259 264 260 list_for_each(list_itr, &service_table) { 265 261 service = list_entry(list_itr, struct service_hndl, list); 266 - if (!test_bit(accel_dev->accel_id, &service->start_status)) 262 + if (!test_bit(accel_dev->accel_id, service->start_status)) 267 263 continue; 268 264 ret = service->event_hld(accel_dev, ADF_EVENT_STOP); 269 265 if (!ret) { 270 - clear_bit(accel_dev->accel_id, &service->start_status); 266 + clear_bit(accel_dev->accel_id, service->start_status); 271 267 } else if (ret == -EAGAIN) { 272 268 wait = true; 273 - clear_bit(accel_dev->accel_id, &service->start_status); 269 + clear_bit(accel_dev->accel_id, service->start_status); 274 270 } 275 271 } 276 272 ··· 321 317 322 318 list_for_each(list_itr, &service_table) { 323 319 service = list_entry(list_itr, struct service_hndl, list); 324 - if (!test_bit(accel_dev->accel_id, &service->init_status)) 320 + if (!test_bit(accel_dev->accel_id, service->init_status)) 325 321 continue; 326 322 if (service->event_hld(accel_dev, ADF_EVENT_SHUTDOWN)) 327 323 dev_err(&GET_DEV(accel_dev), 328 324 "Failed to shutdown service %s\n", 329 325 service->name); 330 326 else 331 - clear_bit(accel_dev->accel_id, &service->init_status); 327 + clear_bit(accel_dev->accel_id, service->init_status); 332 328 } 333 329 334 330 hw_data->disable_iov(accel_dev);