linux-rt-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* One Interrupted Threads per Interrupt line?
@ 2011-06-04 11:48 Monica Puig-Pey
  2011-06-04 12:03 ` I/O operations priority in RTOS Monica Puig-Pey
  0 siblings, 1 reply; 28+ messages in thread
From: Monica Puig-Pey @ 2011-06-04 11:48 UTC (permalink / raw)
  To: linux-rt-users, linux-kernel

Hi,

I'm using Ubuntu 10.04 with the 2.6.31-11-rt patch installed. I'm 
developing a PCI device driver using hardware interrupts.
I read in the “Internals of the RT Patch” document 
(http://www.kernel.org/doc/ols/2007/ols2007v2-pages-161-172.pdf ) that 
when a device driver requests an IRQ, a thread is created to service 
this interrupt line (Threaded interrupts). Only ONE thread can be 
created per interrupt line, so shared interrupts are still handled by a 
single thread.

My driver requests IRQ 16, which is shared with others handlers. Typing 
on the shell  $ps -eo pid,pri,rtprio,cmd I can see my driver requesting 
irq 16 and with 50 RTPRIO. At the same time I can see the others drivers 
requesting IRQ 16 with different real time priorities than mine( 80, 85, 
50). Does this mean that there are more than ONE Threaded Interrupts for 
IRQ 16? or it's just the thread priority when running each handler for 
IRQ 16?
Finally, how could I change the 50 RT PRIO for my handler pci_9111?

Here you have the shell:

   PID PRI RTPRIO CMD

   658 120     80 [irq/16-uhci_hcd]
  3852 125     85 [irq/16-HDA Inte]
  4303  90     50 [irq/16-radeon@p]
  5863  90     50 [irq/16-pci_9111]
  5865  19      - ps -eo pid,pri,rtprio,cmd


Thank you very much,

Mónica
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* I/O operations priority in RTOS
  2011-06-04 11:48 One Interrupted Threads per Interrupt line? Monica Puig-Pey
@ 2011-06-04 12:03 ` Monica Puig-Pey
  2011-06-04 12:30   ` kernel threads in drivers using the RT patch Monica Puig-Pey
  2011-06-04 23:42   ` I/O operations priority in RTOS Nicholas Mc Guire
  0 siblings, 2 replies; 28+ messages in thread
From: Monica Puig-Pey @ 2011-06-04 12:03 UTC (permalink / raw)
  To: linux-rt-users, linux-kernel

Hello,
I'm studying how to develop drivers in a real time OS and how do they 
work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
I would like to know the priority when executing open(), read(), write() 
and close() operations.
In my example the thread which is using the driver runs with 10 RTPRIO, 
but I don't know what happens in kernel context with the priority when 
running the I/O operations.
Thank you for your help, I don't know where to learn about this.

Mónica
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* kernel threads in drivers using the RT patch
  2011-06-04 12:03 ` I/O operations priority in RTOS Monica Puig-Pey
@ 2011-06-04 12:30   ` Monica Puig-Pey
  2011-06-06 11:47     ` Changing Kernel thread priorities Monica Puig-Pey
  2011-06-04 23:42   ` I/O operations priority in RTOS Nicholas Mc Guire
  1 sibling, 1 reply; 28+ messages in thread
From: Monica Puig-Pey @ 2011-06-04 12:30 UTC (permalink / raw)
  To: linux-rt-users, linux-kernel

Hello,

I'm studying how to develop drivers in a real time OS and how do they 
work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
I'm trying to run a kernel thread from my driver (kernel context). I 
create the kthread in the module_init, I change its real time priority 
and then make it run .
Code shown below:

