Commit 34249d0f9243fce773c2fa352934ba108320e234
Committed by
Martin Schwidefsky
1 parent
9575bf2657
[S390] runtime switch for qdio performance statistics
Remove CONFIG_QETH_PERF_STATS and use a sysfs attribute instead. We want to have the ability to turn the statistics on/off at runtime. Signed-off-by: Ursula Braun <braunu@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Showing 4 changed files with 135 additions and 128 deletions Side-by-side Diff
arch/s390/Kconfig
... | ... | @@ -258,14 +258,6 @@ |
258 | 258 | |
259 | 259 | If unsure, say Y. |
260 | 260 | |
261 | -config QDIO_PERF_STATS | |
262 | - bool "Performance statistics in /proc" | |
263 | - depends on QDIO | |
264 | - help | |
265 | - Say Y here to get performance statistics in /proc/qdio_perf | |
266 | - | |
267 | - If unsure, say N. | |
268 | - | |
269 | 261 | config QDIO_DEBUG |
270 | 262 | bool "Extended debugging information" |
271 | 263 | depends on QDIO |
arch/s390/defconfig
drivers/s390/cio/qdio.c
... | ... | @@ -46,6 +46,7 @@ |
46 | 46 | #include <asm/timex.h> |
47 | 47 | |
48 | 48 | #include <asm/debug.h> |
49 | +#include <asm/s390_rdev.h> | |
49 | 50 | #include <asm/qdio.h> |
50 | 51 | |
51 | 52 | #include "cio.h" |
52 | 53 | |
53 | 54 | |
... | ... | @@ -65,12 +66,12 @@ |
65 | 66 | /******************** HERE WE GO ***********************************/ |
66 | 67 | |
67 | 68 | static const char version[] = "QDIO base support version 2"; |
69 | +extern struct bus_type ccw_bus_type; | |
68 | 70 | |
69 | -#ifdef QDIO_PERFORMANCE_STATS | |
71 | +static int qdio_performance_stats = 0; | |
70 | 72 | static int proc_perf_file_registration; |
71 | 73 | static unsigned long i_p_c, i_p_nc, o_p_c, o_p_nc, ii_p_c, ii_p_nc; |
72 | 74 | static struct qdio_perf_stats perf_stats; |
73 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
74 | 75 | |
75 | 76 | static int hydra_thinints; |
76 | 77 | static int is_passthrough = 0; |
... | ... | @@ -275,9 +276,8 @@ |
275 | 276 | QDIO_DBF_TEXT4(0,trace,"sigasync"); |
276 | 277 | QDIO_DBF_HEX4(0,trace,&q,sizeof(void*)); |
277 | 278 | |
278 | -#ifdef QDIO_PERFORMANCE_STATS | |
279 | - perf_stats.siga_syncs++; | |
280 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
279 | + if (qdio_performance_stats) | |
280 | + perf_stats.siga_syncs++; | |
281 | 281 | |
282 | 282 | cc = do_siga_sync(q->schid, gpr2, gpr3); |
283 | 283 | if (cc) |
... | ... | @@ -322,9 +322,8 @@ |
322 | 322 | __u32 busy_bit; |
323 | 323 | __u64 start_time=0; |
324 | 324 | |
325 | -#ifdef QDIO_PERFORMANCE_STATS | |
326 | - perf_stats.siga_outs++; | |
327 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
325 | + if (qdio_performance_stats) | |
326 | + perf_stats.siga_outs++; | |
328 | 327 | |
329 | 328 | QDIO_DBF_TEXT4(0,trace,"sigaout"); |
330 | 329 | QDIO_DBF_HEX4(0,trace,&q,sizeof(void*)); |
... | ... | @@ -358,9 +357,8 @@ |
358 | 357 | QDIO_DBF_TEXT4(0,trace,"sigain"); |
359 | 358 | QDIO_DBF_HEX4(0,trace,&q,sizeof(void*)); |
360 | 359 | |
361 | -#ifdef QDIO_PERFORMANCE_STATS | |
362 | - perf_stats.siga_ins++; | |
363 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
360 | + if (qdio_performance_stats) | |
361 | + perf_stats.siga_ins++; | |
364 | 362 | |
365 | 363 | cc = do_siga_input(q->schid, q->mask); |
366 | 364 | |
... | ... | @@ -954,9 +952,8 @@ |
954 | 952 | |
955 | 953 | if (unlikely(qdio_reserve_q(q))) { |
956 | 954 | qdio_release_q(q); |
957 | -#ifdef QDIO_PERFORMANCE_STATS | |
958 | - o_p_c++; | |
959 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
955 | + if (qdio_performance_stats) | |
956 | + o_p_c++; | |
960 | 957 | /* as we're sissies, we'll check next time */ |
961 | 958 | if (likely(!atomic_read(&q->is_in_shutdown))) { |
962 | 959 | qdio_mark_q(q); |
... | ... | @@ -964,10 +961,10 @@ |
964 | 961 | } |
965 | 962 | return; |
966 | 963 | } |
967 | -#ifdef QDIO_PERFORMANCE_STATS | |
968 | - o_p_nc++; | |
969 | - perf_stats.tl_runs++; | |
970 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
964 | + if (qdio_performance_stats) { | |
965 | + o_p_nc++; | |
966 | + perf_stats.tl_runs++; | |
967 | + } | |
971 | 968 | |
972 | 969 | /* see comment in qdio_kick_outbound_q */ |
973 | 970 | siga_attempts=atomic_read(&q->busy_siga_counter); |
974 | 971 | |
... | ... | @@ -1142,15 +1139,16 @@ |
1142 | 1139 | { |
1143 | 1140 | int i; |
1144 | 1141 | |
1145 | -#ifdef QDIO_PERFORMANCE_STATS | |
1146 | 1142 | static int old_pcis=0; |
1147 | 1143 | static int old_thinints=0; |
1148 | 1144 | |
1149 | - if ((old_pcis==perf_stats.pcis)&&(old_thinints==perf_stats.thinints)) | |
1150 | - perf_stats.start_time_inbound=NOW; | |
1151 | - else | |
1152 | - old_pcis=perf_stats.pcis; | |
1153 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1145 | + if (qdio_performance_stats) { | |
1146 | + if ((old_pcis==perf_stats.pcis)&& | |
1147 | + (old_thinints==perf_stats.thinints)) | |
1148 | + perf_stats.start_time_inbound=NOW; | |
1149 | + else | |
1150 | + old_pcis=perf_stats.pcis; | |
1151 | + } | |
1154 | 1152 | |
1155 | 1153 | i=qdio_get_inbound_buffer_frontier(q); |
1156 | 1154 | if ( (i!=GET_SAVED_FRONTIER(q)) || |
... | ... | @@ -1340,10 +1338,10 @@ |
1340 | 1338 | q->siga_error=0; |
1341 | 1339 | q->error_status_flags=0; |
1342 | 1340 | |
1343 | -#ifdef QDIO_PERFORMANCE_STATS | |
1344 | - perf_stats.inbound_time+=NOW-perf_stats.start_time_inbound; | |
1345 | - perf_stats.inbound_cnt++; | |
1346 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1341 | + if (qdio_performance_stats) { | |
1342 | + perf_stats.inbound_time+=NOW-perf_stats.start_time_inbound; | |
1343 | + perf_stats.inbound_cnt++; | |
1344 | + } | |
1347 | 1345 | } |
1348 | 1346 | |
1349 | 1347 | static inline void |
... | ... | @@ -1363,9 +1361,8 @@ |
1363 | 1361 | */ |
1364 | 1362 | if (unlikely(qdio_reserve_q(q))) { |
1365 | 1363 | qdio_release_q(q); |
1366 | -#ifdef QDIO_PERFORMANCE_STATS | |
1367 | - ii_p_c++; | |
1368 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1364 | + if (qdio_performance_stats) | |
1365 | + ii_p_c++; | |
1369 | 1366 | /* |
1370 | 1367 | * as we might just be about to stop polling, we make |
1371 | 1368 | * sure that we check again at least once more |
... | ... | @@ -1373,9 +1370,8 @@ |
1373 | 1370 | tiqdio_sched_tl(); |
1374 | 1371 | return; |
1375 | 1372 | } |
1376 | -#ifdef QDIO_PERFORMANCE_STATS | |
1377 | - ii_p_nc++; | |
1378 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1373 | + if (qdio_performance_stats) | |
1374 | + ii_p_nc++; | |
1379 | 1375 | if (unlikely(atomic_read(&q->is_in_shutdown))) { |
1380 | 1376 | qdio_unmark_q(q); |
1381 | 1377 | goto out; |
1382 | 1378 | |
... | ... | @@ -1416,11 +1412,11 @@ |
1416 | 1412 | irq_ptr = (struct qdio_irq*)q->irq_ptr; |
1417 | 1413 | for (i=0;i<irq_ptr->no_output_qs;i++) { |
1418 | 1414 | oq = irq_ptr->output_qs[i]; |
1419 | -#ifdef QDIO_PERFORMANCE_STATS | |
1420 | - perf_stats.tl_runs--; | |
1421 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1422 | - if (!qdio_is_outbound_q_done(oq)) | |
1415 | + if (!qdio_is_outbound_q_done(oq)) { | |
1416 | + if (qdio_performance_stats) | |
1417 | + perf_stats.tl_runs--; | |
1423 | 1418 | __qdio_outbound_processing(oq); |
1419 | + } | |
1424 | 1420 | } |
1425 | 1421 | } |
1426 | 1422 | |
... | ... | @@ -1457,9 +1453,8 @@ |
1457 | 1453 | |
1458 | 1454 | if (unlikely(qdio_reserve_q(q))) { |
1459 | 1455 | qdio_release_q(q); |
1460 | -#ifdef QDIO_PERFORMANCE_STATS | |
1461 | - i_p_c++; | |
1462 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1456 | + if (qdio_performance_stats) | |
1457 | + i_p_c++; | |
1463 | 1458 | /* as we're sissies, we'll check next time */ |
1464 | 1459 | if (likely(!atomic_read(&q->is_in_shutdown))) { |
1465 | 1460 | qdio_mark_q(q); |
... | ... | @@ -1467,10 +1462,10 @@ |
1467 | 1462 | } |
1468 | 1463 | return; |
1469 | 1464 | } |
1470 | -#ifdef QDIO_PERFORMANCE_STATS | |
1471 | - i_p_nc++; | |
1472 | - perf_stats.tl_runs++; | |
1473 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1465 | + if (qdio_performance_stats) { | |
1466 | + i_p_nc++; | |
1467 | + perf_stats.tl_runs++; | |
1468 | + } | |
1474 | 1469 | |
1475 | 1470 | again: |
1476 | 1471 | if (qdio_has_inbound_q_moved(q)) { |
... | ... | @@ -1516,9 +1511,8 @@ |
1516 | 1511 | |
1517 | 1512 | if (unlikely(qdio_reserve_q(q))) { |
1518 | 1513 | qdio_release_q(q); |
1519 | -#ifdef QDIO_PERFORMANCE_STATS | |
1520 | - ii_p_c++; | |
1521 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1514 | + if (qdio_performance_stats) | |
1515 | + ii_p_c++; | |
1522 | 1516 | /* |
1523 | 1517 | * as we might just be about to stop polling, we make |
1524 | 1518 | * sure that we check again at least once more |
... | ... | @@ -1609,9 +1603,8 @@ |
1609 | 1603 | { |
1610 | 1604 | QDIO_DBF_TEXT4(0,trace,"iqdio_tl"); |
1611 | 1605 | |
1612 | -#ifdef QDIO_PERFORMANCE_STATS | |
1613 | - perf_stats.tl_runs++; | |
1614 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1606 | + if (qdio_performance_stats) | |
1607 | + perf_stats.tl_runs++; | |
1615 | 1608 | |
1616 | 1609 | tiqdio_inbound_checks(); |
1617 | 1610 | } |
... | ... | @@ -1918,10 +1911,10 @@ |
1918 | 1911 | { |
1919 | 1912 | QDIO_DBF_TEXT4(0,trace,"thin_int"); |
1920 | 1913 | |
1921 | -#ifdef QDIO_PERFORMANCE_STATS | |
1922 | - perf_stats.thinints++; | |
1923 | - perf_stats.start_time_inbound=NOW; | |
1924 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1914 | + if (qdio_performance_stats) { | |
1915 | + perf_stats.thinints++; | |
1916 | + perf_stats.start_time_inbound=NOW; | |
1917 | + } | |
1925 | 1918 | |
1926 | 1919 | /* SVS only when needed: |
1927 | 1920 | * issue SVS to benefit from iqdio interrupt avoidance |
1928 | 1921 | |
... | ... | @@ -1976,18 +1969,17 @@ |
1976 | 1969 | int i; |
1977 | 1970 | struct qdio_q *q; |
1978 | 1971 | |
1979 | -#ifdef QDIO_PERFORMANCE_STATS | |
1980 | - perf_stats.pcis++; | |
1981 | - perf_stats.start_time_inbound=NOW; | |
1982 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1972 | + if (qdio_performance_stats) { | |
1973 | + perf_stats.pcis++; | |
1974 | + perf_stats.start_time_inbound=NOW; | |
1975 | + } | |
1983 | 1976 | for (i=0;i<irq_ptr->no_input_qs;i++) { |
1984 | 1977 | q=irq_ptr->input_qs[i]; |
1985 | 1978 | if (q->is_input_q&QDIO_FLAG_NO_INPUT_INTERRUPT_CONTEXT) |
1986 | 1979 | qdio_mark_q(q); |
1987 | 1980 | else { |
1988 | -#ifdef QDIO_PERFORMANCE_STATS | |
1989 | - perf_stats.tl_runs--; | |
1990 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
1981 | + if (qdio_performance_stats) | |
1982 | + perf_stats.tl_runs--; | |
1991 | 1983 | __qdio_inbound_processing(q); |
1992 | 1984 | } |
1993 | 1985 | } |
1994 | 1986 | |
... | ... | @@ -1995,11 +1987,10 @@ |
1995 | 1987 | return; |
1996 | 1988 | for (i=0;i<irq_ptr->no_output_qs;i++) { |
1997 | 1989 | q=irq_ptr->output_qs[i]; |
1998 | -#ifdef QDIO_PERFORMANCE_STATS | |
1999 | - perf_stats.tl_runs--; | |
2000 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
2001 | 1990 | if (qdio_is_outbound_q_done(q)) |
2002 | 1991 | continue; |
1992 | + if (qdio_performance_stats) | |
1993 | + perf_stats.tl_runs--; | |
2003 | 1994 | if (!irq_ptr->sync_done_on_outb_pcis) |
2004 | 1995 | SYNC_MEMORY; |
2005 | 1996 | __qdio_outbound_processing(q); |
2006 | 1997 | |
... | ... | @@ -3460,19 +3451,18 @@ |
3460 | 3451 | struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr; |
3461 | 3452 | |
3462 | 3453 | /* This is the outbound handling of queues */ |
3463 | -#ifdef QDIO_PERFORMANCE_STATS | |
3464 | - perf_stats.start_time_outbound=NOW; | |
3465 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
3454 | + if (qdio_performance_stats) | |
3455 | + perf_stats.start_time_outbound=NOW; | |
3466 | 3456 | |
3467 | 3457 | qdio_do_qdio_fill_output(q,qidx,count,buffers); |
3468 | 3458 | |
3469 | 3459 | used_elements=atomic_add_return(count, &q->number_of_buffers_used) - count; |
3470 | 3460 | |
3471 | 3461 | if (callflags&QDIO_FLAG_DONT_SIGA) { |
3472 | -#ifdef QDIO_PERFORMANCE_STATS | |
3473 | - perf_stats.outbound_time+=NOW-perf_stats.start_time_outbound; | |
3474 | - perf_stats.outbound_cnt++; | |
3475 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
3462 | + if (qdio_performance_stats) { | |
3463 | + perf_stats.outbound_time+=NOW-perf_stats.start_time_outbound; | |
3464 | + perf_stats.outbound_cnt++; | |
3465 | + } | |
3476 | 3466 | return; |
3477 | 3467 | } |
3478 | 3468 | if (q->is_iqdio_q) { |
... | ... | @@ -3502,9 +3492,8 @@ |
3502 | 3492 | qdio_kick_outbound_q(q); |
3503 | 3493 | } else { |
3504 | 3494 | QDIO_DBF_TEXT3(0,trace, "fast-req"); |
3505 | -#ifdef QDIO_PERFORMANCE_STATS | |
3506 | - perf_stats.fast_reqs++; | |
3507 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
3495 | + if (qdio_performance_stats) | |
3496 | + perf_stats.fast_reqs++; | |
3508 | 3497 | } |
3509 | 3498 | } |
3510 | 3499 | /* |
... | ... | @@ -3515,10 +3504,10 @@ |
3515 | 3504 | __qdio_outbound_processing(q); |
3516 | 3505 | } |
3517 | 3506 | |
3518 | -#ifdef QDIO_PERFORMANCE_STATS | |
3519 | - perf_stats.outbound_time+=NOW-perf_stats.start_time_outbound; | |
3520 | - perf_stats.outbound_cnt++; | |
3521 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
3507 | + if (qdio_performance_stats) { | |
3508 | + perf_stats.outbound_time+=NOW-perf_stats.start_time_outbound; | |
3509 | + perf_stats.outbound_cnt++; | |
3510 | + } | |
3522 | 3511 | } |
3523 | 3512 | |
3524 | 3513 | /* count must be 1 in iqdio */ |
... | ... | @@ -3576,7 +3565,6 @@ |
3576 | 3565 | return 0; |
3577 | 3566 | } |
3578 | 3567 | |
3579 | -#ifdef QDIO_PERFORMANCE_STATS | |
3580 | 3568 | static int |
3581 | 3569 | qdio_perf_procfile_read(char *buffer, char **buffer_location, off_t offset, |
3582 | 3570 | int buffer_length, int *eof, void *data) |
3583 | 3571 | |
3584 | 3572 | |
3585 | 3573 | |
3586 | 3574 | |
3587 | 3575 | |
3588 | 3576 | |
3589 | 3577 | |
3590 | 3578 | |
3591 | 3579 | |
3592 | 3580 | |
... | ... | @@ -3592,29 +3580,29 @@ |
3592 | 3580 | _OUTP_IT("i_p_nc/c=%lu/%lu\n",i_p_nc,i_p_c); |
3593 | 3581 | _OUTP_IT("ii_p_nc/c=%lu/%lu\n",ii_p_nc,ii_p_c); |
3594 | 3582 | _OUTP_IT("o_p_nc/c=%lu/%lu\n",o_p_nc,o_p_c); |
3595 | - _OUTP_IT("Number of tasklet runs (total) : %u\n", | |
3583 | + _OUTP_IT("Number of tasklet runs (total) : %lu\n", | |
3596 | 3584 | perf_stats.tl_runs); |
3597 | 3585 | _OUTP_IT("\n"); |
3598 | - _OUTP_IT("Number of SIGA sync's issued : %u\n", | |
3586 | + _OUTP_IT("Number of SIGA sync's issued : %lu\n", | |
3599 | 3587 | perf_stats.siga_syncs); |
3600 | - _OUTP_IT("Number of SIGA in's issued : %u\n", | |
3588 | + _OUTP_IT("Number of SIGA in's issued : %lu\n", | |
3601 | 3589 | perf_stats.siga_ins); |
3602 | - _OUTP_IT("Number of SIGA out's issued : %u\n", | |
3590 | + _OUTP_IT("Number of SIGA out's issued : %lu\n", | |
3603 | 3591 | perf_stats.siga_outs); |
3604 | - _OUTP_IT("Number of PCIs caught : %u\n", | |
3592 | + _OUTP_IT("Number of PCIs caught : %lu\n", | |
3605 | 3593 | perf_stats.pcis); |
3606 | - _OUTP_IT("Number of adapter interrupts caught : %u\n", | |
3594 | + _OUTP_IT("Number of adapter interrupts caught : %lu\n", | |
3607 | 3595 | perf_stats.thinints); |
3608 | - _OUTP_IT("Number of fast requeues (outg. SBALs w/o SIGA) : %u\n", | |
3596 | + _OUTP_IT("Number of fast requeues (outg. SBALs w/o SIGA) : %lu\n", | |
3609 | 3597 | perf_stats.fast_reqs); |
3610 | 3598 | _OUTP_IT("\n"); |
3611 | - _OUTP_IT("Total time of all inbound actions (us) incl. UL : %u\n", | |
3599 | + _OUTP_IT("Total time of all inbound actions (us) incl. UL : %lu\n", | |
3612 | 3600 | perf_stats.inbound_time); |
3613 | - _OUTP_IT("Number of inbound transfers : %u\n", | |
3601 | + _OUTP_IT("Number of inbound transfers : %lu\n", | |
3614 | 3602 | perf_stats.inbound_cnt); |
3615 | - _OUTP_IT("Total time of all outbound do_QDIOs (us) : %u\n", | |
3603 | + _OUTP_IT("Total time of all outbound do_QDIOs (us) : %lu\n", | |
3616 | 3604 | perf_stats.outbound_time); |
3617 | - _OUTP_IT("Number of do_QDIOs outbound : %u\n", | |
3605 | + _OUTP_IT("Number of do_QDIOs outbound : %lu\n", | |
3618 | 3606 | perf_stats.outbound_cnt); |
3619 | 3607 | _OUTP_IT("\n"); |
3620 | 3608 | |
3621 | 3609 | |
... | ... | @@ -3622,12 +3610,10 @@ |
3622 | 3610 | } |
3623 | 3611 | |
3624 | 3612 | static struct proc_dir_entry *qdio_perf_proc_file; |
3625 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
3626 | 3613 | |
3627 | 3614 | static void |
3628 | 3615 | qdio_add_procfs_entry(void) |
3629 | 3616 | { |
3630 | -#ifdef QDIO_PERFORMANCE_STATS | |
3631 | 3617 | proc_perf_file_registration=0; |
3632 | 3618 | qdio_perf_proc_file=create_proc_entry(QDIO_PERF, |
3633 | 3619 | S_IFREG|0444,&proc_root); |
3634 | 3620 | |
3635 | 3621 | |
3636 | 3622 | |
... | ... | @@ -3639,20 +3625,58 @@ |
3639 | 3625 | QDIO_PRINT_WARN("was not able to register perf. " \ |
3640 | 3626 | "proc-file (%i).\n", |
3641 | 3627 | proc_perf_file_registration); |
3642 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
3643 | 3628 | } |
3644 | 3629 | |
3645 | 3630 | static void |
3646 | 3631 | qdio_remove_procfs_entry(void) |
3647 | 3632 | { |
3648 | -#ifdef QDIO_PERFORMANCE_STATS | |
3649 | 3633 | perf_stats.tl_runs=0; |
3650 | 3634 | |
3651 | 3635 | if (!proc_perf_file_registration) /* means if it went ok earlier */ |
3652 | 3636 | remove_proc_entry(QDIO_PERF,&proc_root); |
3653 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
3654 | 3637 | } |
3655 | 3638 | |
3639 | +/** | |
3640 | + * attributes in sysfs | |
3641 | + *****************************************************************************/ | |
3642 | + | |
3643 | +static ssize_t | |
3644 | +qdio_performance_stats_show(struct bus_type *bus, char *buf) | |
3645 | +{ | |
3646 | + return sprintf(buf, "%i\n", qdio_performance_stats ? 1 : 0); | |
3647 | +} | |
3648 | + | |
3649 | +static ssize_t | |
3650 | +qdio_performance_stats_store(struct bus_type *bus, const char *buf, size_t count) | |
3651 | +{ | |
3652 | + char *tmp; | |
3653 | + int i; | |
3654 | + | |
3655 | + i = simple_strtoul(buf, &tmp, 16); | |
3656 | + if ((i == 0) || (i == 1)) { | |
3657 | + if (i == qdio_performance_stats) | |
3658 | + return count; | |
3659 | + qdio_performance_stats = i; | |
3660 | + if (i==0) { | |
3661 | + /* reset perf. stat. info */ | |
3662 | + i_p_nc = 0; | |
3663 | + i_p_c = 0; | |
3664 | + ii_p_nc = 0; | |
3665 | + ii_p_c = 0; | |
3666 | + o_p_nc = 0; | |
3667 | + o_p_c = 0; | |
3668 | + memset(&perf_stats, 0, sizeof(struct qdio_perf_stats)); | |
3669 | + } | |
3670 | + } else { | |
3671 | + QDIO_PRINT_WARN("QDIO performance_stats: write 0 or 1 to this file!\n"); | |
3672 | + return -EINVAL; | |
3673 | + } | |
3674 | + return count; | |
3675 | +} | |
3676 | + | |
3677 | +static BUS_ATTR(qdio_performance_stats, 0644, qdio_performance_stats_show, | |
3678 | + qdio_performance_stats_store); | |
3679 | + | |
3656 | 3680 | static void |
3657 | 3681 | tiqdio_register_thinints(void) |
3658 | 3682 | { |
... | ... | @@ -3697,6 +3721,7 @@ |
3697 | 3721 | kfree(indicators); |
3698 | 3722 | } |
3699 | 3723 | |
3724 | + | |
3700 | 3725 | static void |
3701 | 3726 | qdio_unregister_dbf_views(void) |
3702 | 3727 | { |
3703 | 3728 | |
... | ... | @@ -3798,9 +3823,7 @@ |
3798 | 3823 | init_QDIO(void) |
3799 | 3824 | { |
3800 | 3825 | int res; |
3801 | -#ifdef QDIO_PERFORMANCE_STATS | |
3802 | 3826 | void *ptr; |
3803 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
3804 | 3827 | |
3805 | 3828 | printk("qdio: loading %s\n",version); |
3806 | 3829 | |
3807 | 3830 | |
3808 | 3831 | |
... | ... | @@ -3813,13 +3836,12 @@ |
3813 | 3836 | return res; |
3814 | 3837 | |
3815 | 3838 | QDIO_DBF_TEXT0(0,setup,"initQDIO"); |
3839 | + res = bus_create_file(&ccw_bus_type, &bus_attr_qdio_performance_stats); | |
3816 | 3840 | |
3817 | -#ifdef QDIO_PERFORMANCE_STATS | |
3818 | - memset((void*)&perf_stats,0,sizeof(perf_stats)); | |
3841 | + memset((void*)&perf_stats,0,sizeof(perf_stats)); | |
3819 | 3842 | QDIO_DBF_TEXT0(0,setup,"perfstat"); |
3820 | 3843 | ptr=&perf_stats; |
3821 | 3844 | QDIO_DBF_HEX0(0,setup,&ptr,sizeof(void*)); |
3822 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
3823 | 3845 | |
3824 | 3846 | qdio_add_procfs_entry(); |
3825 | 3847 | |
... | ... | @@ -3843,7 +3865,7 @@ |
3843 | 3865 | qdio_release_qdio_memory(); |
3844 | 3866 | qdio_unregister_dbf_views(); |
3845 | 3867 | mempool_destroy(qdio_mempool_scssc); |
3846 | - | |
3868 | + bus_remove_file(&ccw_bus_type, &bus_attr_qdio_performance_stats); | |
3847 | 3869 | printk("qdio: %s: module removed\n",version); |
3848 | 3870 | } |
3849 | 3871 |
drivers/s390/cio/qdio.h
... | ... | @@ -12,10 +12,6 @@ |
12 | 12 | #endif /* CONFIG_QDIO_DEBUG */ |
13 | 13 | #define QDIO_USE_PROCESSING_STATE |
14 | 14 | |
15 | -#ifdef CONFIG_QDIO_PERF_STATS | |
16 | -#define QDIO_PERFORMANCE_STATS | |
17 | -#endif /* CONFIG_QDIO_PERF_STATS */ | |
18 | - | |
19 | 15 | #define QDIO_MINIMAL_BH_RELIEF_TIME 16 |
20 | 16 | #define QDIO_TIMER_POLL_VALUE 1 |
21 | 17 | #define IQDIO_TIMER_POLL_VALUE 1 |
22 | 18 | |
23 | 19 | |
24 | 20 | |
25 | 21 | |
26 | 22 | |
... | ... | @@ -409,25 +405,23 @@ |
409 | 405 | #define CHSC_FLAG_SIGA_SYNC_DONE_ON_THININTS 0x08 |
410 | 406 | #define CHSC_FLAG_SIGA_SYNC_DONE_ON_OUTB_PCIS 0x04 |
411 | 407 | |
412 | -#ifdef QDIO_PERFORMANCE_STATS | |
413 | 408 | struct qdio_perf_stats { |
414 | - unsigned int tl_runs; | |
409 | + unsigned long tl_runs; | |
415 | 410 | |
416 | - unsigned int siga_outs; | |
417 | - unsigned int siga_ins; | |
418 | - unsigned int siga_syncs; | |
419 | - unsigned int pcis; | |
420 | - unsigned int thinints; | |
421 | - unsigned int fast_reqs; | |
411 | + unsigned long siga_outs; | |
412 | + unsigned long siga_ins; | |
413 | + unsigned long siga_syncs; | |
414 | + unsigned long pcis; | |
415 | + unsigned long thinints; | |
416 | + unsigned long fast_reqs; | |
422 | 417 | |
423 | 418 | __u64 start_time_outbound; |
424 | - unsigned int outbound_cnt; | |
425 | - unsigned int outbound_time; | |
419 | + unsigned long outbound_cnt; | |
420 | + unsigned long outbound_time; | |
426 | 421 | __u64 start_time_inbound; |
427 | - unsigned int inbound_cnt; | |
428 | - unsigned int inbound_time; | |
422 | + unsigned long inbound_cnt; | |
423 | + unsigned long inbound_time; | |
429 | 424 | }; |
430 | -#endif /* QDIO_PERFORMANCE_STATS */ | |
431 | 425 | |
432 | 426 | /* unlikely as the later the better */ |
433 | 427 | #define SYNC_MEMORY if (unlikely(q->siga_sync)) qdio_siga_sync_q(q) |