Commit 3e71e121 authored by Linus Torvalds's avatar Linus Torvalds

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
parents bd516133 c7ff8573
...@@ -15,7 +15,8 @@ void uv_query_info(void) ...@@ -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) ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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 { ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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;
......
/* 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 { ...@@ -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 { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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)))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment