Blob Blame History Raw
From: jbeulich@novell.com
Subject: blktap2: replace hard-coded limit of tap devices with configurable one
Patch-mainline: n/a

--- head.orig/drivers/xen/Kconfig	2012-02-17 14:38:40.000000000 +0100
+++ head/drivers/xen/Kconfig	2012-02-10 13:31:58.000000000 +0100
@@ -88,6 +88,17 @@ config XEN_BLKDEV_TAP2_NEW
 
 endchoice
 
+config XEN_NR_TAP2_DEVICES
+	int "Number of devices the version 2 tap backend driver can handle"
+	range 2 1048575
+	default 1024 if 64BIT
+	default 256
+	depends on XEN_BLKDEV_TAP2
+	help
+	  This sets the number of backend devices the v2 tap backend driver
+	  will be able to handle simultaneously. Note that device 0 is the
+	  control device and hence not available to service guests.
+
 config XEN_BLKBACK_PAGEMAP
 	tristate
 	depends on XEN_BLKDEV_BACKEND != n && XEN_BLKDEV_TAP2 != n
--- head.orig/drivers/xen/blktap2/blktap.h	2012-06-08 10:40:54.000000000 +0200
+++ head/drivers/xen/blktap2/blktap.h	2012-06-08 10:42:29.000000000 +0200
@@ -29,8 +29,6 @@ extern int blktap_debug_level;
 
 #define BLKTAP2_DEV_DIR "xen/blktap-2/"
 
-#define MAX_BLKTAP_DEVICE            256
-
 #define BLKTAP_CONTROL               1
 #define BLKTAP_RING_FD               2
 #define BLKTAP_RING_VMA              3
@@ -189,7 +187,7 @@ struct blktap {
 	struct blktap_statistics       stats;
 };
 
-extern struct blktap *blktaps[MAX_BLKTAP_DEVICE];
+extern struct blktap *blktaps[];
 
 static inline int
 blktap_active(struct blktap *tap)
--- head.orig/drivers/xen/blktap2/control.c	2012-05-23 13:39:18.000000000 +0200
+++ head/drivers/xen/blktap2/control.c	2011-02-24 16:02:57.000000000 +0100
@@ -4,7 +4,7 @@
 #include "blktap.h"
 
 static DEFINE_SPINLOCK(blktap_control_lock);
-struct blktap *blktaps[MAX_BLKTAP_DEVICE];
+struct blktap *blktaps[CONFIG_XEN_NR_TAP2_DEVICES];
 
 static int ring_major;
 static int device_major;
@@ -38,11 +38,11 @@ blktap_control_create_tap(void)
 	blktap_control_initialize_tap(tap);
 
 	spin_lock_irq(&blktap_control_lock);
-	for (minor = 0; minor < MAX_BLKTAP_DEVICE; minor++)
+	for (minor = 0; minor < CONFIG_XEN_NR_TAP2_DEVICES; minor++)
 		if (!blktaps[minor])
 			break;
 
