Commit a47c7bef authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen
Browse files

scsi: core: Make the budget map optional



Prepare for not allocating a budget map for pseudo SCSI devices by
checking whether a budget map has been allocated before using it.

Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Ming Lei <ming.lei@redhat.com>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Link: https://patch.msgid.link/20251031204029.2883185-4-bvanassche@acm.org


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 21008cab
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -216,6 +216,9 @@ int scsi_device_max_queue_depth(struct scsi_device *sdev)
 */
int scsi_change_queue_depth(struct scsi_device *sdev, int depth)
{
	if (!sdev->budget_map.map)
		return -EINVAL;

	depth = min_t(int, depth, scsi_device_max_queue_depth(sdev));

	if (depth > 0) {
@@ -255,6 +258,8 @@ EXPORT_SYMBOL(scsi_change_queue_depth);
 */
int scsi_track_queue_full(struct scsi_device *sdev, int depth)
{
	if (!sdev->budget_map.map)
		return 0;

	/*
	 * Don't let QUEUE_FULLs on the same
+3 −0
Original line number Diff line number Diff line
@@ -749,6 +749,9 @@ static void scsi_handle_queue_ramp_up(struct scsi_device *sdev)
	const struct scsi_host_template *sht = sdev->host->hostt;
	struct scsi_device *tmp_sdev;

	if (!sdev->budget_map.map)
		return;

	if (!sht->track_queue_depth ||
	    sdev->queue_depth >= sdev->max_queue_depth)
		return;
+7 −2
Original line number Diff line number Diff line
@@ -396,6 +396,7 @@ void scsi_device_unbusy(struct scsi_device *sdev, struct scsi_cmnd *cmd)
	if (starget->can_queue > 0)
		atomic_dec(&starget->target_busy);

	if (sdev->budget_map.map)
		sbitmap_put(&sdev->budget_map, cmd->budget_token);
	cmd->budget_token = -1;
}
@@ -1360,6 +1361,9 @@ static inline int scsi_dev_queue_ready(struct request_queue *q,
{
	int token;

	if (!sdev->budget_map.map)
		return INT_MAX;

	token = sbitmap_get(&sdev->budget_map);
	if (token < 0)
		return -1;
@@ -1749,6 +1753,7 @@ static void scsi_mq_put_budget(struct request_queue *q, int budget_token)
{
	struct scsi_device *sdev = q->queuedata;

	if (sdev->budget_map.map)
		sbitmap_put(&sdev->budget_map, budget_token);
}