Skip to content

Commit 523a05f

Browse files
committed
Merge tag 's390-5.7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull more s390 updates from Vasily Gorbik: "Second round of s390 fixes and features for 5.7: - The rest of fallthrough; annotations conversion - Couple of fixes for ADD uevents in the common I/O layer - Minor refactoring of the queued direct I/O code" * tag 's390-5.7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/cio: generate delayed uevent for vfio-ccw subchannels s390/cio: avoid duplicated 'ADD' uevents s390/qdio: clear DSCI early for polling drivers s390/qdio: inline shared_ind() s390/qdio: remove cdev from init_data s390/qdio: allow for non-contiguous SBAL array in init_data zfcp: inline zfcp_qdio_setup_init_data() s390/qdio: cleanly split alloc and establish s390/mm: use fallthrough;
2 parents c0cc271 + 2bc55ea commit 523a05f

File tree

13 files changed

+110
-168
lines changed

13 files changed

+110
-168
lines changed

arch/s390/include/asm/qdio.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,6 @@ typedef void qdio_handler_t(struct ccw_device *, unsigned int, int,
325325

326326
/**
327327
* struct qdio_initialize - qdio initialization data
328-
* @cdev: associated ccw device
329328
* @q_format: queue format
330329
* @qdr_ac: feature flags to set
331330
* @adapter_name: name for the adapter
@@ -341,12 +340,11 @@ typedef void qdio_handler_t(struct ccw_device *, unsigned int, int,
341340
* @irq_poll: Data IRQ polling handler (NULL when not supported)
342341
* @scan_threshold: # of in-use buffers that triggers scan on output queue
343342
* @int_parm: interruption parameter
344-
* @input_sbal_addr_array: address of no_input_qs * 128 pointers
345-
* @output_sbal_addr_array: address of no_output_qs * 128 pointers
343+
* @input_sbal_addr_array: per-queue array, each element points to 128 SBALs
344+
* @output_sbal_addr_array: per-queue array, each element points to 128 SBALs
346345
* @output_sbal_state_array: no_output_qs * 128 state info (for CQ or NULL)
347346
*/
348347
struct qdio_initialize {
349-
struct ccw_device *cdev;
350348
unsigned char q_format;
351349
unsigned char qdr_ac;
352350
unsigned char adapter_name[8];
@@ -362,8 +360,8 @@ struct qdio_initialize {
362360
void (*irq_poll)(struct ccw_device *cdev, unsigned long data);
363361
unsigned int scan_threshold;
364362
unsigned long int_parm;
365-
struct qdio_buffer **input_sbal_addr_array;
366-
struct qdio_buffer **output_sbal_addr_array;
363+
struct qdio_buffer ***input_sbal_addr_array;
364+
struct qdio_buffer ***output_sbal_addr_array;
367365
struct qdio_outbuf_state *output_sbal_state_array;
368366
};
369367

@@ -408,8 +406,10 @@ int qdio_alloc_buffers(struct qdio_buffer **buf, unsigned int count);
408406
void qdio_free_buffers(struct qdio_buffer **buf, unsigned int count);
409407
void qdio_reset_buffers(struct qdio_buffer **buf, unsigned int count);
410408

411-
extern int qdio_allocate(struct qdio_initialize *);
412-
extern int qdio_establish(struct qdio_initialize *);
409+
extern int qdio_allocate(struct ccw_device *cdev, unsigned int no_input_qs,
410+
unsigned int no_output_qs);
411+
extern int qdio_establish(struct ccw_device *cdev,
412+
struct qdio_initialize *init_data);
413413
extern int qdio_activate(struct ccw_device *);
414414
extern void qdio_release_aob(struct qaob *);
415415
extern int do_QDIO(struct ccw_device *, unsigned int, int, unsigned int,

arch/s390/mm/fault.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -852,9 +852,7 @@ void do_secure_storage_access(struct pt_regs *regs)
852852
BUG();
853853
break;
854854
case VDSO_FAULT:
855-
/* fallthrough */
856855
case GMAP_FAULT:
857-
/* fallthrough */
858856
default:
859857
do_fault_error(regs, VM_READ | VM_WRITE, VM_FAULT_BADMAP);
860858
WARN_ON_ONCE(1);

drivers/s390/cio/device.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -849,8 +849,10 @@ static void io_subchannel_register(struct ccw_device *cdev)
849849
* Now we know this subchannel will stay, we can throw
850850
* our delayed uevent.
851851
*/
852-
dev_set_uevent_suppress(&sch->dev, 0);
853-
kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
852+
if (dev_get_uevent_suppress(&sch->dev)) {
853+
dev_set_uevent_suppress(&sch->dev, 0);
854+
kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
855+
}
854856
/* make it known to the system */
855857
ret = ccw_device_add(cdev);
856858
if (ret) {
@@ -1058,8 +1060,11 @@ static int io_subchannel_probe(struct subchannel *sch)
10581060
* Throw the delayed uevent for the subchannel, register
10591061
* the ccw_device and exit.
10601062
*/
1061-
dev_set_uevent_suppress(&sch->dev, 0);
1062-
kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
1063+
if (dev_get_uevent_suppress(&sch->dev)) {
1064+
/* should always be the case for the console */
1065+
dev_set_uevent_suppress(&sch->dev, 0);
1066+
kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
1067+
}
10631068
cdev = sch_get_cdev(sch);
10641069
rc = ccw_device_add(cdev);
10651070
if (rc) {

drivers/s390/cio/qdio.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,6 @@ int tiqdio_allocate_memory(void);
374374
void tiqdio_free_memory(void);
375375
int tiqdio_register_thinints(void);
376376
void tiqdio_unregister_thinints(void);
377-
void clear_nonshared_ind(struct qdio_irq *);
378377
int test_nonshared_ind(struct qdio_irq *);
379378

380379
/* prototypes for setup */

drivers/s390/cio/qdio_debug.c

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -58,25 +58,11 @@ static void qdio_clear_dbf_list(void)
5858
mutex_unlock(&qdio_dbf_list_mutex);
5959
}
6060

61-
int qdio_allocate_dbf(struct qdio_initialize *init_data,
62-
struct qdio_irq *irq_ptr)
61+
int qdio_allocate_dbf(struct qdio_irq *irq_ptr)
6362
{
6463
char text[QDIO_DBF_NAME_LEN];
6564
struct qdio_dbf_entry *new_entry;
6665

67-
DBF_EVENT("qfmt:%1d", init_data->q_format);
68-
DBF_HEX(init_data->adapter_name, 8);
69-
DBF_EVENT("qpff%4x", init_data->qib_param_field_format);
70-
DBF_HEX(&init_data->qib_param_field, sizeof(void *));
71-
DBF_HEX(&init_data->input_slib_elements, sizeof(void *));
72-
DBF_HEX(&init_data->output_slib_elements, sizeof(void *));
73-
DBF_EVENT("niq:%1d noq:%1d", init_data->no_input_qs,
74-
init_data->no_output_qs);
75-
DBF_HEX(&init_data->input_handler, sizeof(void *));
76-
DBF_HEX(&init_data->output_handler, sizeof(void *));
77-
DBF_HEX(&init_data->int_parm, sizeof(long));
78-
DBF_HEX(&init_data->input_sbal_addr_array, sizeof(void *));
79-
DBF_HEX(&init_data->output_sbal_addr_array, sizeof(void *));
8066
DBF_EVENT("irq:%8lx", (unsigned long)irq_ptr);
8167

8268
/* allocate trace view for the interface */

drivers/s390/cio/qdio_debug.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ static inline void DBF_DEV_HEX(struct qdio_irq *dev, void *addr,
6464
debug_event(dev->debug_area, level, addr, len);
6565
}
6666

67-
int qdio_allocate_dbf(struct qdio_initialize *init_data,
68-
struct qdio_irq *irq_ptr);
67+
int qdio_allocate_dbf(struct qdio_irq *irq_ptr);
6968
void qdio_setup_debug_entries(struct qdio_irq *irq_ptr);
7069
void qdio_shutdown_debug_entries(struct qdio_irq *irq_ptr);
7170
int qdio_debug_init(void);

drivers/s390/cio/qdio_main.c

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,27 +1220,21 @@ EXPORT_SYMBOL_GPL(qdio_free);
12201220

12211221
/**
12221222
* qdio_allocate - allocate qdio queues and associated data
1223-
* @init_data: initialization data
1223+
* @cdev: associated ccw device
1224+
* @no_input_qs: allocate this number of Input Queues
1225+
* @no_output_qs: allocate this number of Output Queues
12241226
*/
1225-
int qdio_allocate(struct qdio_initialize *init_data)
1227+
int qdio_allocate(struct ccw_device *cdev, unsigned int no_input_qs,
1228+
unsigned int no_output_qs)
12261229
{
1227-
struct ccw_device *cdev = init_data->cdev;
12281230
struct subchannel_id schid;
12291231
struct qdio_irq *irq_ptr;
12301232

12311233
ccw_device_get_schid(cdev, &schid);
12321234
DBF_EVENT("qallocate:%4x", schid.sch_no);
12331235

1234-
if ((init_data->no_input_qs && !init_data->input_handler) ||
1235-
(init_data->no_output_qs && !init_data->output_handler))
1236-
return -EINVAL;
1237-
1238-
if ((init_data->no_input_qs > QDIO_MAX_QUEUES_PER_IRQ) ||
1239-
(init_data->no_output_qs > QDIO_MAX_QUEUES_PER_IRQ))
1240-
return -EINVAL;
1241-
1242-
if ((!init_data->input_sbal_addr_array) ||
1243-
(!init_data->output_sbal_addr_array))
1236+
if (no_input_qs > QDIO_MAX_QUEUES_PER_IRQ ||
1237+
no_output_qs > QDIO_MAX_QUEUES_PER_IRQ)
12441238
return -EINVAL;
12451239

12461240
/* irq_ptr must be in GFP_DMA since it contains ccw1.cda */
@@ -1250,9 +1244,12 @@ int qdio_allocate(struct qdio_initialize *init_data)
12501244

12511245
irq_ptr->cdev = cdev;
12521246
mutex_init(&irq_ptr->setup_mutex);
1253-
if (qdio_allocate_dbf(init_data, irq_ptr))
1247+
if (qdio_allocate_dbf(irq_ptr))
12541248
goto out_rel;
12551249

1250+
DBF_DEV_EVENT(DBF_ERR, irq_ptr, "alloc niq:%1u noq:%1u", no_input_qs,
1251+
no_output_qs);
1252+
12561253
/*
12571254
* Allocate a page for the chsc calls in qdio_establish.
12581255
* Must be pre-allocated since a zfcp recovery will call
@@ -1268,8 +1265,7 @@ int qdio_allocate(struct qdio_initialize *init_data)
12681265
if (!irq_ptr->qdr)
12691266
goto out_rel;
12701267

1271-
if (qdio_allocate_qs(irq_ptr, init_data->no_input_qs,
1272-
init_data->no_output_qs))
1268+
if (qdio_allocate_qs(irq_ptr, no_input_qs, no_output_qs))
12731269
goto out_rel;
12741270

12751271
INIT_LIST_HEAD(&irq_ptr->entry);
@@ -1305,13 +1301,33 @@ static void qdio_detect_hsicq(struct qdio_irq *irq_ptr)
13051301
DBF_EVENT("use_cq:%d", use_cq);
13061302
}
13071303

1304+
static void qdio_trace_init_data(struct qdio_irq *irq,
1305+
struct qdio_initialize *data)
1306+
{
1307+
DBF_DEV_EVENT(DBF_ERR, irq, "qfmt:%1u", data->q_format);
1308+
DBF_DEV_HEX(irq, data->adapter_name, 8, DBF_ERR);
1309+
DBF_DEV_EVENT(DBF_ERR, irq, "qpff%4x", data->qib_param_field_format);
1310+
DBF_DEV_HEX(irq, &data->qib_param_field, sizeof(void *), DBF_ERR);
1311+
DBF_DEV_HEX(irq, &data->input_slib_elements, sizeof(void *), DBF_ERR);
1312+
DBF_DEV_HEX(irq, &data->output_slib_elements, sizeof(void *), DBF_ERR);
1313+
DBF_DEV_EVENT(DBF_ERR, irq, "niq:%1u noq:%1u", data->no_input_qs,
1314+
data->no_output_qs);
1315+
DBF_DEV_HEX(irq, &data->input_handler, sizeof(void *), DBF_ERR);
1316+
DBF_DEV_HEX(irq, &data->output_handler, sizeof(void *), DBF_ERR);
1317+
DBF_DEV_HEX(irq, &data->int_parm, sizeof(long), DBF_ERR);
1318+
DBF_DEV_HEX(irq, &data->input_sbal_addr_array, sizeof(void *), DBF_ERR);
1319+
DBF_DEV_HEX(irq, &data->output_sbal_addr_array, sizeof(void *),
1320+
DBF_ERR);
1321+
}
1322+
13081323
/**
13091324
* qdio_establish - establish queues on a qdio subchannel
1325+
* @cdev: associated ccw device
13101326
* @init_data: initialization data
13111327
*/
1312-
int qdio_establish(struct qdio_initialize *init_data)
1328+
int qdio_establish(struct ccw_device *cdev,
1329+
struct qdio_initialize *init_data)
13131330
{
1314-
struct ccw_device *cdev = init_data->cdev;
13151331
struct qdio_irq *irq_ptr = cdev->private->qdio_data;
13161332
struct subchannel_id schid;
13171333
int rc;
@@ -1322,7 +1338,16 @@ int qdio_establish(struct qdio_initialize *init_data)
13221338
if (!irq_ptr)
13231339
return -ENODEV;
13241340

1341+
if ((init_data->no_input_qs && !init_data->input_handler) ||
1342+
(init_data->no_output_qs && !init_data->output_handler))
1343+
return -EINVAL;
1344+
1345+
if (!init_data->input_sbal_addr_array ||
1346+
!init_data->output_sbal_addr_array)
1347+
return -EINVAL;
1348+
13251349
mutex_lock(&irq_ptr->setup_mutex);
1350+
qdio_trace_init_data(irq_ptr, init_data);
13261351
qdio_setup_irq(irq_ptr, init_data);
13271352

13281353
rc = qdio_establish_thinint(irq_ptr);
@@ -1618,8 +1643,6 @@ int qdio_start_irq(struct ccw_device *cdev)
16181643
if (!irq_ptr)
16191644
return -ENODEV;
16201645

1621-
clear_nonshared_ind(irq_ptr);
1622-
16231646
for_each_input_queue(irq_ptr, q, i)
16241647
qdio_stop_polling(q);
16251648

drivers/s390/cio/qdio_setup.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,6 @@ static void setup_queues(struct qdio_irq *irq_ptr,
213213
struct qdio_initialize *qdio_init)
214214
{
215215
struct qdio_q *q;
216-
struct qdio_buffer **input_sbal_array = qdio_init->input_sbal_addr_array;
217-
struct qdio_buffer **output_sbal_array = qdio_init->output_sbal_addr_array;
218216
struct qdio_outbuf_state *output_sbal_state_array =
219217
qdio_init->output_sbal_state_array;
220218
int i;
@@ -225,8 +223,8 @@ static void setup_queues(struct qdio_irq *irq_ptr,
225223

226224
q->is_input_q = 1;
227225

228-
setup_storage_lists(q, irq_ptr, input_sbal_array, i);
229-
input_sbal_array += QDIO_MAX_BUFFERS_PER_Q;
226+
setup_storage_lists(q, irq_ptr,
227+
qdio_init->input_sbal_addr_array[i], i);
230228

231229
if (is_thinint_irq(irq_ptr)) {
232230
tasklet_init(&q->tasklet, tiqdio_inbound_processing,
@@ -245,8 +243,8 @@ static void setup_queues(struct qdio_irq *irq_ptr,
245243
output_sbal_state_array += QDIO_MAX_BUFFERS_PER_Q;
246244

247245
q->is_input_q = 0;
248-
setup_storage_lists(q, irq_ptr, output_sbal_array, i);
249-
output_sbal_array += QDIO_MAX_BUFFERS_PER_Q;
246+
setup_storage_lists(q, irq_ptr,
247+
qdio_init->output_sbal_addr_array[i], i);
250248

251249
tasklet_init(&q->tasklet, qdio_outbound_processing,
252250
(unsigned long) q);

drivers/s390/cio/qdio_thinint.c

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -82,36 +82,16 @@ void tiqdio_remove_device(struct qdio_irq *irq_ptr)
8282
INIT_LIST_HEAD(&irq_ptr->entry);
8383
}
8484

85-
static inline int has_multiple_inq_on_dsci(struct qdio_irq *irq_ptr)
86-
{
87-
return irq_ptr->nr_input_qs > 1;
88-
}
89-
9085
static inline int references_shared_dsci(struct qdio_irq *irq_ptr)
9186
{
9287
return irq_ptr->dsci == &q_indicators[TIQDIO_SHARED_IND].ind;
9388
}
9489

95-
static inline int shared_ind(struct qdio_irq *irq_ptr)
96-
{
97-
return references_shared_dsci(irq_ptr) ||
98-
has_multiple_inq_on_dsci(irq_ptr);
99-
}
100-
101-
void clear_nonshared_ind(struct qdio_irq *irq_ptr)
102-
{
103-
if (!is_thinint_irq(irq_ptr))
104-
return;
105-
if (shared_ind(irq_ptr))
106-
return;
107-
xchg(irq_ptr->dsci, 0);
108-
}
109-
11090
int test_nonshared_ind(struct qdio_irq *irq_ptr)
11191
{
11292
if (!is_thinint_irq(irq_ptr))
11393
return 0;
114-
if (shared_ind(irq_ptr))
94+
if (references_shared_dsci(irq_ptr))
11595
return 0;
11696
if (*irq_ptr->dsci)
11797
return 1;
@@ -131,8 +111,7 @@ static inline void tiqdio_call_inq_handlers(struct qdio_irq *irq)
131111
struct qdio_q *q;
132112
int i;
133113

134-
if (!references_shared_dsci(irq) &&
135-
has_multiple_inq_on_dsci(irq))
114+
if (!references_shared_dsci(irq))
136115
xchg(irq->dsci, 0);
137116

138117
if (irq->irq_poll) {
@@ -145,9 +124,6 @@ static inline void tiqdio_call_inq_handlers(struct qdio_irq *irq)
145124
}
146125

147126
for_each_input_queue(irq, q, i) {
148-
if (!shared_ind(irq))
149-
xchg(irq->dsci, 0);
150-
151127
/*
152128
* Call inbound processing but not directly
153129
* since that could starve other thinint queues.

drivers/s390/cio/vfio_ccw_drv.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ static int vfio_ccw_sch_probe(struct subchannel *sch)
167167
if (ret)
168168
goto out_disable;
169169

170+
if (dev_get_uevent_suppress(&sch->dev)) {
171+
dev_set_uevent_suppress(&sch->dev, 0);
172+
kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
173+
}
174+
170175
VFIO_CCW_MSG_EVENT(4, "bound to subchannel %x.%x.%04x\n",
171176
sch->schid.cssid, sch->schid.ssid,
172177
sch->schid.sch_no);

0 commit comments

Comments
 (0)