mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'printk-for-6.19' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux
Pull printk updates from Petr Mladek:
- Allow creaing nbcon console drivers with an unsafe write_atomic()
callback that can only be called by the final nbcon_atomic_flush_unsafe().
Otherwise, the driver would rely on the kthread.
It is going to be used as the-best-effort approach for an
experimental nbcon netconsole driver, see
https://lore.kernel.org/r/20251121-nbcon-v1-2-503d17b2b4af@debian.org
Note that a safe .write_atomic() callback is supposed to work in NMI
context. But some networking drivers are not safe even in IRQ
context:
https://lore.kernel.org/r/oc46gdpmmlly5o44obvmoatfqo5bhpgv7pabpvb6sjuqioymcg@gjsma3ghoz35
In an ideal world, all networking drivers would be fixed first and
the atomic flush would be blocked only in NMI context. But it brings
the question how reliable networking drivers are when the system is
in a bad state. They might block flushing more reliable serial
consoles which are more suitable for serious debugging anyway.
- Allow to use the last 4 bytes of the printk ring buffer.
- Prevent queuing IRQ work and block printk kthreads when consoles are
suspended. Otherwise, they create non-necessary churn or even block
the suspend.
- Release console_lock() between each record in the kthread used for
legacy consoles on RT. It might significantly speed up the boot.
- Release nbcon context between each record in the atomic flush. It
prevents stalls of the related printk kthread after it has lost the
ownership in the middle of a record
- Add support for NBCON consoles into KDB
- Add %ptsP modifier for printing struct timespec64 and use it where
possible
- Misc code clean up
* tag 'printk-for-6.19' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux: (48 commits)
printk: Use console_is_usable on console_unblank
arch: um: kmsg_dump: Use console_is_usable
drivers: serial: kgdboc: Drop checks for CON_ENABLED and CON_BOOT
lib/vsprintf: Unify FORMAT_STATE_NUM handlers
printk: Avoid irq_work for printk_deferred() on suspend
printk: Avoid scheduling irq_work on suspend
printk: Allow printk_trigger_flush() to flush all types
tracing: Switch to use %ptSp
scsi: snic: Switch to use %ptSp
scsi: fnic: Switch to use %ptSp
s390/dasd: Switch to use %ptSp
ptp: ocp: Switch to use %ptSp
pps: Switch to use %ptSp
PCI: epf-test: Switch to use %ptSp
net: dsa: sja1105: Switch to use %ptSp
mmc: mmc_test: Switch to use %ptSp
media: av7110: Switch to use %ptSp
ipmi: Switch to use %ptSp
igb: Switch to use %ptSp
e1000e: Switch to use %ptSp
...
This commit is contained in:
@@ -547,11 +547,13 @@ Time and date
|
||||
%pt[RT]s YYYY-mm-dd HH:MM:SS
|
||||
%pt[RT]d YYYY-mm-dd
|
||||
%pt[RT]t HH:MM:SS
|
||||
%pt[RT][dt][r][s]
|
||||
%ptSp <seconds>.<nanoseconds>
|
||||
%pt[RST][dt][r][s]
|
||||
|
||||
For printing date and time as represented by::
|
||||
|
||||
R struct rtc_time structure
|
||||
R content of struct rtc_time
|
||||
S content of struct timespec64
|
||||
T time64_t type
|
||||
|
||||
in human readable format.
|
||||
@@ -563,6 +565,11 @@ The %pt[RT]s (space) will override ISO 8601 separator by using ' ' (space)
|
||||
instead of 'T' (Capital T) between date and time. It won't have any effect
|
||||
when date or time is omitted.
|
||||
|
||||
The %ptSp is equivalent to %lld.%09ld for the content of the struct timespec64.
|
||||
When the other specifiers are given, it becomes the respective equivalent of
|
||||
%ptT[dt][r][s].%09ld. In other words, the seconds are being printed in
|
||||
the human readable format followed by a dot and nanoseconds.
|
||||
|
||||
Passed by reference.
|
||||
|
||||
struct clk
|
||||
|
||||
@@ -20608,6 +20608,7 @@ R: John Ogness <john.ogness@linutronix.de>
|
||||
R: Sergey Senozhatsky <senozhatsky@chromium.org>
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux.git
|
||||
F: Documentation/core-api/printk-basics.rst
|
||||
F: include/linux/printk.h
|
||||
F: kernel/printk/
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ static void kmsg_dumper_stdout(struct kmsg_dumper *dumper,
|
||||
* expected to output the crash information.
|
||||
*/
|
||||
if (strcmp(con->name, "ttynull") != 0 &&
|
||||
(console_srcu_read_flags(con) & CON_ENABLED)) {
|
||||
console_is_usable(con, console_srcu_read_flags(con), true)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -275,8 +275,7 @@ void debug_timestamp(struct smi_info *smi_info, char *msg)
|
||||
struct timespec64 t;
|
||||
|
||||
ktime_get_ts64(&t);
|
||||
dev_dbg(smi_info->io.dev, "**%s: %lld.%9.9ld\n",
|
||||
msg, t.tv_sec, t.tv_nsec);
|
||||
dev_dbg(smi_info->io.dev, "**%s: %ptSp\n", msg, &t);
|
||||
}
|
||||
#else
|
||||
#define debug_timestamp(smi_info, x)
|
||||
|
||||
@@ -1083,10 +1083,8 @@ static int sender(void *send_info, struct ipmi_smi_msg *msg)
|
||||
struct timespec64 t;
|
||||
|
||||
ktime_get_real_ts64(&t);
|
||||
dev_dbg(&ssif_info->client->dev,
|
||||
"**Enqueue %02x %02x: %lld.%6.6ld\n",
|
||||
msg->data[0], msg->data[1],
|
||||
(long long)t.tv_sec, (long)t.tv_nsec / NSEC_PER_USEC);
|
||||
dev_dbg(&ssif_info->client->dev, "**Enqueue %02x %02x: %ptSp\n",
|
||||
msg->data[0], msg->data[1], &t);
|
||||
}
|
||||
return IPMI_CC_NO_ERROR;
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ static void sync_print_fence(struct seq_file *s,
|
||||
struct timespec64 ts64 =
|
||||
ktime_to_timespec64(fence->timestamp);
|
||||
|
||||
seq_printf(s, "@%lld.%09ld", (s64)ts64.tv_sec, ts64.tv_nsec);
|
||||
seq_printf(s, "@%ptSp", &ts64);
|
||||
}
|
||||
|
||||
seq_printf(s, ": %lld", fence->seqno);
|
||||
|
||||
@@ -217,8 +217,7 @@ amdgpu_devcoredump_read(char *buffer, loff_t offset, size_t count,
|
||||
drm_printf(&p, "version: " AMDGPU_COREDUMP_VERSION "\n");
|
||||
drm_printf(&p, "kernel: " UTS_RELEASE "\n");
|
||||
drm_printf(&p, "module: " KBUILD_MODNAME "\n");
|
||||
drm_printf(&p, "time: %lld.%09ld\n", coredump->reset_time.tv_sec,
|
||||
coredump->reset_time.tv_nsec);
|
||||
drm_printf(&p, "time: %ptSp\n", &coredump->reset_time);
|
||||
|
||||
if (coredump->reset_task_info.task.pid)
|
||||
drm_printf(&p, "process_name: %s PID: %d\n",
|
||||
|
||||
@@ -794,10 +794,8 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
|
||||
ts_vblank_time = ktime_to_timespec64(*vblank_time);
|
||||
|
||||
drm_dbg_vbl(dev,
|
||||
"crtc %u : v p(%d,%d)@ %lld.%06ld -> %lld.%06ld [e %d us, %d rep]\n",
|
||||
pipe, hpos, vpos,
|
||||
(u64)ts_etime.tv_sec, ts_etime.tv_nsec / 1000,
|
||||
(u64)ts_vblank_time.tv_sec, ts_vblank_time.tv_nsec / 1000,
|
||||
"crtc %u : v p(%d,%d)@ %ptSp -> %ptSp [e %d us, %d rep]\n",
|
||||
pipe, hpos, vpos, &ts_etime, &ts_vblank_time,
|
||||
duration_ns / 1000, i);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -82,8 +82,7 @@ void msm_disp_state_print(struct msm_disp_state *state, struct drm_printer *p)
|
||||
drm_printf(p, "kernel: " UTS_RELEASE "\n");
|
||||
drm_printf(p, "module: " KBUILD_MODNAME "\n");
|
||||
drm_printf(p, "dpu devcoredump\n");
|
||||
drm_printf(p, "time: %lld.%09ld\n",
|
||||
state->time.tv_sec, state->time.tv_nsec);
|
||||
drm_printf(p, "time: %ptSp\n", &state->time);
|
||||
|
||||
list_for_each_entry_safe(block, tmp, &state->blocks, node) {
|
||||
drm_printf(p, "====================%s================\n", block->name);
|
||||
|
||||
@@ -197,8 +197,7 @@ static ssize_t msm_gpu_devcoredump_read(char *buffer, loff_t offset,
|
||||
drm_printf(&p, "---\n");
|
||||
drm_printf(&p, "kernel: " UTS_RELEASE "\n");
|
||||
drm_printf(&p, "module: " KBUILD_MODNAME "\n");
|
||||
drm_printf(&p, "time: %lld.%09ld\n",
|
||||
state->time.tv_sec, state->time.tv_nsec);
|
||||
drm_printf(&p, "time: %ptSp\n", &state->time);
|
||||
if (state->comm)
|
||||
drm_printf(&p, "comm: %s\n", state->comm);
|
||||
if (state->cmd)
|
||||
|
||||
@@ -106,9 +106,9 @@ static ssize_t __xe_devcoredump_read(char *buffer, ssize_t count,
|
||||
drm_puts(&p, "module: " KBUILD_MODNAME "\n");
|
||||
|
||||
ts = ktime_to_timespec64(ss->snapshot_time);
|
||||
drm_printf(&p, "Snapshot time: %lld.%09ld\n", ts.tv_sec, ts.tv_nsec);
|
||||
drm_printf(&p, "Snapshot time: %ptSp\n", &ts);
|
||||
ts = ktime_to_timespec64(ss->boot_time);
|
||||
drm_printf(&p, "Uptime: %lld.%09ld\n", ts.tv_sec, ts.tv_nsec);
|
||||
drm_printf(&p, "Uptime: %ptSp\n", &ts);
|
||||
drm_printf(&p, "Process: %s [%d]\n", ss->process_name, ss->pid);
|
||||
xe_device_snapshot_print(xe, &p);
|
||||
|
||||
|
||||
@@ -586,14 +586,11 @@ static void mmc_test_print_avg_rate(struct mmc_test_card *test, uint64_t bytes,
|
||||
rate = mmc_test_rate(tot, &ts);
|
||||
iops = mmc_test_rate(count * 100, &ts); /* I/O ops per sec x 100 */
|
||||
|
||||
pr_info("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took "
|
||||
"%llu.%09u seconds (%u kB/s, %u KiB/s, "
|
||||
"%u.%02u IOPS, sg_len %d)\n",
|
||||
mmc_hostname(test->card->host), count, sectors, count,
|
||||
sectors >> 1, (sectors & 1 ? ".5" : ""),
|
||||
(u64)ts.tv_sec, (u32)ts.tv_nsec,
|
||||
rate / 1000, rate / 1024, iops / 100, iops % 100,
|
||||
test->area.sg_len);
|
||||
pr_info("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took %ptSp seconds (%u kB/s, %u KiB/s, %u.%02u IOPS, sg_len %d)\n",
|
||||
mmc_hostname(test->card->host), count, sectors, count,
|
||||
sectors >> 1, (sectors & 1 ? ".5" : ""), &ts,
|
||||
rate / 1000, rate / 1024, iops / 100, iops % 100,
|
||||
test->area.sg_len);
|
||||
|
||||
mmc_test_save_transfer_result(test, count, sectors, ts, rate, iops);
|
||||
}
|
||||
@@ -3074,10 +3071,9 @@ static int mtf_test_show(struct seq_file *sf, void *data)
|
||||
seq_printf(sf, "Test %d: %d\n", gr->testcase + 1, gr->result);
|
||||
|
||||
list_for_each_entry(tr, &gr->tr_lst, link) {
|
||||
seq_printf(sf, "%u %d %llu.%09u %u %u.%02u\n",
|
||||
tr->count, tr->sectors,
|
||||
(u64)tr->ts.tv_sec, (u32)tr->ts.tv_nsec,
|
||||
tr->rate, tr->iops / 100, tr->iops % 100);
|
||||
seq_printf(sf, "%u %d %ptSp %u %u.%02u\n",
|
||||
tr->count, tr->sectors, &tr->ts, tr->rate,
|
||||
tr->iops / 100, tr->iops % 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -775,9 +775,8 @@ static void sja1105_tas_state_machine(struct work_struct *work)
|
||||
base_time_ts = ns_to_timespec64(base_time);
|
||||
now_ts = ns_to_timespec64(now);
|
||||
|
||||
dev_dbg(ds->dev, "OPER base time %lld.%09ld (now %lld.%09ld)\n",
|
||||
base_time_ts.tv_sec, base_time_ts.tv_nsec,
|
||||
now_ts.tv_sec, now_ts.tv_nsec);
|
||||
dev_dbg(ds->dev, "OPER base time %ptSp (now %ptSp)\n",
|
||||
&base_time_ts, &now_ts);
|
||||
|
||||
break;
|
||||
|
||||
@@ -798,8 +797,7 @@ static void sja1105_tas_state_machine(struct work_struct *work)
|
||||
if (now < tas_data->oper_base_time) {
|
||||
/* TAS has not started yet */
|
||||
diff = ns_to_timespec64(tas_data->oper_base_time - now);
|
||||
dev_dbg(ds->dev, "time to start: [%lld.%09ld]",
|
||||
diff.tv_sec, diff.tv_nsec);
|
||||
dev_dbg(ds->dev, "time to start: [%ptSp]", &diff);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -229,14 +229,11 @@ static void e1000e_systim_overflow_work(struct work_struct *work)
|
||||
systim_overflow_work.work);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
struct timespec64 ts;
|
||||
u64 ns;
|
||||
|
||||
/* Update the timecounter */
|
||||
ns = timecounter_read(&adapter->tc);
|
||||
ts = ns_to_timespec64(timecounter_read(&adapter->tc));
|
||||
|
||||
ts = ns_to_timespec64(ns);
|
||||
e_dbg("SYSTIM overflow check at %lld.%09lu\n",
|
||||
(long long) ts.tv_sec, ts.tv_nsec);
|
||||
e_dbg("SYSTIM overflow check at %ptSp\n", &ts);
|
||||
|
||||
schedule_delayed_work(&adapter->systim_overflow_work,
|
||||
E1000_SYSTIM_OVERFLOW_PERIOD);
|
||||
|
||||
@@ -840,14 +840,11 @@ static void igb_ptp_overflow_check(struct work_struct *work)
|
||||
struct igb_adapter *igb =
|
||||
container_of(work, struct igb_adapter, ptp_overflow_work.work);
|
||||
struct timespec64 ts;
|
||||
u64 ns;
|
||||
|
||||
/* Update the timecounter */
|
||||
ns = timecounter_read(&igb->tc);
|
||||
ts = ns_to_timespec64(timecounter_read(&igb->tc));
|
||||
|
||||
ts = ns_to_timespec64(ns);
|
||||
pr_debug("igb overflow check at %lld.%09lu\n",
|
||||
(long long) ts.tv_sec, ts.tv_nsec);
|
||||
pr_debug("igb overflow check at %ptSp\n", &ts);
|
||||
|
||||
schedule_delayed_work(&igb->ptp_overflow_work,
|
||||
IGB_SYSTIM_OVERFLOW_PERIOD);
|
||||
|
||||
@@ -331,9 +331,8 @@ static void pci_epf_test_print_rate(struct pci_epf_test *epf_test,
|
||||
rate = div64_u64(size * NSEC_PER_SEC, ns * 1000);
|
||||
|
||||
dev_info(&epf_test->epf->dev,
|
||||
"%s => Size: %llu B, DMA: %s, Time: %llu.%09u s, Rate: %llu KB/s\n",
|
||||
op, size, dma ? "YES" : "NO",
|
||||
(u64)ts.tv_sec, (u32)ts.tv_nsec, rate);
|
||||
"%s => Size: %llu B, DMA: %s, Time: %ptSp s, Rate: %llu KB/s\n",
|
||||
op, size, dma ? "YES" : "NO", &ts, rate);
|
||||
}
|
||||
|
||||
static void pci_epf_test_copy(struct pci_epf_test *epf_test,
|
||||
|
||||
@@ -80,8 +80,7 @@ static enum hrtimer_restart hrtimer_event(struct hrtimer *timer)
|
||||
/* check if we are late */
|
||||
if (expire_time.tv_sec != ts1.tv_sec || ts1.tv_nsec > lim) {
|
||||
local_irq_restore(flags);
|
||||
pr_err("we are late this time %lld.%09ld\n",
|
||||
(s64)ts1.tv_sec, ts1.tv_nsec);
|
||||
pr_err("we are late this time %ptSp\n", &ts1);
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -163,8 +163,7 @@ void pps_event(struct pps_device *pps, struct pps_event_time *ts, int event,
|
||||
/* check event type */
|
||||
BUG_ON((event & (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR)) == 0);
|
||||
|
||||
dev_dbg(&pps->dev, "PPS event at %lld.%09ld\n",
|
||||
(s64)ts->ts_real.tv_sec, ts->ts_real.tv_nsec);
|
||||
dev_dbg(&pps->dev, "PPS event at %ptSp\n", &ts->ts_real);
|
||||
|
||||
timespec_to_pps_ktime(&ts_real, ts->ts_real);
|
||||
|
||||
|
||||
@@ -4287,11 +4287,9 @@ ptp_ocp_summary_show(struct seq_file *s, void *data)
|
||||
ns += (s64)bp->utc_tai_offset * NSEC_PER_SEC;
|
||||
sys_ts = ns_to_timespec64(ns);
|
||||
|
||||
seq_printf(s, "%7s: %lld.%ld == %ptT TAI\n", "PHC",
|
||||
ts.tv_sec, ts.tv_nsec, &ts);
|
||||
seq_printf(s, "%7s: %lld.%ld == %ptT UTC offset %d\n", "SYS",
|
||||
sys_ts.tv_sec, sys_ts.tv_nsec, &sys_ts,
|
||||
bp->utc_tai_offset);
|
||||
seq_printf(s, "%7s: %ptSp == %ptS TAI\n", "PHC", &ts, &ts);
|
||||
seq_printf(s, "%7s: %ptSp == %ptS UTC offset %d\n", "SYS",
|
||||
&sys_ts, &sys_ts, bp->utc_tai_offset);
|
||||
seq_printf(s, "%7s: PHC:SYS offset: %lld window: %lld\n", "",
|
||||
timespec64_to_ns(&ts) - ns,
|
||||
post_ns - pre_ns);
|
||||
@@ -4499,9 +4497,8 @@ ptp_ocp_phc_info(struct ptp_ocp *bp)
|
||||
ptp_clock_index(bp->ptp));
|
||||
|
||||
if (!ptp_ocp_gettimex(&bp->ptp_info, &ts, NULL))
|
||||
dev_info(&bp->pdev->dev, "Time: %lld.%ld, %s\n",
|
||||
ts.tv_sec, ts.tv_nsec,
|
||||
bp->sync ? "in-sync" : "UNSYNCED");
|
||||
dev_info(&bp->pdev->dev, "Time: %ptSp, %s\n",
|
||||
&ts, bp->sync ? "in-sync" : "UNSYNCED");
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -974,8 +974,7 @@ static void dasd_stats_array(struct seq_file *m, unsigned int *array)
|
||||
static void dasd_stats_seq_print(struct seq_file *m,
|
||||
struct dasd_profile_info *data)
|
||||
{
|
||||
seq_printf(m, "start_time %lld.%09ld\n",
|
||||
(s64)data->starttod.tv_sec, data->starttod.tv_nsec);
|
||||
seq_printf(m, "start_time %ptSp\n", &data->starttod);
|
||||
seq_printf(m, "total_requests %u\n", data->dasd_io_reqs);
|
||||
seq_printf(m, "total_sectors %u\n", data->dasd_io_sects);
|
||||
seq_printf(m, "total_pav %u\n", data->dasd_io_alias);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user