2022-05-24 12:45:38 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-05-24 21:54:43 -06:00
|
|
|
|
2023-01-24 08:24:25 -07:00
|
|
|
|
2023-01-18 07:56:30 -08:00
|
|
|
|
2024-01-28 20:08:24 -07:00
|
|
|
|
2022-06-16 13:57:19 +01:00
|
|
|
|
2022-11-20 10:18:45 -07:00
|
|
|
|
2024-12-16 15:46:08 -05:00
|
|
|
|
2022-06-16 13:57:19 +01:00
|
|
|
|
2022-06-21 10:09:01 +01:00
|
|
|
|
2022-06-16 13:57:19 +01:00
|
|
|
|
2024-12-16 15:46:14 -05:00
|
|
|
|
2022-05-24 12:45:38 -06:00
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-05-24 15:21:00 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-06-30 02:12:25 -07:00
|
|
|
|
2024-01-29 11:57:11 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-06-30 02:12:25 -07:00
|
|
|
|
2022-11-17 18:40:16 +00:00
|
|
|
|
|
|
|
|
|
2022-06-30 02:12:25 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-05-24 15:21:00 -06:00
|
|
|
|
|
|
|
|
|
2023-06-08 09:38:35 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
io_uring: add support for batch wait timeout
Waiting for events with io_uring has two knobs that can be set:
1) The number of events to wake for
2) The timeout associated with the event
Waiting will abort when either of those conditions are met, as expected.
This adds support for a third event, which is associated with the number
of events to wait for. Applications generally like to handle batches of
completions, and right now they'd set a number of events to wait for and
the timeout for that. If no events have been received but the timeout
triggers, control is returned to the application and it can wait again.
However, if the application doesn't have anything to do until events are
reaped, then it's possible to make this waiting more efficient.
For example, the application may have a latency time of 50 usecs and
wanting to handle a batch of 8 requests at the time. If it uses 50 usecs
as the timeout, then it'll be doing 20K context switches per second even
if nothing is happening.
This introduces the notion of min batch wait time. If the min batch wait
time expires, then we'll return to userspace if we have any events at all.
If none are available, the general wait time is applied. Any request
arriving after the min batch wait time will cause waiting to stop and
return control to the application.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2024-01-04 10:17:54 -07:00
|
|
|
|
2023-06-08 09:38:35 -07:00
|
|
|
|
2024-01-04 08:46:23 -07:00
|
|
|
|
io_uring: add support for batch wait timeout
Waiting for events with io_uring has two knobs that can be set:
1) The number of events to wake for
2) The timeout associated with the event
Waiting will abort when either of those conditions are met, as expected.
This adds support for a third event, which is associated with the number
of events to wait for. Applications generally like to handle batches of
completions, and right now they'd set a number of events to wait for and
the timeout for that. If no events have been received but the timeout
triggers, control is returned to the application and it can wait again.
However, if the application doesn't have anything to do until events are
reaped, then it's possible to make this waiting more efficient.
For example, the application may have a latency time of 50 usecs and
wanting to handle a batch of 8 requests at the time. If it uses 50 usecs
as the timeout, then it'll be doing 20K context switches per second even
if nothing is happening.
This introduces the notion of min batch wait time. If the min batch wait
time expires, then we'll return to userspace if we have any events at all.
If none are available, the general wait time is applied. Any request
arriving after the min batch wait time will cause waiting to stop and
return control to the application.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2024-01-04 10:17:54 -07:00
|
|
|
|
2023-06-08 09:38:35 -07:00
|
|
|
|
2024-01-04 08:46:23 -07:00
|
|
|
|
2023-06-08 09:38:35 -07:00
|
|
|
|
2023-06-08 09:38:36 -07:00
|
|
|
|
2024-07-26 15:24:30 +01:00
|
|
|
|
2023-06-08 09:38:36 -07:00
|
|
|
|
|
|
|
|
|
2023-06-08 09:38:35 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-21 13:29:39 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-21 13:32:19 -06:00
|
|
|
|
2023-08-24 23:53:26 +01:00
|
|
|
|
2022-08-30 05:50:10 -07:00
|
|
|
|
2022-11-24 01:35:53 -08:00
|
|
|
|
2022-11-24 01:35:58 -08:00
|
|
|
|
2024-06-06 10:28:26 -06:00
|
|
|
|
2024-03-18 22:00:31 +00:00
|
|
|
|
2022-06-19 12:26:05 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-04-06 14:20:10 +01:00
|
|
|
|
2024-03-28 12:38:44 -06:00
|
|
|
|
|
|
|
|
|
2022-06-19 12:26:05 +01:00
|
|
|
|
|
|
|
|
|
2023-03-27 16:38:15 +01:00
|
|
|
|
2022-06-19 12:26:05 +01:00
|
|
|
|
2023-03-27 16:38:15 +01:00
|
|
|
|
2024-02-02 10:20:05 -07:00
|
|
|
|
|
|
|
|
|
2022-06-19 12:26:05 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-04-29 01:40:30 +09:00
|
|
|
|
|
|
|
|
|
2024-09-11 17:34:37 +01:00
|
|
|
|
2023-04-29 01:40:30 +09:00
|
|
|
|
2023-03-27 16:38:15 +01:00
|
|
|
|
2022-06-19 12:26:05 +01:00
|
|
|
|
|
|
|
|
|
2023-08-24 23:53:29 +01:00
|
|
|
|
2022-06-19 12:26:05 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-07-12 21:52:47 +01:00
|
|
|
|
2022-07-27 10:30:40 +01:00
|
|
|
|
2022-06-19 12:26:05 +01:00
|
|
|
|
2024-11-03 10:22:43 -07:00
|
|
|
|
2022-06-19 12:26:05 +01:00
|
|
|
|
|
|
|
|
|
2023-12-19 08:54:20 -07:00
|
|
|
|
|
|
|
|
|
2023-10-02 19:51:38 -06:00
|
|
|
|
|
|
|
|
|
2024-03-18 22:00:35 +00:00
|
|
|
|
2023-10-02 19:51:38 -06:00
|
|
|
|
|
|
|
|
|
2025-01-07 14:11:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-10-02 19:51:38 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-01-07 14:11:32 +00:00
|
|
|
|
2023-10-02 19:51:38 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-03-18 22:00:35 +00:00
|
|
|
|
2023-01-04 01:34:57 +00:00
|
|
|
|
2022-11-11 16:54:08 +00:00
|
|
|
|
|
|
|
|
|
2023-04-06 14:20:10 +01:00
|
|
|
|
2022-11-11 16:54:08 +00:00
|
|
|
|
|
|
|
|
|
2024-03-18 22:00:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-03-18 22:00:32 +00:00
|
|
|
|
2024-03-18 22:00:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-06-19 12:26:05 +01:00
|
|
|
|
|
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
2023-08-24 23:53:27 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
2023-01-04 01:34:57 +00:00
|
|
|
|
|
|
|
|
|
2023-08-24 23:53:26 +01:00
|
|
|
|
|
|
|
|
|
2023-08-24 23:53:27 +01:00
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
2023-08-24 23:53:27 +01:00
|
|
|
|
2023-08-24 23:53:26 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-08-24 23:53:27 +01:00
|
|
|
|
2022-09-23 14:53:25 +01:00
|
|
|
|
|
|
|
|
|
2023-08-24 23:53:27 +01:00
|
|
|
|
2022-09-23 14:53:25 +01:00
|
|
|
|
2023-08-24 23:53:27 +01:00
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
|
|
|
|
|
2023-08-24 23:53:30 +01:00
|
|
|
|
|
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-06-17 09:48:04 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-08-24 23:53:27 +01:00
|
|
|
|
2022-12-07 08:50:01 -07:00
|
|
|
|
2022-06-30 02:12:31 -07:00
|
|
|
|
|
|
|
|
|
2022-06-17 09:48:04 +01:00
|
|
|
|
|
|
|
|
|
2023-08-24 23:53:25 +01:00
|
|
|
|
|
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
2024-10-18 17:14:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-06-17 09:48:04 +01:00
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
|
|
|
|
|
2022-05-24 21:19:47 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-05-24 12:45:38 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-16 15:46:08 -05:00
|
|
|
|
2025-01-22 20:00:57 -07:00
|
|
|
|
2024-12-16 15:46:08 -05:00
|
|
|
|
2025-01-23 07:34:36 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-16 15:46:08 -05:00
|
|
|
|
2025-01-23 07:34:36 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-16 15:46:14 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-05-25 05:59:19 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-07-07 11:14:40 -06:00
|
|
|
|
2022-05-24 21:19:47 -06:00
|
|
|
|
2023-07-07 11:14:40 -06:00
|
|
|
|
|
|
|
|
|
2022-05-24 21:19:47 -06:00
|
|
|
|
|
|
|
|
|
2022-05-24 21:54:43 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-01-28 20:32:52 -07:00
|
|
|
|
2022-05-24 21:54:43 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-01-28 20:32:52 -07:00
|
|
|
|
2022-05-24 21:54:43 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-05-25 06:25:13 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-01-09 14:46:08 +00:00
|
|
|
|
|
|
|
|
|
2023-01-09 14:46:09 +00:00
|
|
|
|
2023-01-09 14:46:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-04-06 14:20:09 +01:00
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
|
|
|
|
|
2022-11-20 10:18:45 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
2023-04-06 14:20:09 +01:00
|
|
|
|
2022-11-20 10:18:45 -07:00
|
|
|
|
|
|
|
|
|
2022-06-13 07:27:03 -06:00
|
|
|
|
|
|
|
|
|
2022-05-25 09:13:39 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
io_uring/sqpoll: close race on waiting for sqring entries
When an application uses SQPOLL, it must wait for the SQPOLL thread to
consume SQE entries, if it fails to get an sqe when calling
io_uring_get_sqe(). It can do so by calling io_uring_enter(2) with the
flag value of IORING_ENTER_SQ_WAIT. In liburing, this is generally done
with io_uring_sqring_wait(). There's a natural expectation that once
this call returns, a new SQE entry can be retrieved, filled out, and
submitted. However, the kernel uses the cached sq head to determine if
the SQRING is full or not. If the SQPOLL thread is currently in the
process of submitting SQE entries, it may have updated the cached sq
head, but not yet committed it to the SQ ring. Hence the kernel may find
that there are SQE entries ready to be consumed, and return successfully
to the application. If the SQPOLL thread hasn't yet committed the SQ
ring entries by the time the application returns to userspace and
attempts to get a new SQE, it will fail getting a new SQE.
Fix this by having io_sqring_full() always use the user visible SQ ring
head entry, rather than the internally cached one.
Cc: stable@vger.kernel.org # 5.10+
Link: https://github.com/axboe/liburing/discussions/1267
Reported-by: Benedek Thaler <thaler@thaler.hu>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2024-10-15 08:58:25 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-05-25 09:13:39 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-03-30 10:05:31 -06:00
|
|
|
|
2022-05-25 09:13:39 -06:00
|
|
|
|
|
|
|
|
|
2023-03-30 10:05:31 -06:00
|
|
|
|
|
|
|
|
|
2022-05-25 09:13:39 -06:00
|
|
|
|
|
|
|
|
|
2022-08-30 05:50:10 -07:00
|
|
|
|
2022-05-25 09:13:39 -06:00
|
|
|
|
2024-02-02 10:20:05 -07:00
|
|
|
|
|
|
|
|
|
2022-11-25 09:36:29 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-01-24 08:24:25 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-02-02 10:20:05 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-17 08:31:56 -06:00
|
|
|
|
2024-02-02 10:20:05 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-02-06 08:20:46 -07:00
|
|
|
|
2022-09-29 15:29:13 -06:00
|
|
|
|
2022-05-25 09:13:39 -06:00
|
|
|
|
2022-09-29 15:29:13 -06:00
|
|
|
|
2024-02-02 10:20:05 -07:00
|
|
|
|
2022-05-25 09:13:39 -06:00
|
|
|
|
|
|
|
|
|
2024-02-02 10:20:05 -07:00
|
|
|
|
2022-08-30 05:50:10 -07:00
|
|
|
|
|
|
|
|
|
2024-11-20 14:14:51 -08:00
|
|
|
|
|
|
|
|
|
2024-11-20 14:14:52 -08:00
|
|
|
|
2024-11-20 14:14:51 -08:00
|
|
|
|
|
|
|
|
|
2022-09-03 09:52:01 -06:00
|
|
|
|
|
|
|
|
|
2024-11-20 14:14:51 -08:00
|
|
|
|
2022-09-03 09:52:01 -06:00
|
|
|
|
|
|
|
|
|
2023-03-27 16:38:15 +01:00
|
|
|
|
2022-06-15 17:33:51 +01:00
|
|
|
|
2024-03-18 22:00:30 +00:00
|
|
|
|
2022-06-15 17:33:51 +01:00
|
|
|
|
|
|
|
|
|
2022-06-20 01:26:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-06-15 17:33:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-06-20 01:26:00 +01:00
|
|
|
|
|
|
|
|
|
2022-06-15 17:33:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-06-20 01:25:57 +01:00
|
|
|
|
|
|
|
|
|
2023-01-09 14:46:09 +00:00
|
|
|
|
|
|
|
|
|
2022-06-20 01:25:57 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-07-12 21:52:47 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-07-27 10:30:40 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-01-18 07:56:30 -08:00
|
|
|
|
io_uring/kbuf: Use slab for struct io_buffer objects
The allocation of struct io_buffer for metadata of provided buffers is
done through a custom allocator that directly gets pages and
fragments them. But, slab would do just fine, as this is not a hot path
(in fact, it is a deprecated feature) and, by keeping a custom allocator
implementation we lose benefits like tracking, poisoning,
sanitizers. Finally, the custom code is more complex and requires
keeping the list of pages in struct ctx for no good reason. This patch
cleans this path up and just uses slab.
I microbenchmarked it by forcing the allocation of a large number of
objects with the least number of io_uring commands possible (keeping
nbufs=USHRT_MAX), with and without the patch. There is a slight
increase in time spent in the allocation with slab, of course, but even
when allocating to system resources exhaustion, which is not very
realistic and happened around 1/2 billion provided buffers for me, it
wasn't a significant hit in system time. Specially if we think of a
real-world scenario, an application doing register/unregister of
provided buffers will hit ctx->io_buffers_cache more often than actually
going to slab.
Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
Link: https://lore.kernel.org/r/20231005000531.30800-4-krisman@suse.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2023-10-04 20:05:31 -04:00
|
|
|
|
2023-01-18 07:56:30 -08:00
|
|
|
|
2023-01-23 14:37:16 +00:00
|
|
|
|
2022-07-27 10:30:40 +01:00
|
|
|
|
2023-01-18 07:56:30 -08:00
|
|
|
|
2022-07-27 10:30:40 +01:00
|
|
|
|
2023-01-18 07:56:30 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-07-27 10:30:40 +01:00
|
|
|
|
|
|
|
|
|
2023-01-23 14:37:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-01-05 11:22:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-09-08 16:56:52 +01:00
|
|
|
|
|
|
|
|
|
2022-09-08 16:56:53 +01:00
|
|
|
|
|
|
|
|
|
2022-09-08 16:56:52 +01:00
|
|
|
|
|
|
|
|
|
io_uring: move struct io_kiocb from task_struct to io_uring_task
Rather than store the task_struct itself in struct io_kiocb, store
the io_uring specific task_struct. The life times are the same in terms
of io_uring, and this avoids doing some dereferences through the
task_struct. For the hot path of putting local task references, we can
deref req->tctx instead, which we'll need anyway in that function
regardless of whether it's local or remote references.
This is mostly straight forward, except the original task PF_EXITING
check needs a bit of tweaking. task_work is _always_ run from the
originating task, except in the fallback case, where it's run from a
kernel thread. Replace the potentially racy (in case of fallback work)
checks for req->task->flags with current->flags. It's either the still
the original task, in which case PF_EXITING will be sane, or it has
PF_KTHREAD set, in which case it's fallback work. Both cases should
prevent moving forward with the given request.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2024-11-03 10:23:38 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-11-23 11:33:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-05-04 05:18:54 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-01-28 20:08:24 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-06-01 12:25:35 -06:00
|
|
|
|
2024-01-28 20:08:24 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-02-14 12:59:36 -07:00
|
|
|
|
2024-08-07 15:18:14 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-02-14 12:59:36 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-11-20 14:14:51 -08:00
|
|
|
|
2024-02-14 12:59:36 -07:00
|
|
|
|
2022-05-24 12:45:38 -06:00
|
|
|
|