Source code for crash.subsystem.storage.blocksq
# -*- coding: utf-8 -*-
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:
from typing import Iterable, Tuple
import gdb
from crash.util import struct_has_member
from crash.util.symbols import Types
from crash.types.list import list_for_each_entry
from crash.subsystem.storage import queue_is_mq
from crash.exceptions import InvalidArgumentError
[docs]
class NoQueueError(RuntimeError):
pass
types = Types(['struct request'])
def _check_queue_type(queue: gdb.Value) -> None:
if queue_is_mq(queue):
raise InvalidArgumentError("Passed request queue is a multiqueue queue")
[docs]
def sq_for_each_request_in_queue(queue: gdb.Value) -> Iterable[gdb.Value]:
"""
Iterates over each ``struct request`` in request_queue
This method iterates over the ``request_queue``'s queuelist and
returns a request for each member.
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``'s queuelist. The value is of type ``struct request``.
"""
if int(queue) == 0:
raise NoQueueError("Queue is NULL")
_check_queue_type(queue)
return list_for_each_entry(queue['queue_head'], types.request_type,
'queuelist')
[docs]
def sq_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.
"""
_check_queue_type(queue)
return (int(queue['in_flight'][0]),
int(queue['in_flight'][1]))
[docs]
def sq_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 queued requests.
The value must be of type ``struct request_queue``.
Returns:
(:obj:`int`, :obj:`int`): The queued requests. The first member of
the 2-tuple is the number of async requests, the second is the number
of sync requests.
"""
_check_queue_type(queue)
if struct_has_member(queue, 'rq'):
rqlist = queue['rq']
else:
rqlist = queue['root_rl']
return (int(rqlist['count'][0]),
int(rqlist['count'][1]))