[patch 16/38] fbdev: udlfb: Replace get_cycles() with ktime_get()

Thomas Gleixner
2026-04-10T12:20:00Z

These metrics are not really requiring CPU cycles and as those are
meanlingless when the CPU is running at a different frequency, this can use
ktime_get() and achieve the same result.

Part of a larger effort to confine get_cycles() access to low level
architecture code.

Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Cc: Bernie Thompson <bernie@plugable.com>
Cc: linux-fbdev@vger.kernel.org
---
Documentation/fb/udlfb.rst | 4 ++--
drivers/video/fbdev/udlfb.c | 24 ++++++++++++------------
2 files changed, 14 insertions(+), 14 deletions(-)

--- a/Documentation/fb/udlfb.rst
+++ b/Documentation/fb/udlfb.rst
@@ -156,8 +156,8 @@ metrics_bytes_sent 32-bit count of how
USB to communicate the resulting changed pixels to the
hardware. Includes compression and protocol overhead

-metrics_cpu_kcycles_used 32-bit count of CPU cycles used in processing the
- above pixels (in thousands of cycles).
+metrics_cpu_kcycles_used 32-bit count of microseconds used in processing the
+ above pixels

metrics_reset Write-only. Any write to this file resets all metrics
above to zero. Note that the 32-bit counters above
--- a/drivers/video/fbdev/udlfb.c
+++ b/drivers/video/fbdev/udlfb.c
@@ -24,6 +24,7 @@
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/unaligned.h>
+#include <linux/timekeeping.h>
#include <video/udlfb.h>
#include "edid.h"

@@ -600,15 +601,15 @@ static int dlfb_render_hline(struct dlfb

static int dlfb_handle_damage(struct dlfb_data *dlfb, int x, int y, int width, int height)
{
+ ktime_t t_start, t_delta;
int i, ret;
char *cmd;
- cycles_t start_cycles, end_cycles;
int bytes_sent = 0;
int bytes_identical = 0;
struct urb *urb;
int aligned_x;

- start_cycles = get_cycles();
+ t_start = ktime_get();

mutex_lock(&dlfb->render_mutex);

@@ -661,10 +662,9 @@ static int dlfb_handle_damage(struct dlf
atomic_add(bytes_sent, &dlfb->bytes_sent);
atomic_add(bytes_identical, &dlfb->bytes_identical);
atomic_add(width*height*2, &dlfb->bytes_rendered);
- end_cycles = get_cycles();
- atomic_add(((unsigned int) ((end_cycles - start_cycles)
- >> 10)), /* Kcycles */
- &dlfb->cpu_kcycles_used);
+ t_delta = ktime_get() - t_start;
+ /* Avoid a division and approximate microseconds with shift right ten */
+ atomic_add(((int)(t_delta >> 10)), &dlfb->cpu_kcycles_used);

ret = 0;

@@ -727,9 +727,9 @@ static void dlfb_dpy_deferred_io(struct
{
struct fb_deferred_io_pageref *pageref;
struct dlfb_data *dlfb = info->par;
+ ktime_t t_start, t_delta;
struct urb *urb;
char *cmd;
- cycles_t start_cycles, end_cycles;
int bytes_sent = 0;
int bytes_identical = 0;
int bytes_rendered = 0;
@@ -742,7 +742,7 @@ static void dlfb_dpy_deferred_io(struct
if (!atomic_read(&dlfb->usb_active))
goto unlock_ret;

- start_cycles = get_cycles();
+ t_start = ktime_get();

urb = dlfb_get_urb(dlfb);
if (!urb)
@@ -774,10 +774,10 @@ static void dlfb_dpy_deferred_io(struct
atomic_add(bytes_sent, &dlfb->bytes_sent);
atomic_add(bytes_identical, &dlfb->bytes_identical);
atomic_add(bytes_rendered, &dlfb->bytes_rendered);
- end_cycles = get_cycles();
- atomic_add(((unsigned int) ((end_cycles - start_cycles)
- >> 10)), /* Kcycles */
- &dlfb->cpu_kcycles_used);
+ t_delta = ktime_get() - t_start;
+ /* Avoid a division and approximate microseconds with shift right ten */
+ atomic_add(((int)(t_delta >> 10)), &dlfb->cpu_kcycles_used);
+
unlock_ret:
mutex_unlock(&dlfb->render_mutex);
}