RE: Issue with limitation of 256 minors per major in LiS 2.16 on Linu x 2.4

"Eashwaran, P" <[email protected]>
Newsgroups gmane.linux.kernel.streams
Message-ID <[email protected]>
Dave,

 

Thanks for your quick response.  I do have one and only one clone node in
the dev directory.  Let say, that with this strategy I get major=220
(clone_drver) and minor=248 for my /dev node.   Assume that all 256 minors
(0 to 255) have already been taken by previous opens and that now I'm going
to be opening the node for the 257th time.  This time I will be using 256 as
the minor number to pass to makedevice.  If I were to not limit myself to an
8-bit minor and decided to and return the devp as as "*devp = makedevice(
getmajor(*devp),  256 );"  then won't I be bumping into another major
device's range?  I'm a bit confused there.

 

I went back and checked the LiS documentation and, sure enough, it says
exactly what you have said in your reply, that LiS internally uses a 12/20
format and using the LiS <sys/stream.h> major/minor manipulation routine
will guarantee this view
(http://www.gcom.com/home/linux/lis/dki.html#majorminordev_t
<http://www.gcom.com/home/linux/lis/dki.html#majorminordev_t> ).  That means
I can have 0xFFFFF (a million) minor devices with one LiS major! 

 

Now, I'm using LiS 2.16 on Linux 2.4 kernel.  Are you sure that this 12/20
major/minor view applies to LiS 2.16 over Linux 2.4 kernel too?

 

Also, the last paragraph of the section referred to by the above HTTP link
talks about creation of device node using lis_mknod during driver
initialization time and it talks about using UMKDEV(major,minor) for this
purpose.  I did not find the definition of UMKDEV anywhere in /usr/src/LiS
of the LiS 2.16.18 distribution that I'm using.   However, my driver does
use lis_mknod as shown below to create the device node:

 

  /* major_num was obtained as a return value from lis_register_strdev 

   * when called with 0 as the first argument */

  status = lis_mknod (node_name, 0666 | S_IFCHR,
makedevice(lis_clone_major(), major_num));

 

I hope this is the right way to create the device node even though I intend
to use this clone node for cloning thousands of devices using the LiS 12/20
major/minor representation.

 

Thanks again for your answers.

 

Regards,

Eashwaran.

 

  _____  

From: Dave Grothe [mailto:[email protected]] 
Sent: Wednesday, October 06, 2004 3:02 PM
To: Eashwaran, P; '[email protected]'
Subject: Re: [Linux-streams] Issue with limitation of 256 minors per major
in LiS 2.16 on Linu x 2.4

 

LiS has the status of a file system in the Linux kernel.  That means that it
can define its own interpretation for dev_t structures.  Since LiS-2.17 it
has maintained an internal dev_t with 12 bits of major and 20 bits of minor.

If you are operating clone devices then the external 8/8 restrictiveness is
not something that you have to be concerned about.  With clone devices you
only need one node in /dev for your clone device, and this can fit into the
8/8 representation of the ext2 file system.  Internally in your driver's
open routine you can just compute a 20 bit minor device number and return
it.

If you need thousands of visible device nodes in /dev then you still need to
use the multiple-major trick because the external ext2 file system is still
8/8.

-- Dave

At 01:25 PM 10/6/2004, Eashwaran, P wrote:



I tried to check if this issue has been addressed in previous archives, but
clicking on http://gsyc.escet.urjc.es/mailarchive/linux-streams
<http://gsyc.escet.urjc.es/mailarchive/linux-streams>  gives me a
"Forbidden" error page!    So, here it is again!  Please feel free to
forward me links of older archives if this issue has been previously
discussed in this forum.
 
Linux 2.4 allows only 256 minors per major.  This is a severe restriction
for us.  Our driver ports on other OSes allow for 1000+ devices.  With the
current major/minor allocation scheme on Linux 2.4 we are now limited to
only 256 devices. 
  
Our user applications know only to open one device file which has major of
the LiS clone_drvr and minor as the actual STREAMS device's major number.  

In other discussions of this topic, I have seen suggestions where the user
application opens different device names. 
All our applications work with one device file, so we cannot have multiple
device files with differing major numbers each supporting 256 devices. 
  
Currently, the driver uses dynamic allocation with lis_register_strdev (with
0 arg) to obtain they major number dynamically.  Reading a few links on the
web related to this (like
http://www.mail-archive.com/[email protected]/msg00269.html
<http://www.mail-archive.com/[email protected]/msg00269.html>
) I've found that one can call the lis_register_strdev multiple times to get
multiple major numbers. 
  
I can do that in my driver and have an array of 4 major numbers each capable
of 256 minor numbers.  My question is: when I return from device_open
routine, if I change the major number of the device to another major number
(allocated for the same driver) will it work?   
  
Lets say that I've majors 248, 250, 247, 253 in that order in my array of 4
allocated major numbers for my driver, because I called lis_register_strdev
4 times.  Also, lets say that I'm able to lookup an internal array of 1024
minor devices and am able to determine which one is free to use.  Having
said that, if I modify the *devp parameter in the device_open by changing
the major number AND minor number and returning from the routine, will that
work?  Note that the major/minor pair is still going to map to one of the
major numbers that I've allocated dynamically. 

Even if the above strategy is alright, do you think it will still work even
if my driver uses locks.  Currently I use 2 lis_rw_lock_t and 1
lis_spin_lock_t structures to safeguard common data and critical sections.

The only disadvantage is that there are a limited number of major numbers
available.  Linux 2.6 is supposedly going to address this shortage by
increasing the number of minors per major and also increasing the number of
majors in the system. 
  
Any help is appreciated.
 
Thanks & Regards,
Eashwaran.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.