С star
ваша командная строка выглядит:
touch -t201802280000 ref
star -c -f file.tar -find. -newer ref
Кстати,:-newermt может стать хорошим улучшением для libfind
в будущем.
Если вам также нравится дата окончания:
touch -t201802280000 start
touch -t201802282359.59 end
star -c -f file.tar -V pat='start!end' -find. -newer start ! -newer end
Обратите внимание, что вы должны либо опустить одну секунду, либо получить два дня, если год был високосным.
Поскольку 2018 год не високосный, вы можете использовать touch -t201803010000 end
.
Воодушевленный комментарием @dirkt, я присмотрелся к драйверам и нашел прерывания PCI MSI, соответствующие этим транзакциям DMA.
Драйвер разрешает эти прерывания вызовом
pci_enable_msix(.., msixTable,..)
, который устанавливает struct msix_entry msixTable[MAXMSIX]
. Затем он передает их обработчику static irqreturn_t irqHandler()
, вызывая request_irq()
в цикле:
request_irq(msixTable[interrupt].vector, irqHandler, 0, devName,...)
Обработчик просто подсчитывает прерывания в локальном int
массиве. Эти счетчики экспортируются в файл /proc/<devName>
, который этот драйвер создает для диагностики и т. д. На самом деле файл proc — это то место, откуда я начал поиск прерываний.
Но есть лучший способ :файла /proc/interrupts
. Включенные прерывания MSI -X отображаются в строках, подобных этим:
$ cat /proc/interrupts
CPU0 CPU1 ... CPU5 CPU6 CPU7
66: 0 0 ... 0 0 0 IR-PCI-MSI-edge <devName>
67: 0 0 ... 0 0 0 IR-PCI-MSI-edge <devName>
68: 33 0 ... 0 0 0 IR-PCI-MSI-edge <devName>
69: 0 0 ... 0 0 0 IR-PCI-MSI-edge <devName>
70: 0 0 ... 0 0 0 IR-PCI-MSI-edge <devName>
71: 0 0 ... 0 0 0 IR-PCI-MSI-edge <devName>
72: 0 0 ... 0 0 0 IR-PCI-MSI-edge <devName>
73: 0 0 ... 0 0 0 IR-PCI-MSI-edge <devName>
И еще один способ — найти PCI-адрес карты в выводе lspci
и проверить назначенные плате прерывания в каталоге /sys
:
$ ls /sys/bus/pci/devices/0000:17:00.0/msi_irqs
66 67 68 69 70 71 72 73
# but these are empty
$ cat /sys/bus/pci/devices/0000:17:00.0/irq
0
Прерывание номер 68 срабатывает к концу транзакций. Обработчики прерываний имеют статическую точку трассировки irq:irq_handler_entry
в Linux. Параметры точки трассировки в /sys/kernel/debug/tracing/events/irq/irq_handler_entry/format
имеют номер прерывания в поле int irq
. Следовательно, это прерывание можно отследить стандартными средствами Linux по этой точке трассировки с условием фильтрации:
# setup the ftrace
trace-cmd start -e irq:irq_handler_entry -f "irq == 68"
# for live stream
cat /sys/kernel/debug/tracing/trace_pipe
# or just
trace-cmd stop
trace-cmd show
trace-cmd reset
# with perf
perf record -e "irq:irq_handler_entry" --filter "irq == 68"
При этом стоит еще раз подтвердить, что эти прерывания необходимы для прямого доступа к памяти, чтобы быть уверенным, что я отслеживаю что-то важное для системы, а не просто удобный счетчик для файла proc
, который может не быть реализуется в другой ситуации.Но я не мог обнаружить какие-либо другие соответствующие прерывания, наблюдая за тем, как они увеличиваются в /proc/interrupts
. Есть прерывания для устройств dmar[0123]
, которые кажутся чем-то вроде DMA, но они никогда не увеличивались. И этого следовало ожидать, так как в этом случае механизм DMA должен быть реализован как ядро FPGA в самой плате PCI.