LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Slackware (https://www.linuxquestions.org/questions/slackware-14/)
-   -   Login hang when using custom kernel (https://www.linuxquestions.org/questions/slackware-14/login-hang-when-using-custom-kernel-4175715979/)

selfprogrammed 08-23-2022 02:09 AM

Login hang when using custom kernel
 
Am trying to install Slackware 15.0, with the 5.15.19 kernel.

The HUGE kernel can be booted, and the user can login.

Several custom kernels, with full features, but without some hardware drivers and without some file systems, have been built. They have Login stalls.
Every Login attempt hangs. Some time later some timeout occurs and the Login will finish.
There are no apparent other consequences directly related to the stall.

I have already gone over the CONFIG listings from HUGE and the custom kernels, and have not found anything that looks like it could be a cause. I have even tried enabling a few things in the kernel in an effort to diagnose this that way. The expected time to completion of diagnosing this with such an technique is daunting, and may not be finite. I should try to see if I can compile a HUGE kernel myself and if that is any different.

--- DBUS ---

From a DBUS diagnostic: at user login, a DBUS message is issued, that timeouts.
I do not know of a way to translate DBUS back to something useful, like an indication of which program to blame.
What I need is to know what kernel feature is needed, and it would be interesting to know if this is
DBUS, or some other low level daemon that is needing it.

Is there anybody who can read this DBUS trace, or just already knows this.

I have not figured out how to use the DBUS tools to test DBUS on the new system, as there are no good examples to work from. My attempts either error out immediately due to my syntax errors, or just sit there and run, and do not do anything. Not knowing any good source and destination names for testing has been hampering efforts.

Thank you for your attention so far. After this point there is just a listing.


In this listing:
- This is the output of dbus-monitor, while a Login attempt was made at another console.
- Certain private information has been changed.
- Some lines marked >>>> have been added to denote important places.
- I do understand that a message to a service named "org.freedesktop.login1" has failed, but I do not recognize that name, nor the naming format.
Probably it is a name that was registered in DBUS by some daemon.
But which one, and what is its problem.
- I have not found anything that seems relevant in dmesg or any system logs.
- Whatever is failing is apparently failing silently.
- Whatever is failing is apparently not necessary, as the Login eventually will finish.

Code:

bash-5.1# dbus-monitor --system
signal time=1660727522.814715 sender=org.freedesktop.DBus -> destination=:1.102 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
  string ":1.102"
signal time=1660727522.814812 sender=org.freedesktop.DBus -> destination=:1.102 serial=4 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
  string ":1.102"

>>>>> ATTEMPT LOGIN

method call time=1660727530.193006 sender=:1.103 -> destination=org.freedesktop.DBus serial=1 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=Hello
method return time=1660727530.193056 sender=org.freedesktop.DBus -> destination=:1.103 serial=1 reply_serial=1
  string ":1.103"
signal time=1660727530.193092 sender=org.freedesktop.DBus -> destination=(null destination) serial=68 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
  string ":1.103"
  string ""
  string ":1.103"
signal time=1660727530.193141 sender=org.freedesktop.DBus -> destination=:1.103 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
  string ":1.103"
method call time=1660727530.198206 sender=:1.104 -> destination=org.freedesktop.DBus serial=1 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=Hello
method return time=1660727530.198255 sender=org.freedesktop.DBus -> destination=:1.104 serial=1 reply_serial=1
  string ":1.104"
signal time=1660727530.198291 sender=org.freedesktop.DBus -> destination=(null destination) serial=69 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
  string ":1.104"
  string ""
  string ":1.104"
signal time=1660727530.198348 sender=org.freedesktop.DBus -> destination=:1.104 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
  string ":1.104"
method call time=1660727530.199899 sender=:1.104 -> destination=org.freedesktop.login1 serial=2 path=/org/freedesktop/login1; interface=org.freedesktop.login1.Manager; member=CreateSession
  uint32 777
  uint32 0
  string "login"
  string "tty"
  string "user"
  string ""
  string ""
  uint32 0
  string "tty2"
  string ""
  boolean false
  string ""
  string ""
  array [
  ]
signal time=1660727532.534499 sender=:1.0 -> destination=(null destination) serial=1100 path=/org/freedesktop/NetworkManager/AccessPoint/1; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
  string "org.freedesktop.NetworkManager.AccessPoint"
  array [
      dict entry(
        string "Strength"
        variant            byte 92
      )
  ]
  array [
  ]
signal time=1660727550.527449 sender=:1.0 -> destination=(null destination) serial=1101 path=/org/freedesktop/NetworkManager/AccessPoint/1; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
  string "org.freedesktop.NetworkManager.AccessPoint"
  array [
      dict entry(
        string "Strength"
        variant            byte 84
      )
  ]
  array [
  ]


>>>>> TIMEDOUT

error time=1660727555.204060 sender=org.freedesktop.DBus -> destination=:1.104 error_name=org.freedesktop.DBus.Error.TimedOut reply_serial=2
  string "Failed to activate service 'org.freedesktop.login1': timed out (service_start_timeout=25000ms)"
signal time=1660727555.205507 sender=org.freedesktop.DBus -> destination=:1.104 serial=5 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
  string ":1.104"
signal time=1660727555.205586 sender=org.freedesktop.DBus -> destination=(null destination) serial=70 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
  string ":1.104"
  string ":1.104"
  string ""
signal time=1660727555.825920 sender=:1.59 -> destination=(null destination) serial=189 path=/org/freedesktop/Accounts/User777; interface=org.freedesktop.Accounts.User; member=Changed
signal time=1660727555.828938 sender=:1.59 -> destination=(null destination) serial=190 path=/org/freedesktop/Accounts/User777; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
  string "org.freedesktop.Accounts.User"
  array [
      dict entry(
        string "LoginHistory"
        variant            array [
              struct {
                  int64 1655599378
                  int64 1655601468
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty6"
                    )
                  ]
              }
              struct {
                  int64 1655601603
                  int64 1655601641
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty6"
                    )
                  ]
              }
              struct {
                  int64 1655602050
                  int64 1655677684
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty6"
                    )
                  ]
              }
              struct {
                  int64 1655835784
                  int64 1655836719
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty8"
                    )
                  ]
              }
              struct {
                  int64 1655836915
                  int64 1655837081
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty8"
                    )
                  ]
              }
              struct {
                  int64 1655838230
                  int64 1655839518
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty8"
                    )
                  ]
              }
              struct {
                  int64 1656007261
                  int64 1656021997
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty8"
                    )
                  ]
              }
              struct {
                  int64 1659645604
                  int64 1659653937
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty8"
                    )
                  ]
              }
              struct {
                  int64 1659656668
                  int64 1659695296
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty8"
                    )
                  ]
              }
              struct {
                  int64 1659656839
                  int64 1659695274
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty7"
                    )
                  ]
              }
              struct {
                  int64 1659658811
                  int64 1659695280
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty1"
                    )
                  ]
              }
              struct {
                  int64 1659661018
                  int64 1659663573
                  array [
                    dict entry(
                        string "type"
                        variant                            string "pts/0"
                    )
                  ]
              }
              struct {
                  int64 1659666418
                  int64 1659669794
                  array [
                    dict entry(
                        string "type"
                        variant                            string "pts/0"
                    )
                  ]
              }
              struct {
                  int64 1659922372
                  int64 1659953021
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty7"
                    )
                  ]
              }
              struct {
                  int64 1659922409
                  int64 1659950819
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty8"
                    )
                  ]
              }
              struct {
                  int64 1659953234
                  int64 1659953478
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty4"
                    )
                  ]
              }
              struct {
                  int64 1659953357
                  int64 1659953478
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1659957982
                  int64 1659958599
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty1"
                    )
                  ]
              }
              struct {
                  int64 1659958033
                  int64 1659958908
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660001498
                  int64 1660006722
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty1"
                    )
                  ]
              }
              struct {
                  int64 1660006769
                  int64 1660022716
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty8"
                    )
                  ]
              }
              struct {
                  int64 1660006957
                  int64 1660016270
                  array [
                    dict entry(
                        string "type"
                        variant                            string "pts/0"
                    )
                  ]
              }
              struct {
                  int64 1660443748
                  int64 1660445181
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660446375
                  int64 1660446419
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660446466
                  int64 1660446507
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660648911
                  int64 1660650358
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty7"
                    )
                  ]
              }
              struct {
                  int64 1660698713
                  int64 1660702114
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty7"
                    )
                  ]
              }
              struct {
                  int64 1660698754
                  int64 1660702801
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty6"
                    )
                  ]
              }
              struct {
                  int64 1660701126
                  int64 1660702117
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660702918
                  int64 1660721515
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty7"
                    )
                  ]
              }
              struct {
                  int64 1660703093
                  int64 1660721523
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660707277
                  int64 1660721512
                  array [
                    dict entry(
                        string "type"
                        variant                            string "pts/0"
                    )
                  ]
              }
              struct {
                  int64 1660722100
                  int64 1660722205
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty1"
                    )
                  ]
              }
              struct {
                  int64 1660722145
                  int64 1660722170
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660722199
                  int64 1660722203
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660722338
                  int64 1660723089
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660723074
                  int64 0
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty7"
                    )
                  ]
              }
              struct {
                  int64 1660723969
                  int64 1660723976
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660724335
                  int64 1660724440
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660724501
                  int64 1660724563
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660724759
                  int64 1660725278
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty3"
                    )
                  ]
              }
              struct {
                  int64 1660725583
                  int64 1660725846
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660725887
                  int64 1660726612
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660726607
                  int64 1660726610
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty3"
                    )
                  ]
              }
              struct {
                  int64 1660726654
                  int64 1660727121
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
              struct {
                  int64 1660727555
                  int64 0
                  array [
                    dict entry(
                        string "type"
                        variant                            string "tty2"
                    )
                  ]
              }
            ]
      )
      dict entry(
        string "LoginTime"
        variant            int64 1660727555
      )
      dict entry(
        string "LoginFrequency"
        variant            uint64 46
      )
  ]
  array [
  ]