thread_handler=*(struct task_struct *)kthread_create(my_tasklet_handler, 
(void*)&datos,"thread_handler");
   if (IS_ERR(&thread_handler)){
      return PTR_ERR(&thread_handler);
      printk(KERN_WARNING "<pci> (init_module)  Error creating Thread 
handler\n");
   }
params->sched_priority=20;
result = sched_setscheduler(&thread_handler, SCHED_FIFO, params);
result=wake_up_process(&thread_handler);

Params is global struct sched_param * and struct thread_handler  a 
global task_struct.

I stop the Kthread in the module_exit using 
res=kthread_stop(&thread_handler);

The kthread "thread_handler" has a while (1) loop and it is stopped in a 
semaphore, waiting for the interrupt handler. When it wakes up each time 
it calls kthread_should_stop() and depending on that break out of the 
loop or run.

My problem is, when trying to establish the rtprio kthread, the whole 
computer get blocked and I only can restart it. If I delete this part, 
then kthread runs, and works well. With the ps command I can see it has 
a 24 NON real time priority. Then the problem come when uninstalling my 
module with rmmod. In the  kthread_stop function, everything gets blocked.

Could someone tell what am I doing wrong? Or just give me some help 
about kernel threads in the RT Patch?

Thanks a lot

Mónica
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-04 12:03 ` I/O operations priority in RTOS Monica Puig-Pey
  2011-06-04 12:30   ` kernel threads in drivers using the RT patch Monica Puig-Pey
@ 2011-06-04 23:42   ` Nicholas Mc Guire
  2011-06-05  8:46     ` Armin Steinhoff
  1 sibling, 1 reply; 28+ messages in thread
From: Nicholas Mc Guire @ 2011-06-04 23:42 UTC (permalink / raw)
  To: Monica Puig-Pey; +Cc: linux-rt-users

On Sat, 04 Jun 2011, Monica Puig-Pey wrote:

> Hello,
> I'm studying how to develop drivers in a real time OS and how do they  
> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
> I would like to know the priority when executing open(), read(), write()  
> and close() operations.
> In my example the thread which is using the driver runs with 10 RTPRIO,  
> but I don't know what happens in kernel context with the priority when  
> running the I/O operations.
> Thank you for your help, I don't know where to learn about this.
>

Priorities are not associated with functions but rather with processes/threads
so the priority with which the functions open/read/write are executed depend
on the process that invokes these functions.

That said there is an indirect impact of the function on priority as soon as
the funciton needs to share any resources that need protection by locking. The
moment that happens the effective execution priority of the function no longer only depends on the task that calls open but may indirectly depedn on a totally
unrelated task that happens to hold a lock protecting some shared resource.

So the consequence for rt-drivers is that they must ensure that they minimize
critical sections, or prevent them all together (i.e. by using lock free 
methods). Notably this puts restrictions on the use of dynamic resources at 
runtime, that is after the driver was initialized - basically you want all 
resources that the rt-driver needs allocated at driver initialization time. 
Also when using bottom half mechanisms you need to take into account the 
priority of the kernel thread that manages the defered work items, so 
rt-drivers may have a different structure than normal drivers.

hofrat

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-04 23:42   ` I/O operations priority in RTOS Nicholas Mc Guire
@ 2011-06-05  8:46     ` Armin Steinhoff
  2011-06-05  9:25       ` Jan Kiszka
  2011-06-05  9:28       ` Nicholas Mc Guire
  0 siblings, 2 replies; 28+ messages in thread
From: Armin Steinhoff @ 2011-06-05  8:46 UTC (permalink / raw)
  To: Nicholas Mc Guire; +Cc: Monica Puig-Pey, linux-rt-users

Nicholas Mc Guire wrote:
> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
>
>> Hello,
>> I'm studying how to develop drivers in a real time OS and how do they
>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
>> I would like to know the priority when executing open(), read(), write()
>> and close() operations.
>> In my example the thread which is using the driver runs with 10 RTPRIO,
>> but I don't know what happens in kernel context with the priority when
>> running the I/O operations.
>> Thank you for your help, I don't know where to learn about this.
>>
> []
> Also when using bottom half mechanisms you need to take into account the
> priority of the kernel thread that manages the defered work items, so
> rt-drivers may have a different structure than normal drivers.

That's the reason why I prefer UIO based user space drivers !

--Armin

> hofrat
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-05  8:46     ` Armin Steinhoff
@ 2011-06-05  9:25       ` Jan Kiszka
  2011-06-05 22:39         ` Armin Steinhoff
  2011-06-05  9:28       ` Nicholas Mc Guire
  1 sibling, 1 reply; 28+ messages in thread
From: Jan Kiszka @ 2011-06-05  9:25 UTC (permalink / raw)
  To: Armin Steinhoff; +Cc: Nicholas Mc Guire, Monica Puig-Pey, linux-rt-users

[-- Attachment #1: Type: text/plain, Size: 1320 bytes --]

On 2011-06-05 10:46, Armin Steinhoff wrote:
> Nicholas Mc Guire wrote:
>> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
>>
>>> Hello,
>>> I'm studying how to develop drivers in a real time OS and how do they
>>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
>>> I would like to know the priority when executing open(), read(), write()
>>> and close() operations.
>>> In my example the thread which is using the driver runs with 10 RTPRIO,
>>> but I don't know what happens in kernel context with the priority when
>>> running the I/O operations.
>>> Thank you for your help, I don't know where to learn about this.
>>>
>> []
>> Also when using bottom half mechanisms you need to take into account the
>> priority of the kernel thread that manages the defered work items, so
>> rt-drivers may have a different structure than normal drivers.
> 
> That's the reason why I prefer UIO based user space drivers !

...which are forced to use threaded IRQs over -rt as well.

Taking threaded IRQs out of the picture, bottom-half mechanisms usually
come into play when dispatch workload that cannot be assigned to a
specific user context is significant. But then UIO is the wrong approach
anyway as it doesn't match well the requirements of multi-user device
interfaces.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-05  8:46     ` Armin Steinhoff
  2011-06-05  9:25       ` Jan Kiszka
@ 2011-06-05  9:28       ` Nicholas Mc Guire
  2011-06-05  9:44         ` Jan Kiszka
  2011-06-05 22:32         ` Armin Steinhoff
  1 sibling, 2 replies; 28+ messages in thread
From: Nicholas Mc Guire @ 2011-06-05  9:28 UTC (permalink / raw)
  To: Armin Steinhoff; +Cc: Monica Puig-Pey, linux-rt-users

On Sun, 05 Jun 2011, Armin Steinhoff wrote:

> Nicholas Mc Guire wrote:
>> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
>>
>>> Hello,
>>> I'm studying how to develop drivers in a real time OS and how do they
>>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
>>> I would like to know the priority when executing open(), read(), write()
>>> and close() operations.
>>> In my example the thread which is using the driver runs with 10 RTPRIO,
>>> but I don't know what happens in kernel context with the priority when
>>> running the I/O operations.
>>> Thank you for your help, I don't know where to learn about this.
>>>
>> []
>> Also when using bottom half mechanisms you need to take into account the
>> priority of the kernel thread that manages the defered work items, so
>> rt-drivers may have a different structure than normal drivers.
>
> That's the reason why I prefer UIO based user space drivers !
>
...and how to resolve DMA ? if DMA were resolved cleanly I would agree.

hofrat

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-05  9:28       ` Nicholas Mc Guire
@ 2011-06-05  9:44         ` Jan Kiszka
  2011-06-05 22:29           ` Nicholas Mc Guire
  2011-06-06  7:41           ` Armin Steinhoff
  2011-06-05 22:32         ` Armin Steinhoff
  1 sibling, 2 replies; 28+ messages in thread
From: Jan Kiszka @ 2011-06-05  9:44 UTC (permalink / raw)
  To: Nicholas Mc Guire; +Cc: Armin Steinhoff, Monica Puig-Pey, linux-rt-users

[-- Attachment #1: Type: text/plain, Size: 1526 bytes --]

On 2011-06-05 11:28, Nicholas Mc Guire wrote:
> On Sun, 05 Jun 2011, Armin Steinhoff wrote:
> 
>> Nicholas Mc Guire wrote:
>>> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
>>>
>>>> Hello,
>>>> I'm studying how to develop drivers in a real time OS and how do they
>>>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
>>>> I would like to know the priority when executing open(), read(), write()
>>>> and close() operations.
>>>> In my example the thread which is using the driver runs with 10 RTPRIO,
>>>> but I don't know what happens in kernel context with the priority when
>>>> running the I/O operations.
>>>> Thank you for your help, I don't know where to learn about this.
>>>>
>>> []
>>> Also when using bottom half mechanisms you need to take into account the
>>> priority of the kernel thread that manages the defered work items, so
>>> rt-drivers may have a different structure than normal drivers.
>>
>> That's the reason why I prefer UIO based user space drivers !
>>
> ...and how to resolve DMA ? if DMA were resolved cleanly I would agree.

Regarding that limitation, there is some hope: "next-generation" UIO is
called VFIO. Useful for exclusively assigning virtual PCI functions of
network adapters etc. to user space stacks or hypervisors like QEMU/KVM
(for device pass-through). But it's not mainline yet. And it obviously
requires an IOMMU.

But the key point remains: "exclusively". Anything else cannot be
modeled efficiently via UIO or VFIO.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-05  9:44         ` Jan Kiszka
@ 2011-06-05 22:29           ` Nicholas Mc Guire
  2011-06-05 23:00             ` Jan Kiszka
  2011-06-06  7:41           ` Armin Steinhoff
  1 sibling, 1 reply; 28+ messages in thread
From: Nicholas Mc Guire @ 2011-06-05 22:29 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Armin Steinhoff, Monica Puig-Pey, linux-rt-users

On Sun, 05 Jun 2011, Jan Kiszka wrote:

> On 2011-06-05 11:28, Nicholas Mc Guire wrote:
> > On Sun, 05 Jun 2011, Armin Steinhoff wrote:
> > 
> >> Nicholas Mc Guire wrote:
> >>> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
> >>>
> >>>> Hello,
> >>>> I'm studying how to develop drivers in a real time OS and how do they
> >>>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
> >>>> I would like to know the priority when executing open(), read(), write()
> >>>> and close() operations.
> >>>> In my example the thread which is using the driver runs with 10 RTPRIO,
> >>>> but I don't know what happens in kernel context with the priority when
> >>>> running the I/O operations.
> >>>> Thank you for your help, I don't know where to learn about this.
> >>>>
> >>> []
> >>> Also when using bottom half mechanisms you need to take into account the
> >>> priority of the kernel thread that manages the defered work items, so
> >>> rt-drivers may have a different structure than normal drivers.
> >>
> >> That's the reason why I prefer UIO based user space drivers !
> >>
> > ...and how to resolve DMA ? if DMA were resolved cleanly I would agree.
> 
> Regarding that limitation, there is some hope: "next-generation" UIO is
> called VFIO. Useful for exclusively assigning virtual PCI functions of
> network adapters etc. to user space stacks or hypervisors like QEMU/KVM
> (for device pass-through). But it's not mainline yet. And it obviously
> requires an IOMMU.
> 
> But the key point remains: "exclusively". Anything else cannot be
> modeled efficiently via UIO or VFIO.
> 
for many RT apps that is an acceptable limit - in fact sometimes a requirement - having dynamic access and handling this at runtime is not necessarily an advantage for rt. Giving guarantees on timing for non-exclusive access in the general case would probably need to be based on a priority access model any way (i.e. running non-RT network traffic on a RT-link as "rt-idle" bandwidth usage - but full shared access at runtime would be very hard, if not impossible, to model at the device interface level without breaking RT properties. So I think its legitimate to keep it out of the device all together and let the user apps have a non-rt fight about access...

Any pointers to VFIO ?

hofrat


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-05  9:28       ` Nicholas Mc Guire
  2011-06-05  9:44         ` Jan Kiszka
@ 2011-06-05 22:32         ` Armin Steinhoff
  1 sibling, 0 replies; 28+ messages in thread
From: Armin Steinhoff @ 2011-06-05 22:32 UTC (permalink / raw)
  To: Nicholas Mc Guire; +Cc: Monica Puig-Pey, linux-rt-users

Nicholas Mc Guire wrote:
> On Sun, 05 Jun 2011, Armin Steinhoff wrote:
>
>> Nicholas Mc Guire wrote:
>>> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
>>>
>>>> Hello,
>>>> I'm studying how to develop drivers in a real time OS and how do they
>>>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
>>>> I would like to know the priority when executing open(), read(), write()
>>>> and close() operations.
>>>> In my example the thread which is using the driver runs with 10 RTPRIO,
>>>> but I don't know what happens in kernel context with the priority when
>>>> running the I/O operations.
>>>> Thank you for your help, I don't know where to learn about this.
>>>>
>>> []
>>> Also when using bottom half mechanisms you need to take into account the
>>> priority of the kernel thread that manages the defered work items, so
>>> rt-drivers may have a different structure than normal drivers.
>> That's the reason why I prefer UIO based user space drivers !
>>
> ...and how to resolve DMA ? if DMA were resolved cleanly I would agree.

https://opensource.qualcomm.com/wiki/UIO-DMA

I haven't tested until now  ... what do you think about it ?

--Armin


> hofrat
>


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-05  9:25       ` Jan Kiszka
@ 2011-06-05 22:39         ` Armin Steinhoff
  2011-06-05 23:09           ` Jan Kiszka
  0 siblings, 1 reply; 28+ messages in thread
From: Armin Steinhoff @ 2011-06-05 22:39 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Nicholas Mc Guire, Monica Puig-Pey, linux-rt-users

Jan Kiszka wrote:
> On 2011-06-05 10:46, Armin Steinhoff wrote:
>> Nicholas Mc Guire wrote:
>>> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
>>>
>>>> Hello,
>>>> I'm studying how to develop drivers in a real time OS and how do they
>>>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
>>>> I would like to know the priority when executing open(), read(), write()
>>>> and close() operations.
>>>> In my example the thread which is using the driver runs with 10 RTPRIO,
>>>> but I don't know what happens in kernel context with the priority when
>>>> running the I/O operations.
>>>> Thank you for your help, I don't know where to learn about this.
>>>>
>>> []
>>> Also when using bottom half mechanisms you need to take into account the
>>> priority of the kernel thread that manages the defered work items, so
>>> rt-drivers may have a different structure than normal drivers.
>> That's the reason why I prefer UIO based user space drivers !
> ...which are forced to use threaded IRQs over -rt as well.

What's wrong with that approach? You have an ISR in the kernel module 
and an interrupt thread at user space.
Seem OK for me since a long time with QNX :)
> Taking threaded IRQs out of the picture, bottom-half mechanisms usually
> come into play when dispatch workload that cannot be assigned to a
> specific user context is significant. But then UIO is the wrong approach
> anyway as it doesn't match well the requirements of multi-user device
> interfaces.
   Support of multi-user device interfaces at user space is just a 
design issue ... I use this concept since a long time with QNX :)

--Armin



> Jan
>


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-05 22:29           ` Nicholas Mc Guire
@ 2011-06-05 23:00             ` Jan Kiszka
  2011-06-06  0:21               ` Nicholas Mc Guire
  0 siblings, 1 reply; 28+ messages in thread
From: Jan Kiszka @ 2011-06-05 23:00 UTC (permalink / raw)
  To: Nicholas Mc Guire; +Cc: Armin Steinhoff, Monica Puig-Pey, linux-rt-users

[-- Attachment #1: Type: text/plain, Size: 2610 bytes --]

On 2011-06-06 00:29, Nicholas Mc Guire wrote:
> On Sun, 05 Jun 2011, Jan Kiszka wrote:
> 
>> On 2011-06-05 11:28, Nicholas Mc Guire wrote:
>>> On Sun, 05 Jun 2011, Armin Steinhoff wrote:
>>>
>>>> Nicholas Mc Guire wrote:
>>>>> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
>>>>>
>>>>>> Hello,
>>>>>> I'm studying how to develop drivers in a real time OS and how do they
>>>>>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
>>>>>> I would like to know the priority when executing open(), read(), write()
>>>>>> and close() operations.
>>>>>> In my example the thread which is using the driver runs with 10 RTPRIO,
>>>>>> but I don't know what happens in kernel context with the priority when
>>>>>> running the I/O operations.
>>>>>> Thank you for your help, I don't know where to learn about this.
>>>>>>
>>>>> []
>>>>> Also when using bottom half mechanisms you need to take into account the
>>>>> priority of the kernel thread that manages the defered work items, so
>>>>> rt-drivers may have a different structure than normal drivers.
>>>>
>>>> That's the reason why I prefer UIO based user space drivers !
>>>>
>>> ...and how to resolve DMA ? if DMA were resolved cleanly I would agree.
>>
>> Regarding that limitation, there is some hope: "next-generation" UIO is
>> called VFIO. Useful for exclusively assigning virtual PCI functions of
>> network adapters etc. to user space stacks or hypervisors like QEMU/KVM
>> (for device pass-through). But it's not mainline yet. And it obviously
>> requires an IOMMU.
>>
>> But the key point remains: "exclusively". Anything else cannot be
>> modeled efficiently via UIO or VFIO.
>>
> for many RT apps that is an acceptable limit - in fact sometimes a requirement - having dynamic access and handling this at runtime is not necessarily an advantage for rt. Giving guarantees on timing for non-exclusive access in the general case would probably need to be based on a priority access model any way (i.e. running non-RT network traffic on a RT-link as "rt-idle" bandwidth usage - but full shared access at runtime would be very hard, if not impossible, to model at the device interface level without breaking RT properties. So I think its legitimate to keep it out of the device all together and let the user apps have a non-rt fight about access...

There are good examples - in the RT domain - for both models. Sharing a
device does not necessarily mean making things dynamic or even
unpredictable.

> 
> Any pointers to VFIO ?

E.g. http://thread.gmane.org/gmane.linux.kernel.pci/10088

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-05 22:39         ` Armin Steinhoff
@ 2011-06-05 23:09           ` Jan Kiszka
  0 siblings, 0 replies; 28+ messages in thread
From: Jan Kiszka @ 2011-06-05 23:09 UTC (permalink / raw)
  To: Armin Steinhoff; +Cc: Nicholas Mc Guire, Monica Puig-Pey, linux-rt-users

[-- Attachment #1: Type: text/plain, Size: 2302 bytes --]

On 2011-06-06 00:39, Armin Steinhoff wrote:
> Jan Kiszka wrote:
>> On 2011-06-05 10:46, Armin Steinhoff wrote:
>>> Nicholas Mc Guire wrote:
>>>> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
>>>>
>>>>> Hello,
>>>>> I'm studying how to develop drivers in a real time OS and how do they
>>>>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
>>>>> I would like to know the priority when executing open(), read(),
>>>>> write()
>>>>> and close() operations.
>>>>> In my example the thread which is using the driver runs with 10
>>>>> RTPRIO,
>>>>> but I don't know what happens in kernel context with the priority when
>>>>> running the I/O operations.
>>>>> Thank you for your help, I don't know where to learn about this.
>>>>>
>>>> []
>>>> Also when using bottom half mechanisms you need to take into account
>>>> the
>>>> priority of the kernel thread that manages the defered work items, so
>>>> rt-drivers may have a different structure than normal drivers.
>>> That's the reason why I prefer UIO based user space drivers !
>> ...which are forced to use threaded IRQs over -rt as well.
> 
> What's wrong with that approach? You have an ISR in the kernel module
> and an interrupt thread at user space.

Under -rt, you have an ISR kernel thread in addition to whatever threads
you create in user space. I thought your point about UIO was avoiding
the need to worry about priorities, but maybe I misunderstood this.

> Seem OK for me since a long time with QNX :)
>> Taking threaded IRQs out of the picture, bottom-half mechanisms usually
>> come into play when dispatch workload that cannot be assigned to a
>> specific user context is significant. But then UIO is the wrong approach
>> anyway as it doesn't match well the requirements of multi-user device
>> interfaces.
>   Support of multi-user device interfaces at user space is just a design
> issue ... I use this concept since a long time with QNX :)

There is always a tradeoff. IIRC, even QNX is no pure microkernel
anymore when it comes to performance sensitive services that are shared
between many processes. And Linux is no pure monolithic kernel anymore
when it comes to easily implementing user space file systems or
exclusively assigning devices to processes.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-05 23:00             ` Jan Kiszka
@ 2011-06-06  0:21               ` Nicholas Mc Guire
  2011-06-06 20:35                 ` Jan Kiszka
  0 siblings, 1 reply; 28+ messages in thread
From: Nicholas Mc Guire @ 2011-06-06  0:21 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Armin Steinhoff, Monica Puig-Pey, linux-rt-users

> 
> There are good examples - in the RT domain - for both models. Sharing a
> device does not necessarily mean making things dynamic or even
> unpredictable.
> 

then I maybe dont get the "exclusive" issue you note - if the highest priority task does not have exclusive access - assuming that there is not contention free sharing - how can you give guarantees ? I can imagin sharing if the highest priority has unconstraint access to the reource and any other access is controled by the highest priority task (i.e. queue replication like ARINC 653 queueing ports) but if you have multiple instances of different priority accessing a resource I don't see how this could be done while giving guarantees on timing (assuming that it is not possible to provide all access as physically atomic instructions)

Do you have an example at hand of such a shared I/O device scheme that can guarantee rt timing ?

> > 
> > Any pointers to VFIO ?
> 
> E.g. http://thread.gmane.org/gmane.linux.kernel.pci/10088
>
thanks. 

hofrat

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-05  9:44         ` Jan Kiszka
  2011-06-05 22:29           ` Nicholas Mc Guire
@ 2011-06-06  7:41           ` Armin Steinhoff
  2011-06-06 20:48             ` Jan Kiszka
  1 sibling, 1 reply; 28+ messages in thread
From: Armin Steinhoff @ 2011-06-06  7:41 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Nicholas Mc Guire, Monica Puig-Pey, linux-rt-users

Jan Kiszka wrote:
> On 2011-06-05 11:28, Nicholas Mc Guire wrote:
>> On Sun, 05 Jun 2011, Armin Steinhoff wrote:
>>
>>> Nicholas Mc Guire wrote:
>>>> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
>>>>
>>>>> Hello,
>>>>> I'm studying how to develop drivers in a real time OS and how do they
>>>>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
>>>>> I would like to know the priority when executing open(), read(), write()
>>>>> and close() operations.
>>>>> In my example the thread which is using the driver runs with 10 RTPRIO,
>>>>> but I don't know what happens in kernel context with the priority when
>>>>> running the I/O operations.
>>>>> Thank you for your help, I don't know where to learn about this.
>>>>>
>>>> []
>>>> Also when using bottom half mechanisms you need to take into account the
>>>> priority of the kernel thread that manages the defered work items, so
>>>> rt-drivers may have a different structure than normal drivers.
>>> That's the reason why I prefer UIO based user space drivers !
>>>
>> ...and how to resolve DMA ? if DMA were resolved cleanly I would agree.
> Regarding that limitation, there is some hope: "next-generation" UIO is
> called VFIO.

I found in a posting about VFIO that  " ioctls are used for all the 
basic interactions"  ... that means VFIO works with a lot of context 
switches.
That's not the case with UIO.  So why should VFIO be a mainline approach 
or next generation UIO at all?

--Armin


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Changing Kernel thread priorities
  2011-06-04 12:30   ` kernel threads in drivers using the RT patch Monica Puig-Pey
@ 2011-06-06 11:47     ` Monica Puig-Pey
  2011-06-06 11:54       ` Rolando Martins
  2011-06-06 18:20       ` Armin Steinhoff
  0 siblings, 2 replies; 28+ messages in thread
From: Monica Puig-Pey @ 2011-06-06 11:47 UTC (permalink / raw)
  To: linux-rt-users, linux-kernel

I am writing a driver which has one kernel thread associated with it.
I want to change the priority of this thread, so that I can specify the 
order in which it is scheduled following an interrupt.
I'm using:

  sched_setscheduler(struct task_struct *, int, struct sched_param *);

but it doesn't work. I tried to change the priority from the 
init_module, and also from the Kernel Thread, but there is no way.

Kernel version is 2.6.31-11-rt

What do I call to change a kernel thread priority?

Thanks you very much

Mónica

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Changing Kernel thread priorities
  2011-06-06 11:47     ` Changing Kernel thread priorities Monica Puig-Pey
@ 2011-06-06 11:54       ` Rolando Martins
  2011-06-06 11:58         ` Monica Puig-Pey
  2011-06-06 18:20       ` Armin Steinhoff
  1 sibling, 1 reply; 28+ messages in thread
From: Rolando Martins @ 2011-06-06 11:54 UTC (permalink / raw)
  To: Monica Puig-Pey; +Cc: linux-rt-users, linux-kernel

Hi,
I use the following:

PIDs=$(ps -eLo pid,cls,rtprio,pri,nice,cmd | grep -i "irq" | awk '{
print $1; }' | xargs echo)
for i in $PIDs
do
    ret=$(chrt -f -p 99 $i)
done

This will change the kernel thread associated with an irq handler to
RT FIFO prio 99.
Just change the script to your specific interrupt.

Hope it helps,
Rolando

On Mon, Jun 6, 2011 at 12:47 PM, Monica Puig-Pey <puigpeym@unican.es> wrote:
> I am writing a driver which has one kernel thread associated with it.
> I want to change the priority of this thread, so that I can specify the
> order in which it is scheduled following an interrupt.
> I'm using:
>
>  sched_setscheduler(struct task_struct *, int, struct sched_param *);
>
> but it doesn't work. I tried to change the priority from the init_module,
> and also from the Kernel Thread, but there is no way.
>
> Kernel version is 2.6.31-11-rt
>
> What do I call to change a kernel thread priority?
>
> Thanks you very much
>
> Mónica
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Changing Kernel thread priorities
  2011-06-06 11:54       ` Rolando Martins
@ 2011-06-06 11:58         ` Monica Puig-Pey
  2011-06-06 16:49           ` Mark Hounschell
  0 siblings, 1 reply; 28+ messages in thread
From: Monica Puig-Pey @ 2011-06-06 11:58 UTC (permalink / raw)
  To: Rolando Martins; +Cc: linux-rt-users, linux-kernel

El 06/06/11 13:54, Rolando Martins escribió:
> Hi,
> I use the following:
>
> PIDs=$(ps -eLo pid,cls,rtprio,pri,nice,cmd | grep -i "irq" | awk '{
> print $1; }' | xargs echo)
> for i in $PIDs
> do
>      ret=$(chrt -f -p 99 $i)
> done
>
> This will change the kernel thread associated with an irq handler to
> RT FIFO prio 99.
> Just change the script to your specific interrupt.
>
> Hope it helps,
> Rolando
>
> On Mon, Jun 6, 2011 at 12:47 PM, Monica Puig-Pey<puigpeym@unican.es>  wrote:
>> I am writing a driver which has one kernel thread associated with it.
>> I want to change the priority of this thread, so that I can specify the
>> order in which it is scheduled following an interrupt.
>> I'm using:
>>
>>   sched_setscheduler(struct task_struct *, int, struct sched_param *);
>>
>> but it doesn't work. I tried to change the priority from the init_module,
>> and also from the Kernel Thread, but there is no way.
>>
>> Kernel version is 2.6.31-11-rt
>>
>> What do I call to change a kernel thread priority?
>>
>> Thanks you very much
>>
>> Mónica
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>

I need to change the priority from inside the driver, when creating the 
kernel thread.
Your script is useful but it is done in user context,
Any other help please?

Mónica


--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Changing Kernel thread priorities
  2011-06-06 11:58         ` Monica Puig-Pey
@ 2011-06-06 16:49           ` Mark Hounschell
  2011-06-07  8:40             ` Monica Puig-Pey
  0 siblings, 1 reply; 28+ messages in thread
From: Mark Hounschell @ 2011-06-06 16:49 UTC (permalink / raw)
  To: Monica Puig-Pey; +Cc: Rolando Martins, linux-rt-users, linux-kernel

On 06/06/2011 07:58 AM, Monica Puig-Pey wrote:
> El 06/06/11 13:54, Rolando Martins escribió:
>> Hi,
>> I use the following:
>>
>> PIDs=$(ps -eLo pid,cls,rtprio,pri,nice,cmd | grep -i "irq" | awk '{
>> print $1; }' | xargs echo)
>> for i in $PIDs
>> do
>> ret=$(chrt -f -p 99 $i)
>> done
>>
>> This will change the kernel thread associated with an irq handler to
>> RT FIFO prio 99.
>> Just change the script to your specific interrupt.
>>
>> Hope it helps,
>> Rolando
>>
>> On Mon, Jun 6, 2011 at 12:47 PM, Monica Puig-Pey<puigpeym@unican.es>
>> wrote:
>>> I am writing a driver which has one kernel thread associated with it.
>>> I want to change the priority of this thread, so that I can specify the
>>> order in which it is scheduled following an interrupt.
>>> I'm using:
>>>
>>> sched_setscheduler(struct task_struct *, int, struct sched_param *);
>>>
>>> but it doesn't work. I tried to change the priority from the
>>> init_module,
>>> and also from the Kernel Thread, but there is no way.
>>>
>>> Kernel version is 2.6.31-11-rt
>>>
>>> What do I call to change a kernel thread priority?
>>>
>>> Thanks you very much
>>>
>>> Mónica
>>>
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe
>>> linux-rt-users" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>
>
> I need to change the priority from inside the driver, when creating the
> kernel thread.
> Your script is useful but it is done in user context,
> Any other help please?

What I do is record the PID of the thread in the driver, then create an 
IOCTL for your driver that user land can call that either returns the 
PID so you can do it in user land, or cause the IOCTL code to do it in 
the driver.

The same can be done with the affinity of the IRQ if you record the IRQ 
number.

Mark
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Changing Kernel thread priorities
  2011-06-06 11:47     ` Changing Kernel thread priorities Monica Puig-Pey
  2011-06-06 11:54       ` Rolando Martins
@ 2011-06-06 18:20       ` Armin Steinhoff
  1 sibling, 0 replies; 28+ messages in thread
From: Armin Steinhoff @ 2011-06-06 18:20 UTC (permalink / raw)
  To: Monica Puig-Pey; +Cc: linux-rt-users, linux-kernel

Monica Puig-Pey wrote:
> I am writing a driver which has one kernel thread associated with it.
> I want to change the priority of this thread, so that I can specify 
> the order in which it is scheduled following an interrupt.
> I'm using:
>
>  sched_setscheduler(struct task_struct *, int, struct sched_param *);  
> -> sys_sched_setscheduler

http://ftp.au.debian.org/linux-mandocs/2.6.0-test7-full/sys_sched_setscheduler.html

Hope this helps ..

--Armin

>
> but it doesn't work. I tried to change the priority from the 
> init_module, and also from the Kernel Thread, but there is no way.
>
> Kernel version is 2.6.31-11-rt
>
> What do I call to change a kernel thread priority?
>
> Thanks you very much
>
> Mónica
>
> -- 
> To unsubscribe from this list: send the line "unsubscribe 
> linux-rt-users" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-06  0:21               ` Nicholas Mc Guire
@ 2011-06-06 20:35                 ` Jan Kiszka
  0 siblings, 0 replies; 28+ messages in thread
From: Jan Kiszka @ 2011-06-06 20:35 UTC (permalink / raw)
  To: Nicholas Mc Guire; +Cc: Armin Steinhoff, Monica Puig-Pey, linux-rt-users

[-- Attachment #1: Type: text/plain, Size: 1798 bytes --]

On 2011-06-06 02:21, Nicholas Mc Guire wrote:
>>
>> There are good examples - in the RT domain - for both models. Sharing a
>> device does not necessarily mean making things dynamic or even
>> unpredictable.
>>
> 
> then I maybe dont get the "exclusive" issue you note - if the highest priority task does not have exclusive access - assuming that there is not contention free sharing - how can you give guarantees ? I can imagin sharing if the highest priority has unconstraint access to the reource and any other access is controled by the highest priority task (i.e. queue replication like ARINC 653 queueing ports) but if you have multiple instances of different priority accessing a resource I don't see how this could be done while giving guarantees on timing (assuming that it is not possible to provide all access as physically atomic instructions)

Just the classic way: If there is a critical path while accessing the
device, make it exclusive via locking. If the length of the critical
path is controllable by a low-prio task, you either need to include that
workload in the WCET estimation or you need to apply some limits/quotas
to prevent unbounded path lengths.

> 
> Do you have an example at hand of such a shared I/O device scheme that can guarantee rt timing ?

Let's make it simple: What prevents sharing the process image exposed by
an abstract I/O devices in form of a MMIO region between multiple user
processes? That you may not rely on the hardware to avoid that processes
tap on each other's shoes? But that can be sorted out by privileged
driver that enforces access rules, dispatches variable update events to
listeners or ensures that only consistent modifications are transferred
to the physical process.

Where do we loose RT here?

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: I/O operations priority in RTOS
  2011-06-06  7:41           ` Armin Steinhoff
@ 2011-06-06 20:48             ` Jan Kiszka
  0 siblings, 0 replies; 28+ messages in thread
From: Jan Kiszka @ 2011-06-06 20:48 UTC (permalink / raw)
  To: Armin Steinhoff; +Cc: Nicholas Mc Guire, Monica Puig-Pey, linux-rt-users

[-- Attachment #1: Type: text/plain, Size: 2445 bytes --]

On 2011-06-06 09:41, Armin Steinhoff wrote:
> Jan Kiszka wrote:
>> On 2011-06-05 11:28, Nicholas Mc Guire wrote:
>>> On Sun, 05 Jun 2011, Armin Steinhoff wrote:
>>>
>>>> Nicholas Mc Guire wrote:
>>>>> On Sat, 04 Jun 2011, Monica Puig-Pey wrote:
>>>>>
>>>>>> Hello,
>>>>>> I'm studying how to develop drivers in a real time OS and how do they
>>>>>> work. I'm using  Ubuntu 10.04 with the 2.6.31-11-rt patch installed.
>>>>>> I would like to know the priority when executing open(), read(),
>>>>>> write()
>>>>>> and close() operations.
>>>>>> In my example the thread which is using the driver runs with 10
>>>>>> RTPRIO,
>>>>>> but I don't know what happens in kernel context with the priority
>>>>>> when
>>>>>> running the I/O operations.
>>>>>> Thank you for your help, I don't know where to learn about this.
>>>>>>
>>>>> []
>>>>> Also when using bottom half mechanisms you need to take into
>>>>> account the
>>>>> priority of the kernel thread that manages the defered work items, so
>>>>> rt-drivers may have a different structure than normal drivers.
>>>> That's the reason why I prefer UIO based user space drivers !
>>>>
>>> ...and how to resolve DMA ? if DMA were resolved cleanly I would agree.
>> Regarding that limitation, there is some hope: "next-generation" UIO is
>> called VFIO.
> 
> I found in a posting about VFIO that  " ioctls are used for all the
> basic interactions"  ... that means VFIO works with a lot of context
> switches.

That mostly refers to configuring VFIO devices (just check the code when
in doubt).

One exception is EIO. VFIO works generically, without any device
specific kernel stubs. So legacy interrupts are first generically
masked, then reported to user space to do the device specific handling,
and then ack'ed by user space via an IOCTL to remove the mask again. But
that only matters for legacy INTx, not for MSI[-X].

> That's not the case with UIO.  So why should VFIO be a mainline approach
> or next generation UIO at all?

Because it is promising to solve the DMA challenge without totally
ignoring security (in contrast to uio-dma). And because it already has
two major use cases (high-speed user space networking and virtualization).

Conceptually, VFIO should be able to cover most of those scenarios that
UIO currently addresses. But UIO is kernel ABI and wouldn't go away even
if VFIO was able to completely replace it.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Changing Kernel thread priorities
  2011-06-06 16:49           ` Mark Hounschell
@ 2011-06-07  8:40             ` Monica Puig-Pey
  2011-06-07  9:14               ` Mark Hounschell
  0 siblings, 1 reply; 28+ messages in thread
From: Monica Puig-Pey @ 2011-06-07  8:40 UTC (permalink / raw)
  To: markh; +Cc: Rolando Martins, linux-rt-users, linux-kernel

El 06/06/11 18:49, Mark Hounschell escribió:
> On 06/06/2011 07:58 AM, Monica Puig-Pey wrote:
>> El 06/06/11 13:54, Rolando Martins escribió:
>>> Hi,
>>> I use the following:
>>>
>>> PIDs=$(ps -eLo pid,cls,rtprio,pri,nice,cmd | grep -i "irq" | awk '{
>>> print $1; }' | xargs echo)
>>> for i in $PIDs
>>> do
>>> ret=$(chrt -f -p 99 $i)
>>> done
>>>
>>> This will change the kernel thread associated with an irq handler to
>>> RT FIFO prio 99.
>>> Just change the script to your specific interrupt.
>>>
>>> Hope it helps,
>>> Rolando
>>>
>>> On Mon, Jun 6, 2011 at 12:47 PM, Monica Puig-Pey<puigpeym@unican.es>
>>> wrote:
>>>> I am writing a driver which has one kernel thread associated with it.
>>>> I want to change the priority of this thread, so that I can specify the
>>>> order in which it is scheduled following an interrupt.
>>>> I'm using:
>>>>
>>>> sched_setscheduler(struct task_struct *, int, struct sched_param *);
>>>>
>>>> but it doesn't work. I tried to change the priority from the
>>>> init_module,
>>>> and also from the Kernel Thread, but there is no way.
>>>>
>>>> Kernel version is 2.6.31-11-rt
>>>>
>>>> What do I call to change a kernel thread priority?
>>>>
>>>> Thanks you very much
>>>>
>>>> Mónica
>>>>
>>>> --
>>>> To unsubscribe from this list: send the line "unsubscribe
>>>> linux-rt-users" in
>>>> the body of a message to majordomo@vger.kernel.org
>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>
>>
>> I need to change the priority from inside the driver, when creating the
>> kernel thread.
>> Your script is useful but it is done in user context,
>> Any other help please?
>
> What I do is record the PID of the thread in the driver, then create an
> IOCTL for your driver that user land can call that either returns the
> PID so you can do it in user land, or cause the IOCTL code to do it in
> the driver.
>
> The same can be done with the affinity of the IRQ if you record the IRQ
> number.
>
> Mark
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-rt-users" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html

But I don't have de PID of my Kthread, I only have the task_struc * that 
gives me the function:

  struct task_struct *kthread_create(int (*threadfn)(void *data),
                    void *data,
                    const char namefmt[], ...)

How could I get the PID, and which function should I use in the IOCTL 
(kernel context) for changing its priority?

Thank you so much for your help

Mónica
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Changing Kernel thread priorities
  2011-06-07  8:40             ` Monica Puig-Pey
@ 2011-06-07  9:14               ` Mark Hounschell
  2011-06-07  9:46                 ` Mark Hounschell
  0 siblings, 1 reply; 28+ messages in thread
From: Mark Hounschell @ 2011-06-07  9:14 UTC (permalink / raw)
  To: Monica Puig-Pey; +Cc: markh, Rolando Martins, linux-rt-users, linux-kernel

On 06/07/2011 04:40 AM, Monica Puig-Pey wrote:
> El 06/06/11 18:49, Mark Hounschell escribió:
>> On 06/06/2011 07:58 AM, Monica Puig-Pey wrote:
>>> El 06/06/11 13:54, Rolando Martins escribió:
>>>> Hi,
>>>> I use the following:
>>>>
>>>> PIDs=$(ps -eLo pid,cls,rtprio,pri,nice,cmd | grep -i "irq" | awk '{
>>>> print $1; }' | xargs echo)
>>>> for i in $PIDs
>>>> do
>>>> ret=$(chrt -f -p 99 $i)
>>>> done
>>>>
>>>> This will change the kernel thread associated with an irq handler to
>>>> RT FIFO prio 99.
>>>> Just change the script to your specific interrupt.
>>>>
>>>> Hope it helps,
>>>> Rolando
>>>>
>>>> On Mon, Jun 6, 2011 at 12:47 PM, Monica Puig-Pey<puigpeym@unican.es>
>>>> wrote:
>>>>> I am writing a driver which has one kernel thread associated with it.
>>>>> I want to change the priority of this thread, so that I can specify the
>>>>> order in which it is scheduled following an interrupt.
>>>>> I'm using:
>>>>>
>>>>> sched_setscheduler(struct task_struct *, int, struct sched_param *);
>>>>>
>>>>> but it doesn't work. I tried to change the priority from the
>>>>> init_module,
>>>>> and also from the Kernel Thread, but there is no way.
>>>>>
>>>>> Kernel version is 2.6.31-11-rt
>>>>>
>>>>> What do I call to change a kernel thread priority?
>>>>>
>>>>> Thanks you very much
>>>>>
>>>>> Mónica
>>>>>
>>>>> --
>>>>> To unsubscribe from this list: send the line "unsubscribe
>>>>> linux-rt-users" in
>>>>> the body of a message to majordomo@vger.kernel.org
>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>>
>>>
>>> I need to change the priority from inside the driver, when creating the
>>> kernel thread.
>>> Your script is useful but it is done in user context,
>>> Any other help please?
>>
>> What I do is record the PID of the thread in the driver, then create an
>> IOCTL for your driver that user land can call that either returns the
>> PID so you can do it in user land, or cause the IOCTL code to do it in
>> the driver.
>>
>> The same can be done with the affinity of the IRQ if you record the IRQ
>> number.
>>
>> Mark
>> --
>> To unsubscribe from this list: send the line "unsubscribe
>> linux-rt-users" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
> But I don't have de PID of my Kthread, I only have the task_struc * that
> gives me the function:
>
> struct task_struct *kthread_create(int (*threadfn)(void *data),
> void *data,
> const char namefmt[], ...)
>
> How could I get the PID, and which function should I use in the IOCTL
> (kernel context) for changing its priority?
>

The PID can be obtained from within the interrupt handler its self via 
current->pid.
Obviously an interrupt has to occur first but after one interrupt you have it.

Actually I had forgot how I handled this. Where I change the RT priority 
and cpu affinity is in what used to be called the Bottom Half and the IOCTL 
referred to above simply tells the BH to do it and with what values.

Regards
Mark



--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Changing Kernel thread priorities
  2011-06-07  9:14               ` Mark Hounschell
@ 2011-06-07  9:46                 ` Mark Hounschell
  2011-06-07 18:34                   ` Monica Puig-Pey
  0 siblings, 1 reply; 28+ messages in thread
From: Mark Hounschell @ 2011-06-07  9:46 UTC (permalink / raw)
  To: Monica Puig-Pey
  Cc: dmarkh, markh, Rolando Martins, linux-rt-users, linux-kernel

On 06/07/2011 05:14 AM, Mark Hounschell wrote:
> On 06/07/2011 04:40 AM, Monica Puig-Pey wrote:
>> El 06/06/11 18:49, Mark Hounschell escribió:
>>> On 06/06/2011 07:58 AM, Monica Puig-Pey wrote:
>>>> El 06/06/11 13:54, Rolando Martins escribió:
>>>>> Hi,
>>>>> I use the following:
>>>>>
>>>>> PIDs=$(ps -eLo pid,cls,rtprio,pri,nice,cmd | grep -i "irq" | awk '{
>>>>> print $1; }' | xargs echo)
>>>>> for i in $PIDs
>>>>> do
>>>>> ret=$(chrt -f -p 99 $i)
>>>>> done
>>>>>
>>>>> This will change the kernel thread associated with an irq handler to
>>>>> RT FIFO prio 99.
>>>>> Just change the script to your specific interrupt.
>>>>>
>>>>> Hope it helps,
>>>>> Rolando
>>>>>
>>>>> On Mon, Jun 6, 2011 at 12:47 PM, Monica Puig-Pey<puigpeym@unican.es>
>>>>> wrote:
>>>>>> I am writing a driver which has one kernel thread associated with it.
>>>>>> I want to change the priority of this thread, so that I can specify the
>>>>>> order in which it is scheduled following an interrupt.
>>>>>> I'm using:
>>>>>>
>>>>>> sched_setscheduler(struct task_struct *, int, struct sched_param *);
>>>>>>
>>>>>> but it doesn't work. I tried to change the priority from the
>>>>>> init_module,
>>>>>> and also from the Kernel Thread, but there is no way.
>>>>>>
>>>>>> Kernel version is 2.6.31-11-rt
>>>>>>
>>>>>> What do I call to change a kernel thread priority?
>>>>>>
>>>>>> Thanks you very much
>>>>>>
>>>>>> Mónica
>>>>>>
>>>>>> --
>>>>>> To unsubscribe from this list: send the line "unsubscribe
>>>>>> linux-rt-users" in
>>>>>> the body of a message to majordomo@vger.kernel.org
>>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>>>
>>>>
>>>> I need to change the priority from inside the driver, when creating the
>>>> kernel thread.
>>>> Your script is useful but it is done in user context,
>>>> Any other help please?
>>>
>>> What I do is record the PID of the thread in the driver, then create an
>>> IOCTL for your driver that user land can call that either returns the
>>> PID so you can do it in user land, or cause the IOCTL code to do it in
>>> the driver.
>>>
>>> The same can be done with the affinity of the IRQ if you record the IRQ
>>> number.
>>>
>>> Mark
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe
>>> linux-rt-users" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>> But I don't have de PID of my Kthread, I only have the task_struc * that
>> gives me the function:
>>
>> struct task_struct *kthread_create(int (*threadfn)(void *data),
>> void *data,
>> const char namefmt[], ...)
>>
>> How could I get the PID, and which function should I use in the IOCTL
>> (kernel context) for changing its priority?
>>
>
> The PID can be obtained from within the interrupt handler its self via
> current->pid.
> Obviously an interrupt has to occur first but after one interrupt you have it.
>
> Actually I had forgot how I handled this. Where I change the RT priority
> and cpu affinity is in what used to be called the Bottom Half and the IOCTL
> referred to above simply tells the BH to do it and with what values.
>

In interrupt handler code snippet:

struct task_struct *TSK;
struct sched_param PARAM = {.sched_priority = MAX_RT_PRIO };

         TSK = current;

Code snippet from BH:

         if (((rtom_rtprio != 0) &&
              (rtom_rtprio != PARAM.sched_priority)) ||
              (my_rtom_rtprio[BOARD] != rtom_rtprio)) {

                 PARAM.sched_priority = rtom_rtprio;
                 my_rtom_rtprio[COUNT] = rtom_rtprio;
                 sched_setscheduler(TSK, SCHED_FIFO, &PARAM);

                 set_cpus_allowed(TSK, rtom_devices[BOARD].irq_cpu_mask);
                 rtom_devices[BOARD].irq_task_pid = TSK->pid;
        }

rtom_rtprio and irq_cpu_mask are set by userland via an IOCTL. An interrupt 
must occur for this to happen and my BOARD never shares IRQs.

Mark

--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Changing Kernel thread priorities
  2011-06-07  9:46                 ` Mark Hounschell
@ 2011-06-07 18:34                   ` Monica Puig-Pey
  2011-06-07 18:55                     ` Mark Hounschell
  0 siblings, 1 reply; 28+ messages in thread
From: Monica Puig-Pey @ 2011-06-07 18:34 UTC (permalink / raw)
  To: dmarkh; +Cc: markh, Rolando Martins, linux-rt-users, linux-kernel

El 07/06/11 11:46, Mark Hounschell escribió:
> On 06/07/2011 05:14 AM, Mark Hounschell wrote:
>> On 06/07/2011 04:40 AM, Monica Puig-Pey wrote:
>>> El 06/06/11 18:49, Mark Hounschell escribió:
>>>> On 06/06/2011 07:58 AM, Monica Puig-Pey wrote:
>>>>> El 06/06/11 13:54, Rolando Martins escribió:
>>>>>> Hi,
>>>>>> I use the following:
>>>>>>
>>>>>> PIDs=$(ps -eLo pid,cls,rtprio,pri,nice,cmd | grep -i "irq" | awk '{
>>>>>> print $1; }' | xargs echo)
>>>>>> for i in $PIDs
>>>>>> do
>>>>>> ret=$(chrt -f -p 99 $i)
>>>>>> done
>>>>>>
>>>>>> This will change the kernel thread associated with an irq handler to
>>>>>> RT FIFO prio 99.
>>>>>> Just change the script to your specific interrupt.
>>>>>>
>>>>>> Hope it helps,
>>>>>> Rolando
>>>>>>
>>>>>> On Mon, Jun 6, 2011 at 12:47 PM, Monica Puig-Pey
>>>>>> wrote:
>>>>>>> I am writing a driver which has one kernel thread associated with
>>>>>>> it.
>>>>>>> I want to change the priority of this thread, so that I can
>>>>>>> specify the
>>>>>>> order in which it is scheduled following an interrupt.
>>>>>>> I'm using:
>>>>>>>
>>>>>>> sched_setscheduler(struct task_struct *, int, struct sched_param *);
>>>>>>>
>>>>>>> but it doesn't work. I tried to change the priority from the
>>>>>>> init_module,
>>>>>>> and also from the Kernel Thread, but there is no way.
>>>>>>>
>>>>>>> Kernel version is 2.6.31-11-rt
>>>>>>>
>>>>>>> What do I call to change a kernel thread priority?
>>>>>>>
>>>>>>> Thanks you very much
>>>>>>>
>>>>>>> Mónica
>>>>>>>
>>>>>>> --
>>>>>>> To unsubscribe from this list: send the line "unsubscribe
>>>>>>> linux-rt-users" in
>>>>>>> the body of a message to majordomo@vger.kernel.org
>>>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>>>>
>>>>>
>>>>> I need to change the priority from inside the driver, when creating
>>>>> the
>>>>> kernel thread.
>>>>> Your script is useful but it is done in user context,
>>>>> Any other help please?
>>>>
>>>> What I do is record the PID of the thread in the driver, then create an
>>>> IOCTL for your driver that user land can call that either returns the
>>>> PID so you can do it in user land, or cause the IOCTL code to do it in
>>>> the driver.
>>>>
>>>> The same can be done with the affinity of the IRQ if you record the IRQ
>>>> number.
>>>>
>>>> Mark
>>>> --
>>>> To unsubscribe from this list: send the line "unsubscribe
>>>> linux-rt-users" in
>>>> the body of a message to majordomo@vger.kernel.org
>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>
>>> But I don't have de PID of my Kthread, I only have the task_struc * that
>>> gives me the function:
>>>
>>> struct task_struct *kthread_create(int (*threadfn)(void *data),
>>> void *data,
>>> const char namefmt[], ...)
>>>
>>> How could I get the PID, and which function should I use in the IOCTL
>>> (kernel context) for changing its priority?
>>>
>>
>> The PID can be obtained from within the interrupt handler its self via
>> current->pid.
>> Obviously an interrupt has to occur first but after one interrupt you
>> have it.
>>
>> Actually I had forgot how I handled this. Where I change the RT priority
>> and cpu affinity is in what used to be called the Bottom Half and the
>> IOCTL
>> referred to above simply tells the BH to do it and with what values.
>>
>
> In interrupt handler code snippet:
>
> struct task_struct *TSK;
> struct sched_param PARAM = {.sched_priority = MAX_RT_PRIO };
>
> TSK = current;
>
> Code snippet from BH:
>
> if (((rtom_rtprio != 0) &&
> (rtom_rtprio != PARAM.sched_priority)) ||
> (my_rtom_rtprio[BOARD] != rtom_rtprio)) {
>
> PARAM.sched_priority = rtom_rtprio;
> my_rtom_rtprio[COUNT] = rtom_rtprio;
> sched_setscheduler(TSK, SCHED_FIFO, &PARAM);
>
> set_cpus_allowed(TSK, rtom_devices[BOARD].irq_cpu_mask);
> rtom_devices[BOARD].irq_task_pid = TSK->pid;
> }
>
> rtom_rtprio and irq_cpu_mask are set by userland via an IOCTL. An
> interrupt must occur for this to happen and my BOARD never shares IRQs.
>
> Mark
>

Thanks, your idea seems to be very useful to me. I was doing it very 
similar, but I didn't use the "current" variable to know the task_struct *.

I have tried your suggestion on an easy example, but it didn't work.
Insmod returns through the kernel

	[11334.895499] kthread: Unknown symbol sched_setscheduler

Code shown below:

#include <linux/module.h>	
#include <linux/kernel.h>
#include <linux/ioport.h>

#include <linux/wait.h>
#include <linux/kthread.h>
#include <asm/io.h>
#include <linux/sched.h>


struct task_struct *ts;

int thread(void *data)
{
   struct task_struct *TSK;
   struct sched_param PARAM = {.sched_priority = MAX_RT_PRIO };
   TSK = current;

   PARAM.sched_priority = 50;
   sched_setscheduler(TSK, SCHED_FIFO, &PARAM); // <-- unknown symbol??

   while(1){
     printk("Hi I am kernel thread!\n");
     msleep(100);
     if (kthread_should_stop())
       break;		
}
         return 0;
}


int init_module(void)
{
   printk(KERN_INFO "init_module() called\n");
   ts=kthread_run(thread,NULL,"kthread");
          return 0;
}

void cleanup_module(void)
{
   printk(KERN_INFO "cleanup_module() called\n");
   kthread_stop(ts);
}

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Changing Kernel thread priorities
  2011-06-07 18:34                   ` Monica Puig-Pey
@ 2011-06-07 18:55                     ` Mark Hounschell
  2011-06-10 10:12                       ` Monica Puig-Pey
  0 siblings, 1 reply; 28+ messages in thread
From: Mark Hounschell @ 2011-06-07 18:55 UTC (permalink / raw)
  To: Monica Puig-Pey; +Cc: dmarkh, Rolando Martins, linux-rt-users, linux-kernel

On 06/07/2011 02:34 PM, Monica Puig-Pey wrote:
> El 07/06/11 11:46, Mark Hounschell escribió:
>> On 06/07/2011 05:14 AM, Mark Hounschell wrote:
>>> On 06/07/2011 04:40 AM, Monica Puig-Pey wrote:
>>>> El 06/06/11 18:49, Mark Hounschell escribió:
>>>>> On 06/06/2011 07:58 AM, Monica Puig-Pey wrote:
>>>>>> El 06/06/11 13:54, Rolando Martins escribió:
>>>>>>> Hi,
>>>>>>> I use the following:
>>>>>>>
>>>>>>> PIDs=$(ps -eLo pid,cls,rtprio,pri,nice,cmd | grep -i "irq" | awk '{
>>>>>>> print $1; }' | xargs echo)
>>>>>>> for i in $PIDs
>>>>>>> do
>>>>>>> ret=$(chrt -f -p 99 $i)
>>>>>>> done
>>>>>>>
>>>>>>> This will change the kernel thread associated with an irq handler to
>>>>>>> RT FIFO prio 99.
>>>>>>> Just change the script to your specific interrupt.
>>>>>>>
>>>>>>> Hope it helps,
>>>>>>> Rolando
>>>>>>>
>>>>>>> On Mon, Jun 6, 2011 at 12:47 PM, Monica Puig-Pey
>>>>>>> wrote:
>>>>>>>> I am writing a driver which has one kernel thread associated with
>>>>>>>> it.
>>>>>>>> I want to change the priority of this thread, so that I can
>>>>>>>> specify the
>>>>>>>> order in which it is scheduled following an interrupt.
>>>>>>>> I'm using:
>>>>>>>>
>>>>>>>> sched_setscheduler(struct task_struct *, int, struct sched_param
>>>>>>>> *);
>>>>>>>>
>>>>>>>> but it doesn't work. I tried to change the priority from the
>>>>>>>> init_module,
>>>>>>>> and also from the Kernel Thread, but there is no way.
>>>>>>>>
>>>>>>>> Kernel version is 2.6.31-11-rt
>>>>>>>>
>>>>>>>> What do I call to change a kernel thread priority?
>>>>>>>>
>>>>>>>> Thanks you very much
>>>>>>>>
>>>>>>>> Mónica
>>>>>>>>
>>>>>>>> --
>>>>>>>> To unsubscribe from this list: send the line "unsubscribe
>>>>>>>> linux-rt-users" in
>>>>>>>> the body of a message to majordomo@vger.kernel.org
>>>>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>>>>>
>>>>>>
>>>>>> I need to change the priority from inside the driver, when creating
>>>>>> the
>>>>>> kernel thread.
>>>>>> Your script is useful but it is done in user context,
>>>>>> Any other help please?
>>>>>
>>>>> What I do is record the PID of the thread in the driver, then
>>>>> create an
>>>>> IOCTL for your driver that user land can call that either returns the
>>>>> PID so you can do it in user land, or cause the IOCTL code to do it in
>>>>> the driver.
>>>>>
>>>>> The same can be done with the affinity of the IRQ if you record the
>>>>> IRQ
>>>>> number.
>>>>>
>>>>> Mark
>>>>> --
>>>>> To unsubscribe from this list: send the line "unsubscribe
>>>>> linux-rt-users" in
>>>>> the body of a message to majordomo@vger.kernel.org
>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>
>>>> But I don't have de PID of my Kthread, I only have the task_struc *
>>>> that
>>>> gives me the function:
>>>>
>>>> struct task_struct *kthread_create(int (*threadfn)(void *data),
>>>> void *data,
>>>> const char namefmt[], ...)
>>>>
>>>> How could I get the PID, and which function should I use in the IOCTL
>>>> (kernel context) for changing its priority?
>>>>
>>>
>>> The PID can be obtained from within the interrupt handler its self via
>>> current->pid.
>>> Obviously an interrupt has to occur first but after one interrupt you
>>> have it.
>>>
>>> Actually I had forgot how I handled this. Where I change the RT priority
>>> and cpu affinity is in what used to be called the Bottom Half and the
>>> IOCTL
>>> referred to above simply tells the BH to do it and with what values.
>>>
>>
>> In interrupt handler code snippet:
>>
>> struct task_struct *TSK;
>> struct sched_param PARAM = {.sched_priority = MAX_RT_PRIO };
>>
>> TSK = current;
>>
>> Code snippet from BH:
>>
>> if (((rtom_rtprio != 0) &&
>> (rtom_rtprio != PARAM.sched_priority)) ||
>> (my_rtom_rtprio[BOARD] != rtom_rtprio)) {
>>
>> PARAM.sched_priority = rtom_rtprio;
>> my_rtom_rtprio[COUNT] = rtom_rtprio;
>> sched_setscheduler(TSK, SCHED_FIFO, &PARAM);
>>
>> set_cpus_allowed(TSK, rtom_devices[BOARD].irq_cpu_mask);
>> rtom_devices[BOARD].irq_task_pid = TSK->pid;
>> }
>>
>> rtom_rtprio and irq_cpu_mask are set by userland via an IOCTL. An
>> interrupt must occur for this to happen and my BOARD never shares IRQs.
>>
>> Mark
>>
>
> Thanks, your idea seems to be very useful to me. I was doing it very
> similar, but I didn't use the "current" variable to know the task_struct *.
>
> I have tried your suggestion on an easy example, but it didn't work.
> Insmod returns through the kernel
>
> [11334.895499] kthread: Unknown symbol sched_setscheduler
>
> Code shown below:
>
> #include <linux/module.h>
> #include <linux/kernel.h>
> #include <linux/ioport.h>
>
> #include <linux/wait.h>
> #include <linux/kthread.h>
> #include <asm/io.h>
> #include <linux/sched.h>
>
>
> struct task_struct *ts;
>
> int thread(void *data)
> {
> struct task_struct *TSK;
> struct sched_param PARAM = {.sched_priority = MAX_RT_PRIO };
> TSK = current;
>
> PARAM.sched_priority = 50;
> sched_setscheduler(TSK, SCHED_FIFO, &PARAM); // <-- unknown symbol??
>
> while(1){
> printk("Hi I am kernel thread!\n");
> msleep(100);
> if (kthread_should_stop())
> break;
> }
> return 0;
> }
>
>
> int init_module(void)
> {
> printk(KERN_INFO "init_module() called\n");
> ts=kthread_run(thread,NULL,"kthread");
> return 0;
> }
>
> void cleanup_module(void)
> {
> printk(KERN_INFO "cleanup_module() called\n");
> kthread_stop(ts);
> }
> .
>

In kernel/sched.c

EXPORT_SYMBOL_GPL(sched_setscheduler);

If your driver is not GPL, you can't use it.

Mark
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Changing Kernel thread priorities
  2011-06-07 18:55                     ` Mark Hounschell
@ 2011-06-10 10:12                       ` Monica Puig-Pey
  0 siblings, 0 replies; 28+ messages in thread
From: Monica Puig-Pey @ 2011-06-10 10:12 UTC (permalink / raw)
  To: markh; +Cc: dmarkh, linux-rt-users, linux-kernel

El 07/06/11 20:55, Mark Hounschell escribió:
> On 06/07/2011 02:34 PM, Monica Puig-Pey wrote:
>> El 07/06/11 11:46, Mark Hounschell escribió:
>>> On 06/07/2011 05:14 AM, Mark Hounschell wrote:
>>>> On 06/07/2011 04:40 AM, Monica Puig-Pey wrote:
>>>>> El 06/06/11 18:49, Mark Hounschell escribió:
>>>>>> On 06/06/2011 07:58 AM, Monica Puig-Pey wrote:
>>>>>>> El 06/06/11 13:54, Rolando Martins escribió:
>>>>>>>> Hi,
>>>>>>>> I use the following:
>>>>>>>>
>>>>>>>> PIDs=$(ps -eLo pid,cls,rtprio,pri,nice,cmd | grep -i "irq" | awk '{
>>>>>>>> print $1; }' | xargs echo)
>>>>>>>> for i in $PIDs
>>>>>>>> do
>>>>>>>> ret=$(chrt -f -p 99 $i)
>>>>>>>> done
>>>>>>>>
>>>>>>>> This will change the kernel thread associated with an irq
>>>>>>>> handler to
>>>>>>>> RT FIFO prio 99.
>>>>>>>> Just change the script to your specific interrupt.
>>>>>>>>
>>>>>>>> Hope it helps,
>>>>>>>> Rolando
>>>>>>>>
>>>>>>>> On Mon, Jun 6, 2011 at 12:47 PM, Monica Puig-Pey
>>>>>>>> wrote:
>>>>>>>>> I am writing a driver which has one kernel thread associated with
>>>>>>>>> it.
>>>>>>>>> I want to change the priority of this thread, so that I can
>>>>>>>>> specify the
>>>>>>>>> order in which it is scheduled following an interrupt.
>>>>>>>>> I'm using:
>>>>>>>>>
>>>>>>>>> sched_setscheduler(struct task_struct *, int, struct sched_param
>>>>>>>>> *);
>>>>>>>>>
>>>>>>>>> but it doesn't work. I tried to change the priority from the
>>>>>>>>> init_module,
>>>>>>>>> and also from the Kernel Thread, but there is no way.
>>>>>>>>>
>>>>>>>>> Kernel version is 2.6.31-11-rt
>>>>>>>>>
>>>>>>>>> What do I call to change a kernel thread priority?
>>>>>>>>>
>>>>>>>>> Thanks you very much
>>>>>>>>>
>>>>>>>>> Mónica
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> To unsubscribe from this list: send the line "unsubscribe
>>>>>>>>> linux-rt-users" in
>>>>>>>>> the body of a message to majordomo@vger.kernel.org
>>>>>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>>>>>>
>>>>>>>
>>>>>>> I need to change the priority from inside the driver, when creating
>>>>>>> the
>>>>>>> kernel thread.
>>>>>>> Your script is useful but it is done in user context,
>>>>>>> Any other help please?
>>>>>>
>>>>>> What I do is record the PID of the thread in the driver, then
>>>>>> create an
>>>>>> IOCTL for your driver that user land can call that either returns the
>>>>>> PID so you can do it in user land, or cause the IOCTL code to do
>>>>>> it in
>>>>>> the driver.
>>>>>>
>>>>>> The same can be done with the affinity of the IRQ if you record the
>>>>>> IRQ
>>>>>> number.
>>>>>>
>>>>>> Mark
>>>>>> --
>>>>>> To unsubscribe from this list: send the line "unsubscribe
>>>>>> linux-rt-users" in
>>>>>> the body of a message to majordomo@vger.kernel.org
>>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>>
>>>>> But I don't have de PID of my Kthread, I only have the task_struc *
>>>>> that
>>>>> gives me the function:
>>>>>
>>>>> struct task_struct *kthread_create(int (*threadfn)(void *data),
>>>>> void *data,
>>>>> const char namefmt[], ...)
>>>>>
>>>>> How could I get the PID, and which function should I use in the IOCTL
>>>>> (kernel context) for changing its priority?
>>>>>
>>>>
>>>> The PID can be obtained from within the interrupt handler its self via
>>>> current->pid.
>>>> Obviously an interrupt has to occur first but after one interrupt you
>>>> have it.
>>>>
>>>> Actually I had forgot how I handled this. Where I change the RT
>>>> priority
>>>> and cpu affinity is in what used to be called the Bottom Half and the
>>>> IOCTL
>>>> referred to above simply tells the BH to do it and with what values.
>>>>
>>>
>>> In interrupt handler code snippet:
>>>
>>> struct task_struct *TSK;
>>> struct sched_param PARAM = {.sched_priority = MAX_RT_PRIO };
>>>
>>> TSK = current;
>>>
>>> Code snippet from BH:
>>>
>>> if (((rtom_rtprio != 0) &&
>>> (rtom_rtprio != PARAM.sched_priority)) ||
>>> (my_rtom_rtprio[BOARD] != rtom_rtprio)) {
>>>
>>> PARAM.sched_priority = rtom_rtprio;
>>> my_rtom_rtprio[COUNT] = rtom_rtprio;
>>> sched_setscheduler(TSK, SCHED_FIFO, &PARAM);
>>>
>>> set_cpus_allowed(TSK, rtom_devices[BOARD].irq_cpu_mask);
>>> rtom_devices[BOARD].irq_task_pid = TSK->pid;
>>> }
>>>
>>> rtom_rtprio and irq_cpu_mask are set by userland via an IOCTL. An
>>> interrupt must occur for this to happen and my BOARD never shares IRQs.
>>>
>>> Mark
>>>
>>
>> Thanks, your idea seems to be very useful to me. I was doing it very
>> similar, but I didn't use the "current" variable to know the
>> task_struct *.
>>
>> I have tried your suggestion on an easy example, but it didn't work.
>> Insmod returns through the kernel
>>
>> [11334.895499] kthread: Unknown symbol sched_setscheduler
>>
>> Code shown below:
>>
>> #include <linux/module.h>
>> #include <linux/kernel.h>
>> #include <linux/ioport.h>
>>
>> #include <linux/wait.h>
>> #include <linux/kthread.h>
>> #include <asm/io.h>
>> #include <linux/sched.h>
>>
>>
>> struct task_struct *ts;
>>
>> int thread(void *data)
>> {
>> struct task_struct *TSK;
>> struct sched_param PARAM = {.sched_priority = MAX_RT_PRIO };
>> TSK = current;
>>
>> PARAM.sched_priority = 50;
>> sched_setscheduler(TSK, SCHED_FIFO, &PARAM); // <-- unknown symbol??
>>
>> while(1){
>> printk("Hi I am kernel thread!\n");
>> msleep(100);
>> if (kthread_should_stop())
>> break;
>> }
>> return 0;
>> }
>>
>>
>> int init_module(void)
>> {
>> printk(KERN_INFO "init_module() called\n");
>> ts=kthread_run(thread,NULL,"kthread");
>> return 0;
>> }
>>
>> void cleanup_module(void)
>> {
>> printk(KERN_INFO "cleanup_module() called\n");
>> kthread_stop(ts);
>> }
>> .
>>
>
> In kernel/sched.c
>
> EXPORT_SYMBOL_GPL(sched_setscheduler);
>
> If your driver is not GPL, you can't use it.
>
> Mark

I did it, it worked!!! thank you so much!!!!! :)
-- 
__________________________________________________________________________________

Mónica Puig-Pey González       E-mail: puigpeym@unican.es

Grupo de Computadores y Tiempo Real, Departamento de Electrónica y 
Computadores.
Facultad de Ciencias - Universidad de Cantabria
Av. de los Castros s/n. 39005 - Santander, España
__________________________________________________________________________________
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2011-06-10 10:11 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-04 11:48 One Interrupted Threads per Interrupt line? Monica Puig-Pey
2011-06-04 12:03 ` I/O operations priority in RTOS Monica Puig-Pey
2011-06-04 12:30   ` kernel threads in drivers using the RT patch Monica Puig-Pey
2011-06-06 11:47     ` Changing Kernel thread priorities Monica Puig-Pey
2011-06-06 11:54       ` Rolando Martins
2011-06-06 11:58         ` Monica Puig-Pey
2011-06-06 16:49           ` Mark Hounschell
2011-06-07  8:40             ` Monica Puig-Pey
2011-06-07  9:14               ` Mark Hounschell
2011-06-07  9:46                 ` Mark Hounschell
2011-06-07 18:34                   ` Monica Puig-Pey
2011-06-07 18:55                     ` Mark Hounschell
2011-06-10 10:12                       ` Monica Puig-Pey
2011-06-06 18:20       ` Armin Steinhoff
2011-06-04 23:42   ` I/O operations priority in RTOS Nicholas Mc Guire
2011-06-05  8:46     ` Armin Steinhoff
2011-06-05  9:25       ` Jan Kiszka
2011-06-05 22:39         ` Armin Steinhoff
2011-06-05 23:09           ` Jan Kiszka
2011-06-05  9:28       ` Nicholas Mc Guire
2011-06-05  9:44         ` Jan Kiszka
2011-06-05 22:29           ` Nicholas Mc Guire
2011-06-05 23:00             ` Jan Kiszka
2011-06-06  0:21               ` Nicholas Mc Guire
2011-06-06 20:35                 ` Jan Kiszka
2011-06-06  7:41           ` Armin Steinhoff
2011-06-06 20:48             ` Jan Kiszka
2011-06-05 22:32         ` Armin Steinhoff

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).