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;