signal time=1660727556.079225 sender=:1.59 -> destination=(null destination) serial=191 path=/org/freedesktop/Accounts/User0; interface=org.freedesktop.Accounts.User; member=Changed
signal time=1660727556.079288 sender=:1.59 -> destination=(null destination) serial=192 path=/org/freedesktop/Accounts/User777; interface=org.freedesktop.Accounts.User; member=Changed
signal time=1660727556.079399 sender=:1.59 -> destination=(null destination) serial=193 path=/org/freedesktop/Accounts/User6661; interface=org.freedesktop.Accounts.User; member=Changed
signal time=1660727556.079431 sender=:1.59 -> destination=(null destination) serial=194 path=/org/freedesktop/Accounts/User6662; interface=org.freedesktop.Accounts.User; member=Changed
signal time=1660727556.079525 sender=:1.59 -> destination=(null destination) serial=195 path=/org/freedesktop/Accounts/User6663; interface=org.freedesktop.Accounts.User; member=Changed
signal time=1660727556.079551 sender=:1.59 -> destination=(null destination) serial=196 path=/org/freedesktop/Accounts/User6664; interface=org.freedesktop.Accounts.User; member=Changed
signal time=1660727556.532009 sender=:1.0 -> destination=(null destination) serial=1102 path=/org/freedesktop/NetworkManager/AccessPoint/1; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
  string "org.freedesktop.NetworkManager.AccessPoint"
  array [
      dict entry(
        string "Strength"
        variant            byte 88
      )
  ]
  array [
  ]
