drivers/hv/mshv_portid_table.c

Source file repositories/reference/linux-study-clean/drivers/hv/mshv_portid_table.c

File Facts

System
Linux kernel
Corpus path
drivers/hv/mshv_portid_table.c
Extension
.c
Size
1596 bytes
Lines
84
Domain
Driver Families
Bucket
drivers/hv
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

idr_for_each_entry_ul(&port_table_idr, port_info, tmp, i) {
			port_info = idr_remove(&port_table_idr, i);
			kfree_rcu(port_info, portbl_rcu);
		}
	}
	idr_unlock(&port_table_idr);
}

int
mshv_portid_alloc(struct port_table_info *info)
{
	int ret = 0;

	idr_lock(&port_table_idr);
	ret = idr_alloc(&port_table_idr, info, PORTID_MIN,
			PORTID_MAX, GFP_KERNEL);
	idr_unlock(&port_table_idr);

	return ret;
}

void
mshv_portid_free(int port_id)
{
	struct port_table_info *info;

	idr_lock(&port_table_idr);
	info = idr_remove(&port_table_idr, port_id);
	WARN_ON(!info);
	idr_unlock(&port_table_idr);

	synchronize_rcu();
	kfree(info);
}

int
mshv_portid_lookup(int port_id, struct port_table_info *info)
{
	struct port_table_info *_info;
	int ret = -ENOENT;

	rcu_read_lock();
	_info = idr_find(&port_table_idr, port_id);
	rcu_read_unlock();

	if (_info) {
		*info = *_info;
		ret = 0;
	}

	return ret;
}

Annotation

Implementation Notes