Source code for crash.subsystem.storage.block
# -*- coding: utf-8 -*-
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:
from typing import Iterable, Tuple
import gdb
from crash.subsystem.storage import queue_is_mq
from crash.subsystem.storage.blocksq import sq_for_each_request_in_queue, \
sq_requests_in_flight, sq_requests_queued
from crash.subsystem.storage.blockmq import mq_for_each_request_in_queue, \
mq_requests_in_flight, mq_requests_queued, mq_queue_request_stats
[docs]
def requests_in_flight(queue: gdb.Value) -> Tuple[int, int]:
"""
Report how many requests are in flight for this queue
Args:
queue: The request queue to inspect for requests in flight.
The value must be of type ``struct request_queue``.
Returns:
(:obj:`int`, :obj:`int`): The requests in flight. The first member of
the 2-tuple is the number of async requests, the second is the number
of sync requests.
"""
if queue_is_mq(queue):
return mq_requests_in_flight(queue)
return sq_requests_in_flight(queue)
[docs]
def requests_queued(queue: gdb.Value) -> Tuple[int, int]:
"""
Report how many requests are queued for this queue
Args:
queue: The request queue to inspect for number of queued requests.
The value must be of type ``struct request_queue``.
Returns:
(:obj:`int`, :obj:`int`): The number of queued requests. The first
member of the 2-tuple is the number of async requests, the second is
the number of sync requests.
"""
if queue_is_mq(queue):
return mq_requests_queued(queue)
return sq_requests_queued(queue)
[docs]
def for_each_request_in_queue(queue: gdb.Value) -> Iterable[gdb.Value]:
"""
Iterates over each ``struct request`` in request_queue
This method iterates over requests queued in ``request_queue``. It takes
care of properly handling both single and multiqueue queues.
Args:
queue: The ``struct request_queue`` used to iterate. The value
must be of type ``struct request_queue``.
Yields:
:obj:`gdb.Value`: Each ``struct request`` contained within the
``request_queue``. The value is of type ``struct request``.
"""
if queue_is_mq(queue):
return mq_for_each_request_in_queue(queue)
return sq_for_each_request_in_queue(queue)
[docs]
def queue_request_stats(queue: gdb.Value) -> Tuple[int, int, int, int]:
"""
Report various request information for this queue
Args:
queue: The request queue to inspect for request information.
The value must be of type ``struct request_queue``.
Returns:
(:obj:`int`, :obj:`int`, :obj:`int`, :obj:`int`): Number queued async
requests, number of queued sync requests, number of async requests
being processed by the driver, number of sync requests being processed
by the driver.
"""
if queue_is_mq(queue):
return mq_queue_request_stats(queue)
return sq_requests_queued(queue) + sq_requests_in_flight(queue) # type: ignore