signal time=1660727562.532636 sender=:1.0 -> destination=(null destination) serial=1103 path=/org/freedesktop/NetworkManager/AccessPoint/1; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
  string "org.freedesktop.NetworkManager.AccessPoint"
  array [
      dict entry(
        string "Strength"
        variant            byte 92
      )
  ]
  array [
  ]


LuckyCyborg 08-23-2022 02:31 AM

Quote:

Originally Posted by selfprogrammed (Post 6375564)
- I do understand that a message to a service named "org.freedesktop.login1" has failed, but I do not recognize that name, nor the naming format.
Probably it is a name that was registered in DBUS by some daemon.
But which one, and what is its problem.

This one is the elogind daemon, which handles (also) the user sessions.

Probably your "custom" kernel has disabled some features required by elogind.

How about to start with some stock .config of generic or huge kernels from Slackware?

selfprogrammed 09-16-2022 09:59 AM

Thank you.
No sign of elogin

Has agetty.
Runs "login" when logging in.
The "login" process is stalled, and DBUS reports that it does not answer.
The problem could be with "login".
After a long delay, the login does finish.


There is a DBUS test-tool, but I am not even close to figuring out how to test DBUS with it.
It seems to be for testing other program's DBUS interface.


I have already tried 4 times to fix this by expanding the options included in the kernel config.
I have run out of options that seem to remotely relevant.

I have recompiled the large kernel using its original config, just to confirm
it is not the compiler. The recompiled large kernel works and I can login.

Next is to try compiling a custom kernel for some generic CPU, just to ensure that there is not a compiler bug for my specific CPU.
This kind of testing is going to go on forever, there are just too many kernel options to test.


What would be helpful is to know what is necessary in the kernel options to have DBUS and login working.
Does anyone have an example small minimal config where login and DBUS works. At least I could compare it what I am trying.

Emerson 09-16-2022 10:09 AM

Gentoo kernel config has custom patch which allows choosing OpenRC or systemd. It does nothing by itself, just manages a set of options for user. Maybe you should get Gentoo sources and see what options it turns on when you choose OpenRC.

I can post my Gentoo .config if you wish.

Emerson 09-16-2022 11:44 AM

BTW, I think you are barking up the wrong tree. DBUS is not required to run a Linux system. However, if you use dynamic devices with udev or similar then you probably must have tmpfs mounted during boot for /dev.

Loomx 09-16-2022 03:12 PM

Quote:

Originally Posted by selfprogrammed (Post 6380618)
Next is to try compiling a custom kernel for some generic CPU, just to ensure that there is not a compiler bug for my specific CPU.
This kind of testing is going to go on forever, there are just too many kernel options to test.

I would start with the Slackware generic kernel config; the only thing you should need to change is to add your filesystem support (e.g. ext4). Or you could just use it as-is and make an initrd.
This is the kernel that is recommended for everyday use, and it's already pretty slimmed down.

You can download the .config file here:
64-bit: https://mirrors.slackware.com/slackw...ic-5.15.19.x64
32-bit: https://mirrors.slackware.com/slackw...mp-5.15.19-smp

Quote:

Originally Posted by selfprogrammed (Post 6380618)
No sign of elogin

What do you mean by this?
If you have installed 15.0 then you have elogind.

Aeterna 09-17-2022 07:47 AM

re-enabling options in the kernel config will not work in some circumstances: e.g. if there is a dependency. In such case enabling first option will not enable second.

Because default kernel works, you will have to disregard your current custom kernel and start fresh. Your problems with dbus and elgind may suggest that somehow you messed up IPC (SysvIPC)?

Disabling hardware options does nothing to dbus (my config is pure Intel, no AMD), I have only ext4 enabled and fat32. None of this has effect on login. As someone mentioned, if you have quite current config from other distros, you can re-use it (accept changes). I had single config working in Gentoo, Slackware, Artix and Venom.

selfprogrammed 09-17-2022 04:56 PM

I have spotted the process elogind in the listing of "ps -A".
Previous listings were much longer, and it may have been off the page.
I was trying to use htop, and was sorting to get latest processes at the top.

I do not know about the relevance. It may be the target of the DBUS message to login1, I cannot tell.
Is there a way to ask DBUS who owns a message address name?

DBUS has a host of support utilities, but they are like figuring out a swiss-army-knife in the dark with gloves on.
You know it probably can do wonderful things if you can get it open, but you also know it can cut you
if you do it wrong. I am having enough of an learning experience already without adding triage on a wounded DBUS.

Anyway, the latest compile of the custom kernel made login work again.
I do not know why because I enabled about 20 more kernel options.
Some were things like switching from SLOB to SLUB, which I don't know why that got selected.
When I got to the library and crypto section, I made everything that was not selected into modules.

Supposedly .. and I know supposing anything will lead to problems like this, but the kernel
instructions lead me to believe this ... that those library and crypto options are ONLY for
kernel modules, and external programs cannot access them. When the kernel needs one, the make
procedure will enable it as a requirement. The only reason for having these user options is if there
is an external module that might need one or more of the support functions. At least that is
what the kernel instructions lead me to believe.

1. Normally the login sequence is so fast I cannot even see what processes were running.
I cannot even switch consoles fast enough.
But when it was hanging, there was a login process hanging too.

2. There are several candidates for who was actually the cause of the hanging.
login - because of the above
elogind - because it may the target of the login1 message
gnome-keyring - because it gets started for every user at around the same time

3. Any one of those could be using a crypto function.
How they are accessing a kernel crypto function is a mystery. There was no hints
that they were exposed as system calls.

4. One of those could be invoking some kernel operation that needed a crypto function that was missing.
In this case, there is a bug in the kernel config checking, as any such requirement should of enabled
the inclusion of the needed crypto function automatically. If this is the case, it would need to be fixed.

For the above mysteries, I am NOT closing this as solved.
Other users can fall into this trap, whatever it is, and therefore I still have an interest
in determining a better answer than I have now.

I will post more information here, if I figure out anything more.
Any information on this login sequence, and what kernel options it requires, would help, and would be appreciated.

selfprogrammed 09-17-2022 05:04 PM

I did look at /proc/modules, to see what module was being used that was not there before.
I have not spotted anything new, which just deepens the mystery.

This invites the reasoning that whatever kernel option change made the difference
it was not one that makes a module.
I shall be looking over that modules list 2 or 3 more times, and much more carefully.
I am having trouble believing that reasoning.

selfprogrammed 09-17-2022 05:14 PM

The problem was that login would hang.
The biggest red flag was that DBUS had an outstanding message to login1, and when DBUS finally timed out,
the login would complete.
The hang was due to a DBUS message not getting a response, and the sender was hung until DBUS timed out and returned some error response.
That message must not have been necessary for login to proceed, because the login did finally complete even after the time out.
I have not determined why the target process did not respond to the message.
It is soley due to the kernel, as all tests are performed on the same installation with only a different kernel selected by LILO.
The huge kernel would succeed, but is carrying around junk and produces junk messages in dmesg.
( junk = stuff that I do not use and would never use, like RAID, hotplug, and lots of old ISA cards )

rogan 09-19-2022 01:13 PM

Maybe related:
With elogind came a dependency on cgroups.
You dont actually have to enable any of them but
you need the option enabled.
If not you get a hang/stall on login.

selfprogrammed 09-20-2022 07:11 PM

Verified.

elogind requires Kernel option: CONFIG_CGROUPS

I also enabled CGROUP CPU, just to have it do something.

In the menuconfig this is marked "When in doubt, N"
which is likely to catch more victims.
Most everybody is going to need to login.

This kernel option is NEW, which makes it difficult to understand why elogind would make it a requirement already.

I doubt anyone is going to fix anything, regardless of who I notify, so this thread is likely the
only rescue for other people who fall victim to this "gotcha".
I have tried before to get a single line of warning included, and I only got weeks of frustration.

It would help the most if the kernel menuconfig would include the line

"Required by elogind, which many distributions are using".

As the distributions that are using elogind are not going to be modifying the kernel configs
with customized warnings, there is very little that they can do.
A distribution could put into their kernel source package, a file with the CONFIG settings that they know are required
for the standard packages and demons that they use in their distribution.

selfprogrammed 09-20-2022 07:14 PM

Thank you for your attention.
Thank you to rogan for a timely answer. I have no idea how rogan knew that.

selfprogrammed 09-20-2022 07:33 PM

Thank you for your attention.
Thank you to rogan for a timely answer. I have no idea how rogan knew that.

rogan 09-20-2022 10:19 PM

Glad it helped :)
I think found out about it here on LQ after having issues like yours
sometime during 15.0 development cycle.


All times are GMT -5. The time now is 12:17 PM.