net/iucv/iucv.c

Source file repositories/reference/linux-study-clean/net/iucv/iucv.c

File Facts

System
Linux kernel
Corpus path
net/iucv/iucv.c
Extension
.c
Size
50521 bytes
Lines
1951
Domain
Networking Core
Bucket
Sockets, Protocols, Packet Path, And Network Policy
Inferred role
Networking Core: operation-table or driver-model contract
Status
pattern implementation candidate

Why This File Exists

Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.

Dependency Surface

Detected Declarations

Annotated Snippet

static int iucv_bus_match(struct device *dev, const struct device_driver *drv)
{
	return 0;
}

const struct bus_type iucv_bus = {
	.name = "iucv",
	.match = iucv_bus_match,
};
EXPORT_SYMBOL(iucv_bus);

static struct device *iucv_root;

static void iucv_release_device(struct device *device)
{
	kfree(device);
}

struct device *iucv_alloc_device(const struct attribute_group **attrs,
				 struct device_driver *driver,
				 void *priv, const char *fmt, ...)
{
	struct device *dev;
	va_list vargs;
	char buf[20];
	int rc;

	dev = kzalloc_obj(*dev);
	if (!dev)
		goto out_error;
	va_start(vargs, fmt);
	vscnprintf(buf, sizeof(buf), fmt, vargs);
	rc = dev_set_name(dev, "%s", buf);
	va_end(vargs);
	if (rc)
		goto out_error;
	dev->bus = &iucv_bus;
	dev->parent = iucv_root;
	dev->driver = driver;
	dev->groups = attrs;
	dev->release = iucv_release_device;
	dev_set_drvdata(dev, priv);
	return dev;

out_error:
	kfree(dev);
	return NULL;
}
EXPORT_SYMBOL(iucv_alloc_device);

static int iucv_available;

/* General IUCV interrupt structure */
struct iucv_irq_data {
	u16 ippathid;
	u8  ipflags1;
	u8  iptype;
	u32 res2[9];
};

struct iucv_irq_list {
	struct list_head list;
	struct iucv_irq_data data;
};

static struct iucv_irq_data *iucv_irq_data[NR_CPUS];
static cpumask_t iucv_buffer_cpumask = { CPU_BITS_NONE };
static cpumask_t iucv_irq_cpumask = { CPU_BITS_NONE };

/*
 * Queue of interrupt buffers lock for delivery via the tasklet
 * (fast but can't call smp_call_function).
 */
static LIST_HEAD(iucv_task_queue);

/*
 * The tasklet for fast delivery of iucv interrupts.
 */
static void iucv_tasklet_fn(unsigned long);
static DECLARE_TASKLET_OLD(iucv_tasklet, iucv_tasklet_fn);

/*
 * Queue of interrupt buffers for delivery via a work queue
 * (slower but can call smp_call_function).
 */
static LIST_HEAD(iucv_work_queue);

/*
 * The work element to deliver path pending interrupts.
 */

Annotation

Implementation Notes