-	if (minor == MAX_BLKTAP_DEVICE) {
+	if (minor == CONFIG_XEN_NR_TAP2_DEVICES) {
 		kfree(tap);
 		tap = NULL;
 		goto out;
@@ -70,7 +70,7 @@ blktap_control_allocate_tap(void)
 
 	spin_lock_irq(&blktap_control_lock);
 
-	for (minor = 0; minor < MAX_BLKTAP_DEVICE; minor++) {
+	for (minor = 0; minor < CONFIG_XEN_NR_TAP2_DEVICES; minor++) {
 		tap = blktaps[minor];
 		if (!tap)
 			goto found;
@@ -135,7 +135,7 @@ blktap_control_ioctl(struct file *filp, 
 	case BLKTAP2_IOCTL_FREE_TAP:
 		dev = arg;
 
-		if (dev >= MAX_BLKTAP_DEVICE || !blktaps[dev])
+		if (dev >= CONFIG_XEN_NR_TAP2_DEVICES || !blktaps[dev])
 			return -EINVAL;
 
 		blktap_control_destroy_device(blktaps[dev]);
@@ -229,7 +229,7 @@ blktap_control_free(void)
 {
 	int i;
 
-	for (i = 0; i < MAX_BLKTAP_DEVICE; i++)
+	for (i = 0; i < CONFIG_XEN_NR_TAP2_DEVICES; i++)
 		blktap_control_destroy_device(blktaps[i]);
 
 	if (blktap_control_registered)
--- head.orig/drivers/xen/blktap2/ring.c	2011-02-01 15:04:27.000000000 +0100
+++ head/drivers/xen/blktap2/ring.c	2011-11-21 15:55:31.000000000 +0100
@@ -212,7 +212,7 @@ blktap_ring_open(struct inode *inode, st
 	struct blktap *tap;
 
 	idx = iminor(inode);
-	if (idx < 0 || idx >= MAX_BLKTAP_DEVICE || blktaps[idx] == NULL) {
+	if (idx < 0 || idx >= CONFIG_XEN_NR_TAP2_DEVICES || !blktaps[idx]) {
 		BTERR("unable to open device blktap%d\n", idx);
 		return -ENODEV;
 	}
@@ -587,7 +587,8 @@ blktap_ring_init(int *major)
 {
 	int err;
 
-	err = register_chrdev(0, "blktap2", &blktap_ring_file_operations);
+	err = __register_chrdev(0, 0, CONFIG_XEN_NR_TAP2_DEVICES, "blktap2",
+				&blktap_ring_file_operations);
 	if (err < 0) {
 		BTERR("error registering blktap ring device: %d\n", err);
 		return err;
@@ -602,7 +603,8 @@ int
 blktap_ring_free(void)
 {
 	if (blktap_ring_major)
-		unregister_chrdev(blktap_ring_major, "blktap2");
+		__unregister_chrdev(blktap_ring_major, 0,
+				    CONFIG_XEN_NR_TAP2_DEVICES, "blktap2");
 
 	return 0;
 }
--- head.orig/drivers/xen/blktap2/sysfs.c	2012-02-17 11:29:32.000000000 +0100
+++ head/drivers/xen/blktap2/sysfs.c	2011-11-21 15:55:33.000000000 +0100
@@ -409,7 +409,7 @@ blktap_sysfs_show_devices(struct class *
 	struct blktap *tap;
 
 	ret = 0;
-	for (i = 0; i < MAX_BLKTAP_DEVICE; i++) {
+	for (i = 0; i < CONFIG_XEN_NR_TAP2_DEVICES; i++) {
 		tap = blktaps[i];
 		if (!tap)
 			continue;
--- head.orig/drivers/xen/blktap2-new/blktap.h	2012-06-08 10:40:25.000000000 +0200
+++ head/drivers/xen/blktap2-new/blktap.h	2012-06-08 10:42:33.000000000 +0200
@@ -28,8 +28,6 @@ extern int blktap_device_major;
 
 #define BLKTAP2_DEV_DIR "xen/blktap-2/"
 
-#define MAX_BLKTAP_DEVICE            1024
-
 #define BLKTAP_DEVICE                4
 #define BLKTAP_DEVICE_CLOSED         5
 #define BLKTAP_SHUTDOWN_REQUESTED    8
--- head.orig/drivers/xen/blktap2-new/control.c	2012-05-23 13:39:23.000000000 +0200
+++ head/drivers/xen/blktap2-new/control.c	2011-02-24 16:01:53.000000000 +0100
@@ -28,14 +28,14 @@ blktap_control_get_minor(void)
 		if (!blktaps[minor])
 			break;
 
-	if (minor == MAX_BLKTAP_DEVICE)
+	if (minor == CONFIG_XEN_NR_TAP2_DEVICES)
 		goto fail;
 
 	if (minor == blktap_max_minor) {
 		void *p;
 		int n;
 
-		n = min(2 * blktap_max_minor, MAX_BLKTAP_DEVICE);
+		n = min(2 * blktap_max_minor, CONFIG_XEN_NR_TAP2_DEVICES);
 		p = krealloc(blktaps, n * sizeof(blktaps[0]), GFP_KERNEL);
 		if (!p)
 			goto fail;
@@ -149,7 +149,7 @@ blktap_control_ioctl(struct file *filp, 
 	case BLKTAP2_IOCTL_FREE_TAP: {
 		int minor = arg;
 
-		if (minor > MAX_BLKTAP_DEVICE)
+		if (minor > CONFIG_XEN_NR_TAP2_DEVICES)
 			return -EINVAL;
 
 		tap = blktaps[minor];
@@ -230,7 +230,7 @@ blktap_control_init(void)
 
 	control_device = blktap_control.this_device;
 
-	blktap_max_minor = min(64, MAX_BLKTAP_DEVICE);
+	blktap_max_minor = min(64, CONFIG_XEN_NR_TAP2_DEVICES);
 	blktaps = kzalloc(blktap_max_minor * sizeof(blktaps[0]), GFP_KERNEL);
 	if (!blktaps) {
 		BTERR("failed to allocate blktap minor map");
--- head.orig/drivers/xen/blktap2-new/ring.c	2011-02-24 15:39:28.000000000 +0100
+++ head/drivers/xen/blktap2-new/ring.c	2011-04-11 15:10:17.000000000 +0200
@@ -521,7 +521,7 @@ blktap_ring_init(void)
 {
 	int err;
 
-	err = __register_chrdev(0, 0, MAX_BLKTAP_DEVICE, "blktap2",
+	err = __register_chrdev(0, 0, CONFIG_XEN_NR_TAP2_DEVICES, "blktap2",
 				&blktap_ring_file_operations);
 	if (err < 0) {
 		BTERR("error registering ring devices: %d\n", err);
@@ -540,7 +540,7 @@ blktap_ring_exit(void)
 	if (!blktap_ring_major)
 		return;
 
-	__unregister_chrdev(blktap_ring_major, 0, MAX_BLKTAP_DEVICE,
+	__unregister_chrdev(blktap_ring_major, 0, CONFIG_XEN_NR_TAP2_DEVICES,
 			    "blktap2");
 
 	blktap_ring_major = 0;