s390 updates for 5.6-rc2
- Enable paes-s390 cipher selftests in testmgr (acked-by Herbert Xu). - Fix protected key length update in PKEY_SEC2PROTK ioctl and increase card/queue requests counter to 64-bit in crypto code. - Fix clang warning in get_tod_clock. - Fix ultravisor info length extensions handling. - Fix style of SPDX License Identifier in vfio-ccw. - Avoid unnecessary GFP_ATOMIC and simplify ACK tracking in qdio. -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEE3QHqV+H2a8xAv27vjYWKoQLXFBgFAl5H4GUACgkQjYWKoQLX FBh57gf+NNw5r1Ec3Y+H7uY4841n2uyW6HReb0qD4iSgPmH3d+WjQViCg9mbUCRh MW4xfEizp/aTWEC8L8v0u/HHDApvWOHLiDdtWiTybHwHFIHyoE0OMV8V5lVDXP72 2/AefaKejfqW2L8K18le6NLr5jTTO3/G0F5PNmqFhdU3zoR/ic0ReKk0gPFZ38HI NSc2DOu0KLEKhrE7dAPYNab/nqLiC/oAgTQsTCX/3XeImYsiiLC3PPNdNWiiHYf/ NmgIolxlug/ItEacLCfyfdZbX5/1gw1jZlSdUozUno5Hy1Wt5bZ4rAzg0ORojb/l tB4CDBeIFG/r+HTX7bAONxRrhxa0hw== =GZ7w -----END PGP SIGNATURE----- Merge tag 's390-5.6-3' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux Pull s390 updates from Vasily Gorbik: - Enable paes-s390 cipher selftests in testmgr (acked-by Herbert Xu). - Fix protected key length update in PKEY_SEC2PROTK ioctl and increase card/queue requests counter to 64-bit in crypto code. - Fix clang warning in get_tod_clock. - Fix ultravisor info length extensions handling. - Fix style of SPDX License Identifier in vfio-ccw. - Avoid unnecessary GFP_ATOMIC and simplify ACK tracking in qdio. * tag 's390-5.6-3' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: crypto/testmgr: enable selftests for paes-s390 ciphers s390/time: Fix clk type in get_tod_clock s390/uv: Fix handling of length extensions s390/qdio: don't allocate *aob array with GFP_ATOMIC s390/qdio: simplify ACK tracking s390/zcrypt: fix card and queue total counter wrap s390/pkey: fix missing length of protected key on return vfio-ccw: Use the correct style for SPDX License Identifier
This commit is contained in:
commit
3e71e1214b
@ -15,7 +15,8 @@ void uv_query_info(void)
|
|||||||
if (!test_facility(158))
|
if (!test_facility(158))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (uv_call(0, (uint64_t)&uvcb))
|
/* rc==0x100 means that there is additional data we do not process */
|
||||||
|
if (uv_call(0, (uint64_t)&uvcb) && uvcb.header.rc != 0x100)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (test_bit_inv(BIT_UVC_CMD_SET_SHARED_ACCESS, (unsigned long *)uvcb.inst_calls_list) &&
|
if (test_bit_inv(BIT_UVC_CMD_SET_SHARED_ACCESS, (unsigned long *)uvcb.inst_calls_list) &&
|
||||||
|
@ -155,7 +155,7 @@ static inline void get_tod_clock_ext(char *clk)
|
|||||||
|
|
||||||
static inline unsigned long long get_tod_clock(void)
|
static inline unsigned long long get_tod_clock(void)
|
||||||
{
|
{
|
||||||
unsigned char clk[STORE_CLOCK_EXT_SIZE];
|
char clk[STORE_CLOCK_EXT_SIZE];
|
||||||
|
|
||||||
get_tod_clock_ext(clk);
|
get_tod_clock_ext(clk);
|
||||||
return *((unsigned long long *)&clk[1]);
|
return *((unsigned long long *)&clk[1]);
|
||||||
|
@ -4436,6 +4436,15 @@ static const struct alg_test_desc alg_test_descs[] = {
|
|||||||
.cipher = __VECS(tf_cbc_tv_template)
|
.cipher = __VECS(tf_cbc_tv_template)
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
|
#if IS_ENABLED(CONFIG_CRYPTO_PAES_S390)
|
||||||
|
.alg = "cbc-paes-s390",
|
||||||
|
.fips_allowed = 1,
|
||||||
|
.test = alg_test_skcipher,
|
||||||
|
.suite = {
|
||||||
|
.cipher = __VECS(aes_cbc_tv_template)
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
#endif
|
||||||
.alg = "cbcmac(aes)",
|
.alg = "cbcmac(aes)",
|
||||||
.fips_allowed = 1,
|
.fips_allowed = 1,
|
||||||
.test = alg_test_hash,
|
.test = alg_test_hash,
|
||||||
@ -4587,6 +4596,15 @@ static const struct alg_test_desc alg_test_descs[] = {
|
|||||||
.cipher = __VECS(tf_ctr_tv_template)
|
.cipher = __VECS(tf_ctr_tv_template)
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
|
#if IS_ENABLED(CONFIG_CRYPTO_PAES_S390)
|
||||||
|
.alg = "ctr-paes-s390",
|
||||||
|
.fips_allowed = 1,
|
||||||
|
.test = alg_test_skcipher,
|
||||||
|
.suite = {
|
||||||
|
.cipher = __VECS(aes_ctr_tv_template)
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
#endif
|
||||||
.alg = "cts(cbc(aes))",
|
.alg = "cts(cbc(aes))",
|
||||||
.test = alg_test_skcipher,
|
.test = alg_test_skcipher,
|
||||||
.fips_allowed = 1,
|
.fips_allowed = 1,
|
||||||
@ -4879,6 +4897,15 @@ static const struct alg_test_desc alg_test_descs[] = {
|
|||||||
.cipher = __VECS(xtea_tv_template)
|
.cipher = __VECS(xtea_tv_template)
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
|
#if IS_ENABLED(CONFIG_CRYPTO_PAES_S390)
|
||||||
|
.alg = "ecb-paes-s390",
|
||||||
|
.fips_allowed = 1,
|
||||||
|
.test = alg_test_skcipher,
|
||||||
|
.suite = {
|
||||||
|
.cipher = __VECS(aes_tv_template)
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
#endif
|
||||||
.alg = "ecdh",
|
.alg = "ecdh",
|
||||||
.test = alg_test_kpp,
|
.test = alg_test_kpp,
|
||||||
.fips_allowed = 1,
|
.fips_allowed = 1,
|
||||||
@ -5465,6 +5492,15 @@ static const struct alg_test_desc alg_test_descs[] = {
|
|||||||
.cipher = __VECS(tf_xts_tv_template)
|
.cipher = __VECS(tf_xts_tv_template)
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
|
#if IS_ENABLED(CONFIG_CRYPTO_PAES_S390)
|
||||||
|
.alg = "xts-paes-s390",
|
||||||
|
.fips_allowed = 1,
|
||||||
|
.test = alg_test_skcipher,
|
||||||
|
.suite = {
|
||||||
|
.cipher = __VECS(aes_xts_tv_template)
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
#endif
|
||||||
.alg = "xts4096(paes)",
|
.alg = "xts4096(paes)",
|
||||||
.test = alg_test_null,
|
.test = alg_test_null,
|
||||||
.fips_allowed = 1,
|
.fips_allowed = 1,
|
||||||
|
@ -182,11 +182,9 @@ enum qdio_queue_irq_states {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct qdio_input_q {
|
struct qdio_input_q {
|
||||||
/* input buffer acknowledgement flag */
|
|
||||||
int polling;
|
|
||||||
/* first ACK'ed buffer */
|
/* first ACK'ed buffer */
|
||||||
int ack_start;
|
int ack_start;
|
||||||
/* how much sbals are acknowledged with qebsm */
|
/* how many SBALs are acknowledged */
|
||||||
int ack_count;
|
int ack_count;
|
||||||
/* last time of noticing incoming data */
|
/* last time of noticing incoming data */
|
||||||
u64 timestamp;
|
u64 timestamp;
|
||||||
|
@ -124,9 +124,8 @@ static int qstat_show(struct seq_file *m, void *v)
|
|||||||
seq_printf(m, "nr_used: %d ftc: %d\n",
|
seq_printf(m, "nr_used: %d ftc: %d\n",
|
||||||
atomic_read(&q->nr_buf_used), q->first_to_check);
|
atomic_read(&q->nr_buf_used), q->first_to_check);
|
||||||
if (q->is_input_q) {
|
if (q->is_input_q) {
|
||||||
seq_printf(m, "polling: %d ack start: %d ack count: %d\n",
|
seq_printf(m, "ack start: %d ack count: %d\n",
|
||||||
q->u.in.polling, q->u.in.ack_start,
|
q->u.in.ack_start, q->u.in.ack_count);
|
||||||
q->u.in.ack_count);
|
|
||||||
seq_printf(m, "DSCI: %x IRQs disabled: %u\n",
|
seq_printf(m, "DSCI: %x IRQs disabled: %u\n",
|
||||||
*(u8 *)q->irq_ptr->dsci,
|
*(u8 *)q->irq_ptr->dsci,
|
||||||
test_bit(QDIO_QUEUE_IRQS_DISABLED,
|
test_bit(QDIO_QUEUE_IRQS_DISABLED,
|
||||||
|
@ -393,19 +393,15 @@ int debug_get_buf_state(struct qdio_q *q, unsigned int bufnr,
|
|||||||
|
|
||||||
static inline void qdio_stop_polling(struct qdio_q *q)
|
static inline void qdio_stop_polling(struct qdio_q *q)
|
||||||
{
|
{
|
||||||
if (!q->u.in.polling)
|
if (!q->u.in.ack_count)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
q->u.in.polling = 0;
|
|
||||||
qperf_inc(q, stop_polling);
|
qperf_inc(q, stop_polling);
|
||||||
|
|
||||||
/* show the card that we are not polling anymore */
|
/* show the card that we are not polling anymore */
|
||||||
if (is_qebsm(q)) {
|
set_buf_states(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT,
|
||||||
set_buf_states(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT,
|
q->u.in.ack_count);
|
||||||
q->u.in.ack_count);
|
q->u.in.ack_count = 0;
|
||||||
q->u.in.ack_count = 0;
|
|
||||||
} else
|
|
||||||
set_buf_state(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void account_sbals(struct qdio_q *q, unsigned int count)
|
static inline void account_sbals(struct qdio_q *q, unsigned int count)
|
||||||
@ -451,8 +447,7 @@ static inline void inbound_primed(struct qdio_q *q, unsigned int start,
|
|||||||
|
|
||||||
/* for QEBSM the ACK was already set by EQBS */
|
/* for QEBSM the ACK was already set by EQBS */
|
||||||
if (is_qebsm(q)) {
|
if (is_qebsm(q)) {
|
||||||
if (!q->u.in.polling) {
|
if (!q->u.in.ack_count) {
|
||||||
q->u.in.polling = 1;
|
|
||||||
q->u.in.ack_count = count;
|
q->u.in.ack_count = count;
|
||||||
q->u.in.ack_start = start;
|
q->u.in.ack_start = start;
|
||||||
return;
|
return;
|
||||||
@ -471,12 +466,12 @@ static inline void inbound_primed(struct qdio_q *q, unsigned int start,
|
|||||||
* or by the next inbound run.
|
* or by the next inbound run.
|
||||||
*/
|
*/
|
||||||
new = add_buf(start, count - 1);
|
new = add_buf(start, count - 1);
|
||||||
if (q->u.in.polling) {
|
if (q->u.in.ack_count) {
|
||||||
/* reset the previous ACK but first set the new one */
|
/* reset the previous ACK but first set the new one */
|
||||||
set_buf_state(q, new, SLSB_P_INPUT_ACK);
|
set_buf_state(q, new, SLSB_P_INPUT_ACK);
|
||||||
set_buf_state(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT);
|
set_buf_state(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT);
|
||||||
} else {
|
} else {
|
||||||
q->u.in.polling = 1;
|
q->u.in.ack_count = 1;
|
||||||
set_buf_state(q, new, SLSB_P_INPUT_ACK);
|
set_buf_state(q, new, SLSB_P_INPUT_ACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1479,13 +1474,12 @@ static int handle_inbound(struct qdio_q *q, unsigned int callflags,
|
|||||||
|
|
||||||
qperf_inc(q, inbound_call);
|
qperf_inc(q, inbound_call);
|
||||||
|
|
||||||
if (!q->u.in.polling)
|
if (!q->u.in.ack_count)
|
||||||
goto set;
|
goto set;
|
||||||
|
|
||||||
/* protect against stop polling setting an ACK for an emptied slsb */
|
/* protect against stop polling setting an ACK for an emptied slsb */
|
||||||
if (count == QDIO_MAX_BUFFERS_PER_Q) {
|
if (count == QDIO_MAX_BUFFERS_PER_Q) {
|
||||||
/* overwriting everything, just delete polling status */
|
/* overwriting everything, just delete polling status */
|
||||||
q->u.in.polling = 0;
|
|
||||||
q->u.in.ack_count = 0;
|
q->u.in.ack_count = 0;
|
||||||
goto set;
|
goto set;
|
||||||
} else if (buf_in_between(q->u.in.ack_start, bufnr, count)) {
|
} else if (buf_in_between(q->u.in.ack_start, bufnr, count)) {
|
||||||
@ -1495,15 +1489,14 @@ static int handle_inbound(struct qdio_q *q, unsigned int callflags,
|
|||||||
diff = sub_buf(diff, q->u.in.ack_start);
|
diff = sub_buf(diff, q->u.in.ack_start);
|
||||||
q->u.in.ack_count -= diff;
|
q->u.in.ack_count -= diff;
|
||||||
if (q->u.in.ack_count <= 0) {
|
if (q->u.in.ack_count <= 0) {
|
||||||
q->u.in.polling = 0;
|
|
||||||
q->u.in.ack_count = 0;
|
q->u.in.ack_count = 0;
|
||||||
goto set;
|
goto set;
|
||||||
}
|
}
|
||||||
q->u.in.ack_start = add_buf(q->u.in.ack_start, diff);
|
q->u.in.ack_start = add_buf(q->u.in.ack_start, diff);
|
||||||
|
} else {
|
||||||
|
/* the only ACK will be deleted */
|
||||||
|
q->u.in.ack_count = 0;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
/* the only ACK will be deleted, so stop polling */
|
|
||||||
q->u.in.polling = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set:
|
set:
|
||||||
|
@ -536,7 +536,7 @@ void qdio_print_subchannel_info(struct qdio_irq *irq_ptr,
|
|||||||
int qdio_enable_async_operation(struct qdio_output_q *outq)
|
int qdio_enable_async_operation(struct qdio_output_q *outq)
|
||||||
{
|
{
|
||||||
outq->aobs = kcalloc(QDIO_MAX_BUFFERS_PER_Q, sizeof(struct qaob *),
|
outq->aobs = kcalloc(QDIO_MAX_BUFFERS_PER_Q, sizeof(struct qaob *),
|
||||||
GFP_ATOMIC);
|
GFP_KERNEL);
|
||||||
if (!outq->aobs) {
|
if (!outq->aobs) {
|
||||||
outq->use_cq = 0;
|
outq->use_cq = 0;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
* Tracepoints for vfio_ccw driver
|
/* Tracepoints for vfio_ccw driver
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2018
|
* Copyright IBM Corp. 2018
|
||||||
*
|
*
|
||||||
|
@ -162,7 +162,7 @@ struct ap_card {
|
|||||||
unsigned int functions; /* AP device function bitfield. */
|
unsigned int functions; /* AP device function bitfield. */
|
||||||
int queue_depth; /* AP queue depth.*/
|
int queue_depth; /* AP queue depth.*/
|
||||||
int id; /* AP card number. */
|
int id; /* AP card number. */
|
||||||
atomic_t total_request_count; /* # requests ever for this AP device.*/
|
atomic64_t total_request_count; /* # requests ever for this AP device.*/
|
||||||
};
|
};
|
||||||
|
|
||||||
#define to_ap_card(x) container_of((x), struct ap_card, ap_dev.device)
|
#define to_ap_card(x) container_of((x), struct ap_card, ap_dev.device)
|
||||||
@ -179,7 +179,7 @@ struct ap_queue {
|
|||||||
enum ap_state state; /* State of the AP device. */
|
enum ap_state state; /* State of the AP device. */
|
||||||
int pendingq_count; /* # requests on pendingq list. */
|
int pendingq_count; /* # requests on pendingq list. */
|
||||||
int requestq_count; /* # requests on requestq list. */
|
int requestq_count; /* # requests on requestq list. */
|
||||||
int total_request_count; /* # requests ever for this AP device.*/
|
u64 total_request_count; /* # requests ever for this AP device.*/
|
||||||
int request_timeout; /* Request timeout in jiffies. */
|
int request_timeout; /* Request timeout in jiffies. */
|
||||||
struct timer_list timeout; /* Timer for request timeouts. */
|
struct timer_list timeout; /* Timer for request timeouts. */
|
||||||
struct list_head pendingq; /* List of message sent to AP queue. */
|
struct list_head pendingq; /* List of message sent to AP queue. */
|
||||||
|
@ -63,13 +63,13 @@ static ssize_t request_count_show(struct device *dev,
|
|||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct ap_card *ac = to_ap_card(dev);
|
struct ap_card *ac = to_ap_card(dev);
|
||||||
unsigned int req_cnt;
|
u64 req_cnt;
|
||||||
|
|
||||||
req_cnt = 0;
|
req_cnt = 0;
|
||||||
spin_lock_bh(&ap_list_lock);
|
spin_lock_bh(&ap_list_lock);
|
||||||
req_cnt = atomic_read(&ac->total_request_count);
|
req_cnt = atomic64_read(&ac->total_request_count);
|
||||||
spin_unlock_bh(&ap_list_lock);
|
spin_unlock_bh(&ap_list_lock);
|
||||||
return snprintf(buf, PAGE_SIZE, "%d\n", req_cnt);
|
return snprintf(buf, PAGE_SIZE, "%llu\n", req_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t request_count_store(struct device *dev,
|
static ssize_t request_count_store(struct device *dev,
|
||||||
@ -83,7 +83,7 @@ static ssize_t request_count_store(struct device *dev,
|
|||||||
for_each_ap_queue(aq, ac)
|
for_each_ap_queue(aq, ac)
|
||||||
aq->total_request_count = 0;
|
aq->total_request_count = 0;
|
||||||
spin_unlock_bh(&ap_list_lock);
|
spin_unlock_bh(&ap_list_lock);
|
||||||
atomic_set(&ac->total_request_count, 0);
|
atomic64_set(&ac->total_request_count, 0);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
@ -479,12 +479,12 @@ static ssize_t request_count_show(struct device *dev,
|
|||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct ap_queue *aq = to_ap_queue(dev);
|
struct ap_queue *aq = to_ap_queue(dev);
|
||||||
unsigned int req_cnt;
|
u64 req_cnt;
|
||||||
|
|
||||||
spin_lock_bh(&aq->lock);
|
spin_lock_bh(&aq->lock);
|
||||||
req_cnt = aq->total_request_count;
|
req_cnt = aq->total_request_count;
|
||||||
spin_unlock_bh(&aq->lock);
|
spin_unlock_bh(&aq->lock);
|
||||||
return snprintf(buf, PAGE_SIZE, "%d\n", req_cnt);
|
return snprintf(buf, PAGE_SIZE, "%llu\n", req_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t request_count_store(struct device *dev,
|
static ssize_t request_count_store(struct device *dev,
|
||||||
@ -676,7 +676,7 @@ void ap_queue_message(struct ap_queue *aq, struct ap_message *ap_msg)
|
|||||||
list_add_tail(&ap_msg->list, &aq->requestq);
|
list_add_tail(&ap_msg->list, &aq->requestq);
|
||||||
aq->requestq_count++;
|
aq->requestq_count++;
|
||||||
aq->total_request_count++;
|
aq->total_request_count++;
|
||||||
atomic_inc(&aq->card->total_request_count);
|
atomic64_inc(&aq->card->total_request_count);
|
||||||
/* Send/receive as many request from the queue as possible. */
|
/* Send/receive as many request from the queue as possible. */
|
||||||
ap_wait(ap_sm_event_loop(aq, AP_EVENT_POLL));
|
ap_wait(ap_sm_event_loop(aq, AP_EVENT_POLL));
|
||||||
spin_unlock_bh(&aq->lock);
|
spin_unlock_bh(&aq->lock);
|
||||||
|
@ -994,7 +994,7 @@ static long pkey_unlocked_ioctl(struct file *filp, unsigned int cmd,
|
|||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
rc = cca_sec2protkey(ksp.cardnr, ksp.domain,
|
rc = cca_sec2protkey(ksp.cardnr, ksp.domain,
|
||||||
ksp.seckey.seckey, ksp.protkey.protkey,
|
ksp.seckey.seckey, ksp.protkey.protkey,
|
||||||
NULL, &ksp.protkey.type);
|
&ksp.protkey.len, &ksp.protkey.type);
|
||||||
DEBUG_DBG("%s cca_sec2protkey()=%d\n", __func__, rc);
|
DEBUG_DBG("%s cca_sec2protkey()=%d\n", __func__, rc);
|
||||||
if (rc)
|
if (rc)
|
||||||
break;
|
break;
|
||||||
|
@ -606,8 +606,8 @@ static inline bool zcrypt_card_compare(struct zcrypt_card *zc,
|
|||||||
weight += atomic_read(&zc->load);
|
weight += atomic_read(&zc->load);
|
||||||
pref_weight += atomic_read(&pref_zc->load);
|
pref_weight += atomic_read(&pref_zc->load);
|
||||||
if (weight == pref_weight)
|
if (weight == pref_weight)
|
||||||
return atomic_read(&zc->card->total_request_count) >
|
return atomic64_read(&zc->card->total_request_count) >
|
||||||
atomic_read(&pref_zc->card->total_request_count);
|
atomic64_read(&pref_zc->card->total_request_count);
|
||||||
return weight > pref_weight;
|
return weight > pref_weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1226,11 +1226,12 @@ static void zcrypt_qdepth_mask(char qdepth[], size_t max_adapters)
|
|||||||
spin_unlock(&zcrypt_list_lock);
|
spin_unlock(&zcrypt_list_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void zcrypt_perdev_reqcnt(int reqcnt[], size_t max_adapters)
|
static void zcrypt_perdev_reqcnt(u32 reqcnt[], size_t max_adapters)
|
||||||
{
|
{
|
||||||
struct zcrypt_card *zc;
|
struct zcrypt_card *zc;
|
||||||
struct zcrypt_queue *zq;
|
struct zcrypt_queue *zq;
|
||||||
int card;
|
int card;
|
||||||
|
u64 cnt;
|
||||||
|
|
||||||
memset(reqcnt, 0, sizeof(int) * max_adapters);
|
memset(reqcnt, 0, sizeof(int) * max_adapters);
|
||||||
spin_lock(&zcrypt_list_lock);
|
spin_lock(&zcrypt_list_lock);
|
||||||
@ -1242,8 +1243,9 @@ static void zcrypt_perdev_reqcnt(int reqcnt[], size_t max_adapters)
|
|||||||
|| card >= max_adapters)
|
|| card >= max_adapters)
|
||||||
continue;
|
continue;
|
||||||
spin_lock(&zq->queue->lock);
|
spin_lock(&zq->queue->lock);
|
||||||
reqcnt[card] = zq->queue->total_request_count;
|
cnt = zq->queue->total_request_count;
|
||||||
spin_unlock(&zq->queue->lock);
|
spin_unlock(&zq->queue->lock);
|
||||||
|
reqcnt[card] = (cnt < UINT_MAX) ? (u32) cnt : UINT_MAX;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
local_bh_enable();
|
local_bh_enable();
|
||||||
@ -1421,9 +1423,9 @@ static long zcrypt_unlocked_ioctl(struct file *filp, unsigned int cmd,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case ZCRYPT_PERDEV_REQCNT: {
|
case ZCRYPT_PERDEV_REQCNT: {
|
||||||
int *reqcnt;
|
u32 *reqcnt;
|
||||||
|
|
||||||
reqcnt = kcalloc(AP_DEVICES, sizeof(int), GFP_KERNEL);
|
reqcnt = kcalloc(AP_DEVICES, sizeof(u32), GFP_KERNEL);
|
||||||
if (!reqcnt)
|
if (!reqcnt)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
zcrypt_perdev_reqcnt(reqcnt, AP_DEVICES);
|
zcrypt_perdev_reqcnt(reqcnt, AP_DEVICES);
|
||||||
@ -1480,7 +1482,7 @@ static long zcrypt_unlocked_ioctl(struct file *filp, unsigned int cmd,
|
|||||||
}
|
}
|
||||||
case Z90STAT_PERDEV_REQCNT: {
|
case Z90STAT_PERDEV_REQCNT: {
|
||||||
/* the old ioctl supports only 64 adapters */
|
/* the old ioctl supports only 64 adapters */
|
||||||
int reqcnt[MAX_ZDEV_CARDIDS];
|
u32 reqcnt[MAX_ZDEV_CARDIDS];
|
||||||
|
|
||||||
zcrypt_perdev_reqcnt(reqcnt, MAX_ZDEV_CARDIDS);
|
zcrypt_perdev_reqcnt(reqcnt, MAX_ZDEV_CARDIDS);
|
||||||
if (copy_to_user((int __user *) arg, reqcnt, sizeof(reqcnt)))
|
if (copy_to_user((int __user *) arg, reqcnt, sizeof(reqcnt)))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user